Interpretando as instruções básicas do ARM

1

Eu tenho algumas perguntas, uma delas é:

Which of these ARM instructions clears register r5, so that all of it's bits are set to ’0’?

and r5, r5, #0
eor r5, r5, r5
lsr r5, #32
sub r5, r5, r5

Pelo que entendi, sub r5, r5, r5 limpa o registrador ao subtrair o número de si mesmo. Os and e eor claramente parecem errados.

O lsr r5, #32 também limpa o registro? Ele desloca o registrador r5 em 32 bits, certo? Então, faz sentido que a instrução limpe o registro também.

Relacionado a isso, também preciso interpretar este código:

What is the relationship between the contents of register r0 and register r1 when the following sequence of ARM instructions is executed?

    mov r0, #12
    mov r1, #1
start:
    cmp r0, #0
    ble end
    mul r1, r0, r1
    sub r0, r0, #1
    b start
end:

Não tenho certeza absoluta do que o cmp r0, #0 faz e se altera o valor de r0 no final. Eu sei que compara o valor.

Então, pelo que entendi, depois que esse código é executado, mul r1, r0, r1 significa que r1 é definido como igual a 12 como 1 * 12 = 12 (se o cmp r0, # 0 não afeta o valor de r0, que Eu não sei).

Então, r1 é definido como 12 - 1 = 11.

Alguém pode esclarecer se eu tenho os valores corretos para r0 (12) e r1 (11) depois que este código é executado, e o que exatamente cmp r0, #0 e ble end faz aqui e como isso afeta o registro r0, se em tudo?

    
por Mandingo 23.11.2018 / 07:07

1 resposta

1

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;
    
por 23.11.2018 / 07:31