6. Instrucciones de comparación¶
Estas realizan una instrucción aritmética o lógica sobre dos argumentos, descartando el resultado pero estableciendo los indicadores de condición. Normalmente se usan para probar valores de datos sin modificarlos antes de ejecutar una bifurcación condicional.
6.1. Convenciones del documento¶
Notación: Rd, Rm, Rn denotan los registros ARM R0-R7. imm8 denota un valor inmediato con una anchura de 8 bits.
6.2. El Registro de Estado del Programa de Aplicación (APSR)¶
Este contiene cuatro bits que son probados por las instrucciones de bifurcación condicional. Normalmente una bifurcación condicional probará varios bits, por ejemplo bge(LABEL). El significado de los códigos de condición puede depender de si los operandos de una instrucción aritmética se consideran enteros con signo o sin signo. Así, bhi(LABEL) asume que se procesaron números sin signo, mientras que bgt(LABEL) asume operandos con signo.
6.3. Bits del APSR¶
Z (cero)
Se establece si el resultado de una operación es cero o si los operandos de una comparación son iguales.
N (negativo)
Se establece si el resultado es negativo.
C (acarreo)
Una suma establece el indicador de acarreo cuando el resultado se desborda más allá del bit más significativo (MSB), por ejemplo al sumar 0x80000000 y 0x80000000. Por la naturaleza de la aritmética en complemento a dos, este comportamiento se invierte en la resta, indicándose un préstamo cuando el bit de acarreo está a cero. Así, 0x10 - 0x01 se ejecuta como 0x10 + 0xffffffff, lo que establecerá el bit de acarreo.
V (desbordamiento)
El indicador de desbordamiento se establece si el resultado, visto como un número en complemento a dos, tiene el signo «equivocado» en relación con los operandos. Por ejemplo, sumar 1 a 0x7fffffff establecerá el bit de desbordamiento porque el resultado (0x80000000), visto como un entero en complemento a dos, es negativo. Ten en cuenta que en este caso el bit de acarreo no se establece.
6.4. Instrucciones de comparación¶
Estas establecen los indicadores N (negativo), Z (cero), C (acarreo) y V (desbordamiento) del APSR (Registro de Estado del Programa de Aplicación).
cmp(Rn, imm8)
Rn - imm8cmp(Rn, Rm)
Rn - Rmcmn(Rn, Rm)
Rn + Rmtst(Rn, Rm)
Rn & Rm
6.5. Ejecución condicional¶
Las instrucciones it e ite proporcionan un medio para ejecutar condicionalmente de una a cuatro instrucciones posteriores sin necesidad de una etiqueta.
it(<condition>) If then (si entonces)
Ejecuta la siguiente instrucción si <condition> es verdadera:
cmp(r0, r1)
it(eq)
mov(r0, 100) # runs if r0 == r1
# execution continues here
ite(<condition>) If then else (si entonces si no)
Si <condition> es verdadera, ejecuta la siguiente instrucción; de lo contrario, ejecuta la subsiguiente. Así:
cmp(r0, r1)
ite(eq)
mov(r0, 100) # runs if r0 == r1
mov(r0, 200) # runs if r0 != r1
# execution continues here
Esto puede ampliarse para controlar la ejecución de hasta cuatro instrucciones posteriores: it[x[y[z]]] donde x,y,z=t/e; p. ej. itt, itee, itete, ittte, itttt, iteee, etc.