Suponha que as instruções bfi e bfc estejam "quebradas" (isto é, inoperantes).
Escreva uma macro bfi para emular o mesmo efeito da instrução bfi,
com o objetivo de inserir um "campo"
de bits numa palavra na RAM, sem alterar os outros bits da palavra
(este tipo de operação é comum ao se fazer entrada/saída nos processadores ARM
cujos registradores de E/S são mapeados em endereços de memória).
Especificação da macro:
.macro bfi addr, field, sbit, nbits
parâmetros:
addr= endereço de uma palavra de 32 bits na memória RAM
field= registrador (< r8) contendo o campo a ser inserido em word
sbit= constante com o número inicial do bit (0-31)
nbits= constante com o tamanho do campo a ser inserido (1..31)
Exemplo de invocação da macro:
bfi myword, field, 4, 8
onde myword foi definida no segmento de dados como a seguir:
.data .align myword: .word 0xaabbccdd e r4 foi inicializado para conter field com o valor 0x9abcdf33 (observe que apenas os nbits menos significativos de r4 devem ser usados)Via diretiva .equ defina as constantes:
.equ s0, 0 .equ s4, 4 .equ s8, 8 .equ s12, 12 .equ s16, 16 .equ s20, 20 .equ s24, 24Você deve invocar a macro 7 vezes usando as constantes acima para o bit inicial, mantendo inalterados os outros parâmetros e após cada invocação exibir no vídeo via printf o valor da palavra com o formato "%08x\n" (antes da 1a invocação exiba no vídeo a palavra inicial; ela deve ser restaurada ao seu valor inicial antes de cada invocação da macro - escreva uma subrotina pra este fim). A 1a invocação deve ser: bfi word, field, S0, 8 e a última bfi word, field, S24, 8.
aabbccdd aabbcc33 aabbc33d aabb33dd aab33cdd aa33ccdd a33bccdd 33bbccdd