6. Instruções de comparação

Estas realizam uma instrução aritmética ou lógica sobre dois argumentos, descartando o resultado mas definindo os sinalizadores de condição. Tipicamente são usadas para testar valores de dados sem os alterar antes de executar um salto condicional.

6.1. Convenções do documento

Notação: Rd, Rm, Rn denotam registos ARM R0-R7. imm8 denota um valor imediato com uma 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 salto condicional. Tipicamente, um salto condicional irá testar múltiplos bits, por exemplo bge(LABEL). O significado dos códigos de condição pode depender de se os operandos de uma instrução aritmética são vistos como inteiros com ou sem sinal. Assim, bhi(LABEL) assume que foram processados números sem sinal, enquanto bgt(LABEL) assume operandos com sinal.

6.3. Bits do APSR

  • Z (zero)

É definido se o resultado de uma operação é zero ou se os operandos de uma comparação são iguais.

  • N (negativo)

É definido se o resultado é negativo.

  • C (transporte)

Uma adição define o sinalizador de transporte quando o resultado transborda para além do MSB, por exemplo ao adicionar 0x80000000 e 0x80000000. Pela natureza da aritmética de complemento para dois, este comportamento é invertido na subtração, com um empréstimo indicado pelo bit de transporte estar limpo. Assim, 0x10 - 0x01 é executado como 0x10 + 0xffffffff, o que irá definir o bit de transporte.

  • V (overflow)

O sinalizador de overflow é definido se o resultado, visto como um número em complemento para dois, tem o sinal «errado» em relação aos operandos. Por exemplo, adicionar 1 a 0x7fffffff irá definir o bit de overflow porque o resultado (0x80000000), visto como um inteiro em complemento para dois, é negativo. Note que neste caso o bit de transporte não é definido.

6.4. Instruções de comparação

Estes definem os sinalizadores N (negativo), Z (zero), C (transporte) e V (overflow) do APSR (Application Program Status Register).

  • cmp(Rn, imm8) Rn - imm8

  • cmp(Rn, Rm) Rn - Rm

  • cmn(Rn, Rm) Rn + Rm

  • tst(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 necessidade de uma etiqueta.

  • it(<condition>) Se então

Execute 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>) Se então senão

Se <condition> for verdadeira, execute a próxima instrução; caso contrário, execute 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.