Objetivos
Instruções para Controle de Fluxo
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
BX - Branch and Exchange - (v4T+)
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
Histórico de atualizações
- 11/12/2024 - versão inicial
Os cursos oferecidos nesta página são cursos fornecidos por parceiros. Ao comprar um curso clicando
em seu banner, você está ajudando a manter o projeto TutorialDev vivo. Os sites dos cursos parceiros utilizam cookies.