Para a primeira parte:
Which of these ARM instructions clears register r5, so that all of its bits are set to ’0’?
Todos eles!
and r5, r5, #0
Esse é o equivalente de r5 = r5 & 0
, AND de todos os bits com zero irá limpar o registro.
eor r5, r5, r5
Isso é r5 = r5 ^ r5
, a operação "exclusiva OR". XORing com ele mesmo também resulta em zero, pois 1 ^ 1
é 0
também.
lsr r5, #32
Como você mencionou, deslocar todos os 32 bits irá zerar todos eles. A especificação ARM até diz para o LSR:
if the shift is 32, Rd is cleared, and the last bit shifted out remains in the C flag
sub r5, r5, r5
Mais uma vez, r5 = r5 - r5
será zerado.
O código da segunda parte está fazendo isso (no código C):
int r0 = 12;
int r1 = 1;
while (r0 > 0)
r1 *= r0--;
Então, no final do loop, r1 terá o produto dos números 12, 11, 10 ... abaixo para 1. Em outras palavras, isso é calcular o fatorial de r0 e armazená-lo em r1. / p>
A instrução cmp
é simplesmente comparar r0 com a constante 0 e definir os sinalizadores, para que o ble
(ramificação se menor ou igual) possa atuar sobre ela. A instrução cmp
não modifica seus operandos. Ambas as instruções juntas podem ser lidas como:
if (r0 <= 0)
goto end;