7. Instruções de ramificação#
Estas fazem com que a execução salte para um local de destino normalmente especificado por uma etiqueta (ver a diretiva assembladora label()). As ramificações condicionais e as instruções it e ite testam os flags N (negativo), Z (zero), C (transporte) e V (overflow) do Registo de Estado do Programa de Aplicação (APSR) para determinar se a ramificação deve ser executada.
A maioria das instruções assembladoras expostas (incluindo operações de movimentação) define os flags, mas existem instruções de comparação explícitas para permitir testar valores.
Mais detalhes sobre o significado dos flags de condição são fornecidos na secção instruções de comparação.
7.1. Convenções do documento#
Notação: Rm denota registos ARM R0-R15. LABEL denota uma etiqueta definida com a diretiva assembladora label(). <condition> indica um dos seguintes especificadores de condição:
eq Igual a (resultado foi zero)
ne Não igual
cs Transporte definido
cc Transporte limpo
mi Menos (negativo)
pl Mais (positivo)
vs Overflow definido
vc Overflow limpo
hi > (comparação sem sinal)
ls <= (comparação sem sinal)
ge >= (comparação com sinal)
lt < (comparação com sinal)
gt > (comparação com sinal)
le <= (comparação com sinal)
7.2. Ramificar para etiqueta#
b(LABEL) Ramificação incondicional
beq(LABEL) ramificar se igual
bne(LABEL) ramificar se não igual
bge(LABEL) ramificar se maior ou igual
bgt(LABEL) ramificar se maior que
blt(LABEL) ramificar se menor que (<) (com sinal)
ble(LABEL) ramificar se menor ou igual a (<=) (com sinal)
bcs(LABEL) ramificar se o flag de transporte estiver definido
bcc(LABEL) ramificar se o flag de transporte estiver limpo
bmi(LABEL) ramificar se negativo
bpl(LABEL) ramificar se positivo
bvs(LABEL) ramificar se o flag de overflow estiver definido
bvc(LABEL) ramificar se o flag de overflow estiver limpo
bhi(LABEL) ramificar se maior (sem sinal)
bls(LABEL) ramificar se menor ou igual (sem sinal)
7.3. Ramificações longas#
O código produzido pelas instruções de ramificação listadas acima utiliza uma largura de bits fixa para especificar o destino da ramificação, que é relativo ao PC. Consequentemente, em programas longos onde a instrução de ramificação está distante do seu destino, o assemblador produzirá um erro «branch not in range». Isto pode ser ultrapassado com as variantes «wide» (largas) como
beq_w(LABEL) ramificação longa se igual
As ramificações largas utilizam 4 bytes para codificar a instrução (em comparação com 2 bytes para as instruções de ramificação normais).
7.4. Subrotinas (funções)#
Ao entrar numa subrotina, o processador armazena o endereço de retorno no registo r14, também conhecido como registo de ligação (lr). O retorno para a instrução após a chamada de subrotina é realizado através da atualização do contador de programa (r15 ou pc) a partir do registo de ligação. Este processo é tratado pelas seguintes instruções.
bl(LABEL)
Transfere a execução para a instrução após LABEL, armazenando o endereço de retorno no registo de ligação (r14).
bx(Rm) Ramifica para o endereço especificado por Rm.
Tipicamente, bx(lr) é emitido para retornar de uma subrotina. Para subrotinas encadeadas, o registo de ligação dos âmbitos exteriores deve ser guardado (normalmente na pilha) antes de realizar chamadas a subrotinas internas.