Estoy aprendiendo subrutinas en el ensamblaje del brazo y estoy confundido con un ejemplo. Para "bne Body" no necesita un cmp x, y antes? ¿Qué está comparando?¿Cómo puede funcionar una bne branch sin una comparación cmp previa en el ensamble de ARM?
@ 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
Ok gracias. ¿Hay alguna otra instrucción que establezca los indicadores (por ejemplo, agregar) que debo tener en cuenta? –
Sí, hay muchos de ellos. La mayoría de las instrucciones que realizan operaciones de ALU (matemática o lógica) pueden establecer indicadores bajo ciertas condiciones. Las instrucciones que simplemente mueven datos o ramifican el flujo del programa generalmente no lo hacen. Para estar seguro, y para saber qué banderas se pueden establecer en qué condiciones, realmente necesita ver los documentos para las instrucciones. –
Observe la segunda 's' en la instrucción "subs", indica que las banderas se establecen según su resultado (por ejemplo, la instrucción "sub" no establece indicadores). – starblue