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

  1. Instruções de Controle de Fluxo
  2. B
  3. BL
  4. 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/ou 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 ou principal.

As instruções do tipo Thumb, BX, 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 é acumulado 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. 18/05/2026 - revisão 1 - Ajustes: 'objetivos' , intro e descrições B e BL
  2. 11/12/2024 - versão inicial