Интерпретация основных инструкций ARM - PullRequest
0 голосов
/ 23 ноября 2018

У меня было задано несколько вопросов, один из них:

Какая из этих инструкций ARM очищает регистр r5, так что все его биты установлены в '0'?

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

Насколько я понимаю, sub r5, r5, r5 очищает регистр, поскольку он вычитает число из себя.and и eor явно выглядят неправильно.

lsr r5, #32 также очищает регистр?Он сдвигает регистр r5 на 32 бита, верно?Таким образом, для этой инструкции имеет смысл также очистить регистр.


В связи с этим мне также нужно интерпретировать этот код:

Что такоесвязь между содержимым регистра r0 и регистра r1 при выполнении следующей последовательности инструкций ARM?

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

Я не совсем уверен, что делает cmp r0, #0 и изменяет ли оно значениеr0 в конце.Я знаю, что он сравнивает значение.

Итак, насколько я понимаю, после запуска этого кода, mul r1, r0, r1 означает, что r1 установлено равным 12 как 1 * 12 = 12 (если cmp r0, #0 не влияет на значение r0, которое я не знаю).

Итак, r1 установлен на 12 - 1 = 11.

Может кто-нибудь уточнить, если я получил правильныйзначения для r0 (12) и r1 (11) после запуска этого кода, и что именно cmp r0, #0 и ble end делает здесь и как это влияет на регистр r0, если вообще?

1 Ответ

0 голосов
/ 23 ноября 2018

Для первой части:

Какая из этих инструкций ARM очищает регистр r5, так что все его биты установлены в «0»?

Всеих!

and r5, r5, #0

Это эквивалент r5 = r5 & 0, И если все биты с нулем очистят регистр.

eor r5, r5, r5

Это r5 = r5 ^ r5, операция «исключающее ИЛИ»,XOR с самим собой также приводит к нулю, поскольку 1 ^ 1 - это тоже 0.

lsr r5, #32

Как вы упомянули, сдвиг всех 32 битов вправо обнулит их все.Спецификация ARM даже говорит для LSR:

, если сдвиг равен 32, Rd очищается, а последний сдвинутый бит остается в флаге C

sub r5, r5, r5

Опять же, r5 = r5 - r5 обнулит его.


Код из второй части делает это (в коде C):

int r0 = 12;
int r1 = 1;
while (r0 > 0)
    r1 *= r0--;

Итакв конце цикла r1 будет иметь произведение чисел 12, 11, 10 ... на 1. Другими словами, это вычисление факториала r0 и его сохранение в r1.

Инструкция cmp просто сравнивает r0 с константой 0 и устанавливает флаги, так что ble (ветвь, если меньше или равно), может воздействовать на нее.Инструкция cmp не изменяет свои операнды.Обе инструкции вместе можно читать как:

if (r0 <= 0)
    goto end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...