Clique sobre os objetivos listados abaixo para navegar até o conteúdo desejado.

  1. Instruções de Controle de Fluxo
  2. Instrução B
  3. Instrução BL
  4. Instrução BX (v4T+)
  5. Diagramas: B, BL e BX

As instruções de controle de fluxo são utilizadas para desviar o fluxo de execução de um programa alterando o conteúdo dos registradores PC(R15) e LR(R14).

Esse tipo de instrução é utilizada em conjunto com instruções de comparação para tomada de decisões, executar código em loop, chamada de subrotinas, interrupções de software e outros.

As flags do CPSR não são alteradas pelas instruções de branch não possibilitando o uso do sufixo S como parte da instrução.

Para chamada de subrotinas ou funções em cascata, o registrador R14 deve ser salvo na pilha para retornar ao fluxo de execução anterior.

As instruções do tipo Thumb não estão presentes nas versões das arquiteturas v1, v2 e v3. Esse tipo de instrução está presente apenas em processadores com estensão T.

Mais informações sobre registradores, flags e condições podem ser vistas em Registradores e CPSR e Formato: Condições.

Notação utilizada:
label nome da função ou recurso
; Comentário
<- Atribuição
PC Registrador R15
LR Registrador R14

A instrução B desvia o fluxo de execução, de forma incondicional, para um novo local onde a execução do programa irá continuar. Esse endereço de novo local é sinalizado fazendo com que o branch seja positivo ou negativo.

Sintaxe
B{<cond>} <endereço>
Operação
PC <- PC + (+/-)endereço
Endereçamento
#imediato_24_bits
Ex:
MOV R0,#FF
B label

Internamente, B desloca e estende <endereço> de 24-Bits para um valor 32-Bits que então é adicionado ao PC(R15).

A instrução BL é semelhante à instrução B. A diferença é que BL salva um endereço de retorno do fluxo de execução no registrador LR(R14) para que posteriormente o retorno possa ser feito.

Sintaxe
BL{<cond>} <endereço>
Operação
LR <- endereço da próxima instrução
PC <- PC + (+/-)endereço
Endereçamento
#imediato_24_bits
Ex:
MOV R0,#FF
BL label
MOV R12, R0

Para voltar para o fluxo anterior ao BL, o valor do registrador LR deve ser movido para o PC como abaixo. As flags de status podem ser utilizadas para que o retorna possa ser condicional.

Sintaxe
MOV{<cond>}{S} PC, LR
MOV{<cond>}{S} R15, R14

A instrução BX é semelhante à instrução BL. A diferença é que BX troca a decodificação das instruções entre Thumb-1 e ARM antes de iniciar a execução uma instrução a partir do novo local de desvio.

Sintaxe
BX{<cond>} Rm
Operação
CPSR[Flag T] <- Rm[Bit 0]
PC <- Rm[Bit 31:1] << 1
Endereçamento
Rm
Ex:
MOV R0,#FF
BX label
MOV R12, R0     ; endereço de retorno -> R14

Para voltar para o fluxo anterior ao BX, o valor do registrador LR deve ser movido para o PC. Utilizando a própria instrução BX, como abaixo, podemos fazer o retorno do fluxo:

Ex:
MOV R0,#FF
BX label
MOV R12, R0     ; endereço de retorno -> R14
;
;
label:
; omitido
BX  LR      ;Retorna para fluxo
  1. 11/12/2024 - versão inicial