我在Arm组装中学习子程序,我和一个例子混淆了。对于"身体"它之前不需要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
答案 0 :(得分:3)
'subs'指令设置标志,'bne'在这些标志上分支。基本上,它将r1与0进行比较并且如果它不等于0则进行分支。比较实际上是作为减法运算执行的 - 这就是比较CPU中2个数字的方式。较旧的CPU甚至没有比较操作码,而且许多确实只是减法的同义词(标志集可能存在细微差别,而且为了清楚起见,如果存在比较操作码,则应使用比较操作码。)