Как ветка bne может работать без сравнения cmp в ARM sssembly? - PullRequest
5 голосов
/ 24 октября 2011

Я изучаю подпрограммы в сборке руки, и я запутался с примером. Для "bne Body" не нужен ли перед ним cmp x, y? Что это сравнивает?

@ Sum of the first "MAX" Fibonacci with subroutine
.text
.global _start
.equ MAX,10
_start: mov r1,#MAX
bl Fib 
exit: swi 0x11 @ Terminate the program
@Subroutine to compute sum of n Fibonacci numbers
Fib: sub r1,r1,#2 @ Counter - 2
mov r2,#1
mov r3,#2
mov r0,#3
Body: add r4,r2,r3
add r0,r0,r4 @ Update Sum
mov r2,r3
mov r3,r4
Decr: subs r1,r1,#
bne Body @ If Count != 0, repeat loop
Done: mov pc,lr @ Return from subroutine

1 Ответ

3 голосов
/ 24 октября 2011

Команда 'subs' устанавливает флаги, и 'bne' разветвляется на эти флаги. По сути, он сравнивает r1 с 0 и разветвление, если оно не равно 0. Сравнение фактически выполняется как операция вычитания - так вы сравниваете 2 числа в ЦП. В старых процессорах даже не было кодов сравнения, и многие из них на самом деле являются просто синонимами для вычитания (могут быть незначительные различия в наборе флагов, а также для ясности следует использовать код операции сравнения, если таковой существует).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...