2011-10-24 7 views
5

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 

Respuesta

3

La instrucción 'subs' establece flags, y 'bne' se bifurca en esas banderas. Básicamente, está comparando r1 a 0 y bifurcando si no es igual a 0. Una comparación se realiza en realidad como una operación de sustracción: así es como se comparan 2 números en una CPU. Las CPUs antiguas ni siquiera tenían códigos de operación de comparación, y muchas de las que lo hacen son solo sinónimos de resta (puede haber pequeñas diferencias en el conjunto de banderas, y también para claridad debe usar un código de operación de comparación si existe).

+0

Ok gracias. ¿Hay alguna otra instrucción que establezca los indicadores (por ejemplo, agregar) que debo tener en cuenta? –

+0

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. –

+0

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

Cuestiones relacionadas