7. Instrucciones de bifurcación¶
Estas hacen que la ejecución salte a una ubicación de destino normalmente especificada por una etiqueta (consulte la directiva del ensamblador label()). Las bifurcaciones condicionales y las instrucciones it e ite comprueban las banderas N (negativo), Z (cero), C (acarreo) y V (desbordamiento) del registro de estado del programa de aplicación (APSR) para determinar si la bifurcación debe ejecutarse.
La mayoría de las instrucciones del ensamblador expuestas (incluidas las operaciones de movimiento) establecen las banderas, pero existen instrucciones de comparación explícitas para permitir que los valores sean evaluados.
Se proporcionan más detalles sobre el significado de las banderas de condición en la sección de instrucciones de comparación.
7.1. Convenciones del documento¶
Notación: Rm denota los registros ARM R0-R15. LABEL denota una etiqueta definida con la directiva del ensamblador label(). <condition> indica uno de los siguientes especificadores de condición:
eq Igual a (el resultado fue cero)
ne No igual
cs Acarreo activado
cc Acarreo desactivado
mi Menos (negativo)
pl Más (positivo)
vs Desbordamiento activado
vc Desbordamiento desactivado
hi > (comparación sin signo)
ls <= (comparación sin signo)
ge >= (comparación con signo)
lt < (comparación con signo)
gt > (comparación con signo)
le <= (comparación con signo)
7.2. Bifurcar a etiqueta¶
b(LABEL) Bifurcación incondicional
beq(LABEL) bifurca si es igual
bne(LABEL) bifurca si no es igual
bge(LABEL) bifurca si es mayor o igual que
bgt(LABEL) bifurca si es mayor que
blt(LABEL) bifurca si es menor que (<) (con signo)
ble(LABEL) bifurca si es menor o igual que (<=) (con signo)
bcs(LABEL) bifurca si la bandera de acarreo está activada
bcc(LABEL) bifurca si la bandera de acarreo está desactivada
bmi(LABEL) bifurca si es negativo
bpl(LABEL) bifurca si es positivo
bvs(LABEL) bifurca si la bandera de desbordamiento está activada
bvc(LABEL) bifurca si la bandera de desbordamiento está desactivada
bhi(LABEL) bifurca si es mayor (sin signo)
bls(LABEL) bifurca si es menor o igual (sin signo)
7.3. Bifurcaciones largas¶
El código producido por las instrucciones de bifurcación enumeradas anteriormente usa un ancho de bits fijo para especificar el destino de la bifurcación, que es relativo al PC. En consecuencia, en programas largos donde la instrucción de bifurcación está alejada de su destino, el ensamblador producirá un error de «branch not in range». Esto puede superarse con las variantes «anchas» tales como
beq_w(LABEL) bifurcación larga si es igual
Las bifurcaciones anchas usan 4 bytes para codificar la instrucción (en comparación con los 2 bytes de las instrucciones de bifurcación estándar).
7.4. Subrutinas (funciones)¶
Al entrar en una subrutina, el procesador almacena la dirección de retorno en el registro r14, también conocido como registro de enlace (lr). El retorno a la instrucción posterior a la llamada de la subrutina se realiza actualizando el contador de programa (r15 o pc) a partir del registro de enlace. Este proceso lo gestionan las siguientes instrucciones.
bl(LABEL)
Transfiere la ejecución a la instrucción posterior a LABEL almacenando la dirección de retorno en el registro de enlace (r14).
bx(Rm) Bifurca a la dirección especificada por Rm.
Normalmente se emite bx(lr) para regresar de una subrutina. Para subrutinas anidadas, el registro de enlace de los ámbitos externos debe guardarse (normalmente en la pila) antes de realizar las llamadas a subrutinas internas.