Atividade obrigatória 05
Macro para emular a instrução bfi

Atualizado em 08/out/2015

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, 24
Você 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.
Sugestão: (i) Teste inicialmente o seu programa com uma macro que usa a instrução bfi vista em aula.
(ii) Para eliminar o uso das instruções bfc e bfi construa uma máscara onde os nbits a partir do bit sbit são 0 e os outros 1; Exemplo: |11111111111111111111000000001111|. O seu uso deve ser óbvio.
Desafio: a macro pode ser escrita com apenas 12 instruções.
O seu programa deve exibir no vídeo:
aabbccdd
aabbcc33
aabbc33d
aabb33dd
aab33cdd
aa33ccdd
a33bccdd
33bbccdd