6. Instruções de comparação¶
Estas realizam uma instrução aritmética ou lógica sobre dois argumentos, descartando o resultado mas definindo as flags de condição. Normalmente são usadas para testar valores de dados sem alterá-los antes de executar um desvio condicional.
6.1. Convenções do documento¶
Notação: Rd, Rm, Rn denotam os registradores ARM R0-R7. imm8 denota um valor imediato com largura de 8 bits.
6.2. O Application Program Status Register (APSR)¶
Este contém quatro bits que são testados pelas instruções de desvio condicional. Normalmente um desvio condicional testa múltiplos bits, por exemplo bge(LABEL). O significado dos códigos de condição pode depender de os operandos de uma instrução aritmética serem vistos como inteiros com sinal ou sem sinal. Assim, bhi(LABEL) pressupõe que números sem sinal foram processados, enquanto bgt(LABEL) pressupõe operandos com sinal.
6.3. Bits do APSR¶
Z (zero)
Este é definido se o resultado de uma operação for zero ou se os operandos de uma comparação forem iguais.
N (negativo)
Definido se o resultado for negativo.
C (carry)
Uma adição define a flag de carry quando o resultado transborda para fora do MSB, por exemplo somando 0x80000000 e 0x80000000. Pela natureza da aritmética de complemento de dois, esse comportamento é invertido na subtração, com um empréstimo (borrow) indicado pelo bit de carry estar limpo. Assim, 0x10 - 0x01 é executado como 0x10 + 0xffffffff, o que definirá o bit de carry.
V (overflow)
A flag de overflow é definida se o resultado, visto como um número em complemento de dois, tiver o sinal “errado” em relação aos operandos. Por exemplo, somar 1 a 0x7fffffff definirá o bit de overflow porque o resultado (0x80000000), visto como um inteiro em complemento de dois, é negativo. Observe que, neste caso, o bit de carry não é definido.
6.4. Instruções de comparação¶
Estas definem as flags N (negativo), Z (zero), C (carry) e V (overflow) do APSR (Application Program Status Register).
cmp(Rn, imm8)
Rn - imm8cmp(Rn, Rm)
Rn - Rmcmn(Rn, Rm)
Rn + Rmtst(Rn, Rm)
Rn & Rm
6.5. Execução condicional¶
As instruções it e ite fornecem um meio de executar condicionalmente de uma a quatro instruções subsequentes sem a necessidade de um rótulo.
it(<condition>) If then
Executa a próxima instrução se <condition> for verdadeira:
cmp(r0, r1)
it(eq)
mov(r0, 100) # runs if r0 == r1
# execution continues here
ite(<condition>) If then else
Se <condition> for verdadeira, executa a próxima instrução, caso contrário executa a seguinte. Assim:
cmp(r0, r1)
ite(eq)
mov(r0, 100) # runs if r0 == r1
mov(r0, 200) # runs if r0 != r1
# execution continues here
Isto pode ser estendido para controlar a execução de até quatro instruções subsequentes: it[x[y[z]]] onde x,y,z=t/e; por exemplo, itt, itee, itete, ittte, itttt, iteee, etc.