Você está na página 1de 49

1

Arm: caractersticas gerais


A arquitetura ARM, inicialmente projetada na dcada de 1980, evoluiu ao longo dos anos, gerando diferentes verses, com pequenas
variaes no repertrio de instrues e poder de processamento, para
serem usadas em mquinas com diferentes fins. A verso original
usa palavras de 32 bits, a verso mais recente usa palavras de 64 bits.
Estudaremos neste livro uma verso recente de 32 bits, mais especificamente a verso ARMv7. Vrias companhias licenciam e produzem
diferentes verses da arquitetura ARM, utilizada tanto em servidores
e computadores pessoais como em dispositivos mveis como tablets e
telefones celulares.

1.1

Modos de Operao

No Faska h dois modos de operao: supervisor e usurio. No


ARMv7, com o objetivo de tornar mais rpido o atendimento a
interrupes e excees, h sete modos de operao. Os modos de
operao na verso ARMv7 so mostrados na Tabela 1.1.
Os modos de operao so definidos em funo de interrupes
e excees. O modo User o modo em que aplicaes de usurio
devem ser executadas. Neste modo apenas instrues seguras so
permitidas de executar. Os modos FIQ e Interrupt so associados
a interrupes externas. No Arm, h dois tipos de interrupes
externas: uma interrupo rpida (denominada FIQ, do ingls
fast interrupt request e uma interrupo normal (denominada IRQ,
do ingls interrupt request). A interrupo do tipo FIQ reservada
para interrupes mais prioritrias, que necessitem de um tempo
de atendimento mais curto. Quando uma interrupo aceita, o
processador entra no modo correspondente (FIQ ou Interrupt).
O processador entra no modo de operao Abort quando uma
exceo de acesso memria ocorre. O Arm possui um mdulo
gerenciador de memria que permite que regies de memria sejam
protegidas para escrita ou para execuo. Quando uma instruo

linguagens de montagem

Nome

Descrio

User

Modo usurio, nico modo sem nenhum privilgio de execuo.


Modo de interrupo rpida, entra neste modo quando uma
interrupo do tipo FIQ aceita.
Modo de interrupo, entra neste modo quando uma interrupo do tipo IRQ aceita.
Modo supervisor, entra neste modo quando o processador
sofre um reset ou uma instruo de chamada ao sistema (SWI)
executada.
Modo aborto de acesso, entra neste modo quando uma exceo de acesso a memria disparada (acesso desalinhado de
palavra, por exemplo).
Modo instruo indefinida, entra neste modo quando uma
exceo de instruo indefinida disparada.
Modo sistema, nico modo em que o processador entra por
programa (ligando um bit especfico na palavra de estado).

FIQ
Interrupt
Supervisor

Abort

Undefined
System

viola uma proteo de memria uma exceo de tipo abort gerada.


Excees de tipo abort tambm so geradas em caso de memria
inexistente, ou falta de pgina em sistemas operacionais que utilizam
paginao.
O processador entra no modo de operao Undefined quando tenta
executar uma palavra que no contm um cdigo vlido de instruo.
O modo de operao Supervisor o modo em que o processador
entra ao executar uma instruo de chamada ao sistema operacional
(similar ao que ocorre no Faska).

1.2

Registradores

O processador ARM tem 37 registradores, mas apenas 17 (ou 18,


em alguns modos de operao) so acessveis a cada momento. Dos
registradores acessveis, 13 so registradores de propsito geral (r0 a
r12). Os outros quatro registradores tm funes especficas:
sp (do ingls stack pointer), apontador de pilha, similar ao registrador homnimo do Faska, tambm acessado pelo nome r13.
lr (do ingls link register), registrador de ligao, tambm acessado
pelo nome r14. Como veremos, esse registrador recebe o endereo
de retorno em chamadas de procedimento.
pc (do ingls program counter), contador de programa, tambm
acessado pelo nome r15. Similar ao registrador ip do Faska,
indica o endereo da prxima instruo a ser executada.

Tabela 1.1: Modos de operao do


processador ARMv7.

arm: caractersticas gerais

CPSR (do ingls current program status register, registrador de estado


corrente do programa), similar ao registrador de bits de estado do
Faska.
Os registradores acessveis em um dado momento formam o
banco de registradores disponveis ao programador. O banco de
registradores, em momentos diferentes de execuo, constitudo
por diferentes registradores fsicos. O modo de operao corrente
determina a composio dos registradores que formam o banco. A
Figura 1.1 ilustra a composio do banco de registradores para cada
modo de operao do processador. Na Figura, os registradores esto
numerados de 0 a 36 (canto superior direito de cada registrador),
indicando os 37 registradores fsicos.
Registradores de propsito geral e contador de programa
User/System

FIQ

Supervisor

Abort

IRQ

Figura 1.1: Mapa dos registradores


ARM.

Undefined

r0

r0

r0

r0

r0

r0

r1

r1

r1

r1

r1

r1

r2

r2

r2

r2

r2

r2

r3

r3

r3

r3

r3

r3

r4

r4

r4

r4

r4

r4

r5

r5

r5

r5

r5

r5

r6

r6

r6

r6

r6

r6

r7

r7

r7

r7

r7

r7

r8

r8

17

r8

r8

r8

r8

r9

r9

r9

r9

r9

r9

18

r10

10

r10

19

r11

11

r11

20

r12

12

r12

21

r13/SP

13

r13/SP

22

r14/LR

14

r14/LR

23

r15/PC

15

r15/PC

15

r10

10

r11

11

r12

12

r13/SP

24

r14/LR

25

r15/PC

15

r10

10

r11

11

r12

12

r13/SP

26

r14/LR

27

r15/PC

15

r10

10

r10

10

r11

11

r11

11

r12

12

r12

12

r13/SP

28

r13/SP

30

r14/LR

29

r14/LR

31

r15/PC

15

r15/PC

15

Registradores de estado
CPSR

16

CPSR
SPSR

16

32

CPSR
SPSR

16

33

CPSR
SPSR

16

34

CPSR
SPSR

16

35

CPSR
SPSR

16

36

Os bancos de registradores nos modos de operao User e System


so compostos pelo mesmo conjunto de registradores. No modo de
operao FIQ, os registradores de r0 a r7, e o registrador 15, tambm
so os mesmos utilizados no modo User/System. Mas os registradores
de r8 a r14 so fisicamente distintos dos registradores com esses
nomes no modo User/System. O modo FIQ tambm utiliza o mesmo
registrador de estado que o modo User/System, mas um registrador
fisicamente distinto armazena os bits de estado do programa inter-

linguagens de montagem

rompido (registrador SPSR, abreviatura do ingls saved program status


register). Como os registradores so distintos dos registradores do
modo User, quando ocorre uma interrupo do tipo FIQ, se o tratador
da interrupo utilizar apenas os registradores de r8 a r14, nenhum
registrador (nem mesmo o registrador de estado) necessita ser salvo
na pilha, agilizando o tratamento da interrupo.
Os modos de operao Supervisor, Abort, IRQ e Undefined compartilham os registradores de r0 a r12, e r15, com o modo User/System,
mas tm registradores r13 e r14 fisicamente distintos. Nesses modos
o registrador de estado SPSR armazena o registrador de estado do
programa que foi interrompido.

1.2.1 Registradores de estado


Os registradores de estado mantm bits de estado que indicam o
resultado de operaes lgicas e aritmticas, controlam interrupes
e o modo de operao do processador. A Figura 1.2 mostra os bits de
estado nos registradores de estado do processador ARM.
31

30

29

28

T M4 M3 M 2 M1 M0

Os bits de estado so divididos em bits de condio (bits 28 a 31


do registrador de estado) e bits de controle (bits 0 a 7 do registrador
de estado).
Os bits de condio so similares aos bits de condio do Faska.
Eles so ligados ou desligados como resultado de operaes aritmticas e lgicas, e podem tambm ser alterados por instrues especiais.
Os bits de condio no ARMv7 so:
N: sinal. Cpia do bit mais significativo do resultado; considerando aritmtica com sinal, se N igual a zero, o resultado maior
ou igual a zero. Se N igual a 1, resultado negativo.
Z: zero. Ligado se o resultado foi zero, desligado caso contrrio.
C: vai-um (carry). Ligado se a operao causou vai-um (carry-out)
ou empresta-um (carry-in), desligado caso contrrio.
V: estouro de campo (overflow). Ligado se ocorreu estouro de
campo; calculado como o ou-exclusivo entre o vai-um do bit
mais significativo do resultado e o vai-um do segundo bit mais
significativo do resultado.
Os bits de controle determinam condies de operao do processador. No ARM eles so:

Figura 1.2: Bits de estado.

arm: caractersticas gerais

I: interrupo. Quando I igual a 1, interrupes do tipo IRQ


esto desabilitadas.
F: interrupo rpida. Quando F igual a 1, interrupes do tipo
FIQ esto desabilitadas.
T: estado Arm/Thumb. O processador ARMv7 pode executar dois
conjuntos de instrues: o conjunto normal, em que instrues tm
32 bits (denominado arm), e um conjunto reduzido (denominado
thumb), em que instrues tm 16 bits, permitindo um cdigo mais
compacto. O bit de controle T reflete o estado em que o processador est operando; quando T igual a 1, o processador est
executando no estado thumb, quando T igual a 0 o processador
est executando no estado arm.

M[4:0]

Modo de Operao

10000

User

M[4:0]: modo de operao. Determinam o modo de operao,


conforme descrito na Tabela 1.2.

10001

FIQ

10010

IRQ

10011

Supervisor

Os demais bits dos registradores de estado (bits 8 a 27) no so


utilizados, mas so reservados para uso futuro. Seu programa no
deve alterar esses bits, para evitar problemas de compatibilidade com
novas verses do processador.

10111

Abort

11011

Undefined

11111

System

1.2.2 Uso de registradores em instrues


Todos os registradores de r0 a r14 podem ser usados como operandos em instrues. A maioria das instrues tambm permite que o
registrador r15 (pc) seja usado como operando. Os registradores de
estado podem ser carregados de e para registradores de propsito
geral com instrues especficas. E quando o processador est executando em um modo privilegiado, possvel tambm carregar ou
armazenar os registradores do modo User.

1.3

Instrues

Todas as instrues do processador ARM so codificadas em uma


palavra de 32 bits, e praticamente todas executam em apenas um
ciclo do relgio.
As instrues devem ter endereos mltiplos de quatro (alinhadas
por palavras). Assim, os dois bits menos significativos do registrador pc so sempre zero. Tentativa de acesso a uma instruo no
alinhada gera uma exceo.
Uma caracterstica marcante no processador ARMv7 que (praticamente) todas as instrues so executadas condicionalmente. Nas
instrues, os quatro bits mais significativos (bits 28 a 31) so usados
para codificar o campo de condio da instruo. As instrues so

Tabela 1.2: Modos de operao definidos pelos bits de controle M[4:0].

10

linguagens de montagem

executadas condicionalmente, dependendo dos bits especificados no


campo de condio da instruo e dos bits do registrador de estado
CPSR. Como o campo de condio tem quatro bits, possvel especificar dezesseis condies distintas. No entanto, na prtica, devido
codificao das instrues, um dos valores do campo de condio
(1111) no pode ser usado, de forma que podemos especificar quinze
condies, descritas na Tabela 1.3.
Cdigo
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110

Sufixo

Condio

Descrio

EQ
NE
CS
CC
MI
PL
VS
VC
HI
LS
GE
LT
GT
LE
AL

Z=1
Z=0
C=1
C=0
N=1
N=0
V=1
V=0
C=1^Z=0
C=0_Z=1
N=V
N 6= V
Z = 0 ^ (N = V)
Z = 1 _ (N 6= V)

Igual
Diferente
Maior ou igual, valor sem sinal
Menor, valor sem sinal
Negativo
Positivo ou zero
Estouro de campo, valor com sinal
No estouro de campo, valor com sinal
Maior, valor sem sinal
Menor ou igual, valor sem sinal
Maior ou igual, valor com sinal
Menor, valor com sinal
Maior, valor com sinal
Menor ou igual, valor com sinal
Sempre

A Tabela 1.3 mostra, para cada cdigo, um sufixo. Os sufixos so


utilizados em comandos de linguagem de montagem para especificar
o campo de condio da instruo correspondente, codificado nos
bits 28 a 31. Um comando sem sufixo o mesmo que um comando
com o sufixo AL, significando que a instruo correspondente
sempre executada. No momento da execuo de uma instruo, o
processador verifica se os bits de condio do registrador de estado
CPSR esto de acordo com a condio codificada nos bits 28 a 31 da
instruo. Se a condio satisfeita, a instruo executada; caso
contrrio a instruo no executada.
Uma instruo de desvio incondicional, cujo comando em linguagem de montagem B (do ingls branch, desvio), como por exemplo
b longe

se torna um desvio condicional pela adio de um sufixo, como

EQ:

beq longe

Nesse caso, o desvio tomado somente se o bit de condio Z


estiver ligado. O mesmo ocorre com todas as outras instrues.
Como outro exemplo, uma instruo de transferncia de dados, como
cpia entre registradores, cujo comando em linguagem de montagem
MOV

Tabela 1.3: Execuo condicional

arm: caractersticas gerais

11

mov r1,r2

se torna uma instruo condicional pela adio de um sufixo de


condio:
movne r1,r2

Nesse caso, como o sufixo usado NE, no momento da execuo,


se o bit de condio Z estiver desligado a instruo executada e o
valor do registrador r2 copiado para o registrador r1. Se o bit de
condio Z estiver ligado, a instruo no executada.
O fato de que toda instruo pode ser executada condicionalmente
permite o desenvolvimento de cdigos muito compactos e eficientes,
e tornam desvios condicionais para endereos maiores do que o
endereo corrente praticamente desnecessrios.

1.3.1 Pipeline
Para conseguir que, em regime, uma instruo seja executada a cada
ciclo de relgio, a arquitetura ARM utiliza uma tcnica de implementao conhecida como pipeline de execuo. Nessa implementao,
a execuo de uma instruo dividida em estgios, cada um responsvel por uma tarefa independente. A pipeline do processador
ARMv7 tem trs estgios: busca da instruo, decodificao e execuo. Como cada estgio executa uma tarefa independente, eles no
precisam ser executados sequencialmente. Na implementao em
pipeline os estgios so executados concorrentemente, como ilustra
o diagrama da Figura 1.3, em que os estgios so designados por B
(busca), D (decodificao) e X (execuo).

Instr. 1
Instr. 2
Instr. 3
Instr. 4
Instr. 5

tempo (ciclos do relgio)

No ciclo de relgio 1, apenas a Instruo 1 executa, utilizando o estgio B. No ciclo de relgio 2, a Instruo 1 passa a utilizar o estgio
D, enquanto a Instruo 2 utiliza o estgio B. A partir do ciclo 3, todos os estgios da pipeline esto ocupados, cada um executando uma
instruo diferente. O resultado que, se no houver instrues de
desvios, o processador termina de executar uma instruo a cada ciclo do relgio. Quando h um desvio, a pipeline esvaziada, tem que

Figura 1.3: Execuo em pipeline, com


trs estgios.

12

linguagens de montagem

recomear, e demora trs ciclos para voltar a ficar em regime, o que


retarda a execuo. Por isso, o fato de todas as instrues poderem
ser condicionais tende a agilizar a execuo de um programa, pois
a pipeline est sempre cheia. Obviamente, se um grupo grande de
instrues consecutivas no executado por conta da execuo condicional, a penalidade de no execuo pode chegar a se sobrepor
penalidade de usar um desvio condicional e causar um esvaziamento
do pipeline. Essa uma escolha que deve ser feita pelo programador,
caso a caso.
interessante notar que, devido execuo em pipeline, quando
uma instruo est no estgio de execuo, o registrador contador de
programa pc aponta na realidade para a instruo que est no estgio
de busca de instruo. Ou seja, quando uma instruo no endereo
K est sendo executada, o registrador pc tem o valor K + 8. Isso
importante no clculo do endereo alvo de desvios, por exemplo,
como veremos na seo ??.

1.4

Unidade de deslocamento

O processador ARMv7 inclui em sua Unidade Lgica e Aritmtica


uma unidade de deslocamento (em ingls barrel shifter) que pode ser
acionada para efetuar operaes de deslocamento ou rotao em um
operando antes de o operando ser usado em instrues aritmticas,
lgicas ou de transferncia de dados. Na maioria das instrues o
deslocamento feito dentro do mesmo ciclo de relgio em que a
instruo executada.
J que qualquer instruo pode utilizar a unidade de deslocamento, o processador ARMv7 no inclui instrues especficas de
deslocamento e rotao, como ocorre o Faska, j que uma instruo
de transferncia de dados pode ser usada para efetuar deslocamentos
ou rotaes, utilizando a unidade de deslocamento em um de seus
operando.
O uso de descolamentos e rotaes em qualquer instruo permite
uma grande versatilidade na construo de constantes utilizadas
em endereamento imediato, no clculo de endereos de elementos
de vetores, alm de permitir multiplicao por um valor imediato.
Veremos, nos prximos captulos, exemplos de uso da unidade de
deslocamento.

1.5

Convenes do montador

Vamos utilizar nos exemplos o montador gnu-arm, por ser software


livre disponvel para diversos sistemas operacionais.

arm: caractersticas gerais

1.5.1 Diretivas
As diretivas da linguagem de montagem Arm so muito similares s
diretivas da linguagem de montagem Faska:
Comentrios so iniciados pelo caractere @ e se estendem at o
final da linha.
Para modificao do ponto de montagem utilizamos a diretiva
.ORG:
.org

expresso_inteira

[@ comentrio]

que altera o ponto de montagem corrente para o valor expresso_inteira.


Para definio de constantes utilizamos a diretiva .EQU:
.equ

nome

expresso_inteira

que associa o valor da expressao_inteira ao smbolo nome.


Para reservar espao em memria, sem inicializao, usamos a
diretiva .SKIP:
[rtulo:] .skip

[expresso_inteira]

[@ comentrio]

que reserva expresso_inteira bytes de memria; se rtulo definido,


associado ao endereo do primeiro byte reservado.
Para reservar e inicializar espao em memria, sem inicializao,
usamos as diretivas .BYTE (reserva e inicializao de bytes) e
.WORD (reserva e inicializao de palavras):
[rtulo:] .byte
[lista_de_valores]

[lista_de_valores]
[@ comentrio]

[@ comentrio] [rtulo:] .word

em que lista_de_valores uma lista de valores de 8 ou 32 bits,


separada por vrgulas.
Para reservar e inicializar uma cadeia de caracteres usamos a
diretiva .ASCII:
[rtulo:] .ascii

cadeia_de_caracteres

[@ comentrio]

em que cadeia_de_caracteres uma cadeia de caracteres limitada por


aspas duplas.
Como instrues no ARM devem ser montadas em endereos
multiplos de quatro (limites de palavras), muitas vezes necessrio alinhar dados e instrues. Para isso utilizamos a diretiva
.ALIGN:

13

14

linguagens de montagem

.align

expresso_inteira

que altera o ponto de montagem para o prximo endereo divisvel por 2expressao_inteira .
O Exemplo 1.1 ilustra as diretivas da linguagem de montagem
ARM.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

@ definio de constante
.equ MAXVAL, 256

Exemplo 1.1: Uso de diretivas.

@ alterao do ponto de montagem


.org
0x1000
@ reserva de espao sem inicializao
vetor:
.skip 0x200
@ reserva 512 bytes
um:
.skip 1
@ reserva um byte;
@ ponto de montagem aqui 0x1201
@ alinha em palavra
.align 2
@ alinha em endereo mltiplo de 4 (2^2)
@ ponto de montagem aqui 0x1204
@ reserva
var1:
var2:
mensagem:

de espao e inicializao
.byte 0x01
@ um byte, valor hexadecimal (8 bits)
.word 1000,2000
@ duas palavras (32 bits cada), valores decimais
.ascii "uma linha\n" @ cadeia de caracteres

1.5.2 Operandos com endereamento imediato


No montador gnu-arm, valores imediatos utilizados como operandos
devem ser prefixados com o caractere #, como por exemplo no
comando carrega registrador com valor imediato:
mov r5, #0x5

2
Transferncia entre um registrador e memria
O processador ARM usa uma arquitetura em que acessos memria
so feitos atravs de instrues especficas, como carrega registrador
de memria e armazena registrador de memria. Instrues de
processamento de dados no fazem acesso a operandos na memria
(por exemplo no possvel somar o valor de um registrador ao valor
de uma palavra na memria com uma instruo de processamento de
dados).
As instrues de transferncia entre registrador e memria do
ARM podem transferir uma nica palavra (ou byte) de ou para um
registrador, ou um grupo de palavras (ou bytes) de ou para um
grupo de registradores. Neste captulo vamos estudar instrues e
modos de endereamento para transferir um nico valor (palavra
ou byte) de ou para um registrador. As instrues que transferem
grupos de palavras sero vistas no Captulo ??.
A Figura2.1 mostra a codificao das instrues de carrega registrador com palavra de memria e armazena registrador em palavra de
memria, cujos comandos em linguagem de montagem so respectivamente LDR (do ingls load register e STR (do ingls store register).
31

Cond

27

26

25

24

23

22

21

20

16

Rn

12

Rd

Deslocamento

Na Figura 2.1, o campo Cond o campo de condio, que controla


a execuo condicional da instruo, conforme descrito na Seo 1.3.
Na instruo LDR o campo Rd indica o registrador destino (onde o
valor da palavra de memria carregado). Na instruo STR o
campo Rd indica o registrador fonte (valor que armazenado na
memria). Em ambas as instrues, o campo Rn indica o registrador
base, que contm o endereo base do operando, utilizado no clculo
do endereo efetivo do operando, que varia de acordo com o modo
de endereamento utilizado pela instruo.

Figura 2.1: Codificao das instrues


LDR e STR.

16

linguagens de montagem

O formato geral do comando LDR em linguagem de montagem


ldr

Rd, <endereo>

O formato geral do comando STR em linguagem de montagem


str

Rd, <endereo>

Nos dois formatos acima, <endereo> assume diferentes formas


dependendo do modo de endereamento.
O processador ARM possui um nmero muito maior de modos
de endereamento do que o Faska. Para as instrues LDR e STR
memria os modos de endereamento se dividem em duas categorias:
pr-indexados ou ps-indexados. Os nomes se referem capacidade de
incrementar ou decrementar o registrador base antes (pr) ou depois
(ps) do clculo do endereo efetivo.

2.1

Endereamento direto

No modo de endereamento direto, o endereo do operando dado


somente pelo campo Deslocamento da Figura 2.1, ou seja, o registrador base Rn no utilizado.
O formato dos comandos LDR e STR em linguagem de montagem
no modo de endereamento direto :
instr{cond}{B} Rd, endereo

onde um componente entre chaves (como {cond} indica um componente opcional e


instr especifica a instruo e pode ser LDR ou STR.
cond um sufixo de condio da Tabela 1.3.
B, se presente, faz com que o montador coloque o valor 1 no bit
22 da instruo (bit B na Figura 2.1), indicando que a operao
deve carregar ou armazenar bytes; o byte menos significativo do
registrador Rd carregado ou armazenado (na instruo LDR os
outros 24 bits do registrador so zerados). Se no presente, o bit B
da instruo 0 e a operao carrega ou armazena palavras.
Rd o registrador fonte (contm valor a ser armazenado na memria) para instrues LDR e destino (onde o valor lido da memria
armazenado) para instruces STR.
endereo o endereo do operando na memria (normalmente
especificado por um rtulo do programa). O montador monta
no campo Deslocamento da instruo (Figura 2.1) a diferena
entre o ponto corrente de montagem e o endereo do operando.

transferncia entre um registrador e memria

17

No momento da execuo, o processador calcula o endereo


efetivo adicionando o valor do registrador pc ao valor do campo
Deslocamento com o sinal estendido para 32 bits. Um erro gerado
pelo montador se a diferena entre o endereo do operando e o
ponto corrente de montagem no puder ser codificado em 12 bits.
O Exemplo 4.2 ilustra a sintaxe dos comandos LDR e STR com
endereamento direto.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

.org 0x1000
ldr
r1, var1
ldrgt r2, var1
ldreqb r3, var2

@ carrega palavra em r1, incondicional


@ carrega palavra em r2, condicional
@ carrega byte em r3, condicional

str
r4, var1
strcc r5, var1
strleb r6, var2

@ armazena r4 em palavra, incondicional


@ armazena r5 em palavra, condicional
@ armazena r6 em byte, condicional

ldr

r7, var_longe

@ gera erro, endereo muito distante

.org 0x2000
var1:
.word 0x12341234
var2:
.byte 0xff
.org 0x20000
var_longe:
.word 0x0

2.2

Modo de endereamento indireto por registrador

No modo de endereamento indireto por registrador, o endereo do


operando dado pelo valor do registrador base Rn.
O formato dos comandos LDR e STR em linguagem de montagem
no modo de endereamento indireto por registrador :
instr{cond}{B} Rd, [Rn]

onde um componente entre chaves (como {cond} indica um componente opcional e


instr especifica a instruo e pode ser LDR ou STR.
cond um sufixo de condio da Tabela 1.3.
B, se presente, faz com que o montador coloque o valor 1 no bit
22 da instruo (bit B na Figura 2.1), indicando que a operao
deve carregar ou armazenar bytes; o byte menos significativo do
registrador Rd carregado ou armazenado (na instruo LDR os

Exemplo 2.1: Instrues LDR e STR com


endereamento direto.

18

linguagens de montagem

outros 24 bits do registrador so zerados). Se no presente, o bit B


da instruo 0 e a operao carrega ou armazena palavras.
Rd o registrador fonte para instrues LDR e destino para instruces STR.
Rn o registrador base. O endereo efetivo do operando na memria dado pelo valor do registrador Rn.
O Exemplo 2.2 ilustra a sintaxe dos comandos LDR e STR com
endereamento indireto por registrador.
1
2
3
4
5
6
7

2.3

ldr
r1, [r0]
ldrmi r2, [r8]
ldrplb r3, [r9]

@ carrega palavra em r1, incondicional


@ carrega palavra em r2, condicional
@ carrega byte em r3, condicional

str
r4, r[10]
strlt r5, r[11]
strgtb r6, r[12]

@ armazena r4 em palavra, incondicional


@ armazena r5 em palavra, condicional
@ armazena r6 em byte, condicional

Modos de endereamento pr-indexados

Nos modos de endereamento pr-fixados, o endereo efetivo


formado pelo valor do registrador base mais (ou menos) um offset,
codificado no campo Offset da instruo (Figura 2.1). A forma do
clculo desse offset d origem a diferentes modos de endereamento.
O offset pode ser dado por:
um valor imediato, constante, dando origem ao modo de endereamento indireto por registrador mais constante.
o valor de um registrador, dando origem ao modo de endereamento indireto por registrador base e registrador ndice.
o valor de um registrador deslocado com o auxlio da unidade de
deslocamento (barrel shifter), dando origem ao modo de endereamento indireto por registrador e registrador ndice escalado.
Nos modos de endereamento pr-indexados, h ainda a possibilidade de atualizar o valor do registrador base com o valor do
endereo efetivo, dessa forma fazendo com que o registrador avance
(ou recue) automaticamente por um valor controlado, dentro do
mesmo ciclo de instruo, permitindo uma flexibilidade e eficincia
muito grande para implementao de comandos de repetio e para
varredura de estruturas de dados sequenciais (como vetores, por
exemplo).

Exemplo 2.2: Instrues LDR e STR com


endereamento indireto por registrador.

transferncia entre um registrador e memria

2.3.1 Endereamento indireto por registrador mais constante


O formato dos comandos LDR e STR em linguagem de montagem no
modo de endereamento indireto por registrador mais constante :
instr{cond}{B} Rd, [Rn, #expr12] {!}

onde um componente entre chaves (como {cond} indica um componente opcional e


instr especifica a instruo e pode ser LDR ou STR.
cond um sufixo de condio da Tabela 1.3.
B, se presente, faz com que o montador coloque o valor 1 no bit
22 da instruo (bit B na Figura 2.1), indicando que a operao
deve carregar ou armazenar bytes; o byte menos significativo do
registrador Rd carregado ou armazenado (na instruo LDR os
outros 24 bits do registrador so zerados). Se no presente, o bit B
da instruo 0 e a operao carrega ou armazena palavras.
Rd o registrador fonte para instrues LDR e destino para instruces STR.
Rn o registrador base.
expr12 uma expresso que o montador codifica no campo Deslocamento da instruo (Figura 2.1). O endereo efetivo do operando
na memria dado pelo valor do registrador Rn mais o valor de
expr12 com o sinal estendido para 32 bits.
! um indicador se o registrador base deve ser atualizado. Se
presente, o montador monta o valor 1 no bit 21 da instruo (bit W,
do ingls write-back, na Figura 2.1), indicando que o registrador Rn
deve ter o valor atualizado, ao final da instruo, com o valor do
endereo efetivo. Se ausente, o valor do registrador Rn permanece
inalterado.
O Exemplo 2.3 ilustra a sintaxe dos comandos LDR e STR com endereamento indireto por registrador mais constante, pr-indexado.

2.3.2 Endereamento indireto por registrador base e registrador ndice


O formato dos comandos LDR e STR em linguagem de montagem no
modo de endereamento pr-indexado indireto por registrador base e
registrador ndice :
instr{cond}{B} Rd, [Rn, {+|-} Rm] {!}

onde um componente entre chaves (como {cond} indica um componente opcional e

19

20

1
2
3
4
5
6
7
8
9
10

linguagens de montagem

ldr
ldrmi

r1, [r0,#1]
r2, [r8,#4]!

ldrplb r3, [r9,#2]


str

r4, [r10,#-2]!

strlt r5, [r11,#4]


strgtb r6, [r12,#1]!

@
@
@
@

carrega palavra em r1, incondicional


carrega palavra em r2, condicional
r2 incrementado de 4
carrega byte em r3, condicional

@
@
@
@
@

armazena r4 em palavra, incondicional


r10 decrementado de 2
armazena r5 em palavra, condicional
armazena r6 em byte, condicional
r12 incrementado de 1

instr especifica a instruo e pode ser LDR ou STR.


cond um sufixo de condio da Tabela 1.3.
B, se presente, faz com que o montador coloque o valor 1 no bit
22 da instruo (bit B na Figura 2.1), indicando que a operao
deve carregar ou armazenar bytes; o byte menos significativo do
registrador Rd carregado ou armazenado (na instruo LDR os
outros 24 bits do registrador so zerados). Se no presente, o bit B
da instruo 0 e a operao carrega ou armazena palavras.
Rd o registrador fonte para instrues LDR e destino para instruces STR.
Rn o registrador base.
Rm o registrador ndice.
+|- indica se o registrador ndice deve ser adicionado ou subtrado
do registrador base para formar o endereo efetivo do operando.
O sinal + opcional.
! um indicador se o registrador base deve ser atualizado. Se
presente, o montador monta o valor 1 no bit 21 da instruo (bit W,
do ingls write-back, na Figura 2.1), indicando que o registrador Rn
deve ter o valor atualizado, ao final da instruo, com o valor do
endereo efetivo. Se ausente, o valor do registrador Rn permanece
inalterado.
O Exemplo 2.4 ilustra a sintaxe dos comandos LDR e STR com
endereamento pr-fixado indireto por registrador base e registrador
ndice.

2.3.3 Endereamento indireto por registrador base e registrador ndice


escalado
Para este modo de endereamento o campo Offset da instruo
(Figura 2.1) codifica um registrador ndice e o tipo da operao
de deslocamento utilizada, conforme a Figura 2.2.

Exemplo 2.3: Instrues LDR e STR com


modo de endereamento pr-indexado
indireto por registrador mais constante.

transferncia entre um registrador e memria

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

ldr

r1, [r0,r2]

ldrvs

r2, [r8,-r3]!

ldrvcb r3, [r9,+r10]

str

r4, [r10,-r0]!

strhi

r5, [r11,r0]

strlsb r6, [r12,r13]!

@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@

carrega palavra em r1, incondicional


endereo efetivo r0+r2
r0 no alterado
carrega palavra em r2, condicional
endereo efetivo r8-r3
r8 tem valor alterado ao final
carrega byte em r3, condicional
endereo efetivo r9+r10
r9 no alterado
armazena r4 em palavra, incondicional
endereo efetivo r10-r0
r10 tem valor alterado ao final
armazena r5 em palavra, condicional
endereo efetivo r11+r0
r11 no alterado
armazena r6 em byte, condicional
endereo efetivo r12+r13
r12 tem valor alterado ao final

O formato dos comandos LDR e STR em linguagem de montagem


no modo de endereamento pr-indexado indireto por registrador
base e registrador ndice escalado :
instr{cond}{B} Rd, [Rn, {+|-} Rm, shift #expr5] {!}

onde um componente entre chaves (como {cond} indica um componente opcional e


instr especifica a instruo e pode ser LDR ou STR.
cond um sufixo de condio da Tabela 1.3.
B, se presente, faz com que o montador coloque o valor 1 no bit
22 da instruo (bit B na Figura 2.1), indicando que a operao
deve carregar ou armazenar bytes; o byte menos significativo do
registrador Rd carregado ou armazenado (na instruo LDR os
outros 24 bits do registrador so zerados). Se no presente, o bit B
da instruo 0 e a operao carrega ou armazena palavras.
Rd o registrador fonte para instrues LDR e destino para instruces STR.
Rn o registrador base.
Rm o registrador ndice.
+|- indica se o valor registrador ndice, aps escalado, deve ser
adicionado ou subtrado do registrador base para formar o endereo efetivo do operando. Codificado no bit 23 da instruo (bit U,
do ingls Up or down) na Figura 2.1). O sinal + opcional.

21

Exemplo 2.4: Instrues LDR e STR com


endereamento indireto por registrador
mais constante, pr-indexado.

11

Tipo

Rm

Figura 2.2: Codificao do campo Offset


para o modo de endereamento indireto
por registrador base e registrador ndice
escalado.

22

linguagens de montagem

shift indica o tipo de operao de deslocamento realizada no valor


do registrador Rm antes de ser utilizado no clculo do endereo
efetivo. O tipo pode ser:
LSL: deslocamento lgico para a esquerda (abreviatura do ingls
Logical Shift Left).
LSR: deslocamento lgico para a direita (abreviatura do ingls
Logical Shift Right).
ASR: deslocamento aritmtico para a direita (abreviatura do
ingls Arithmetic Shift Right).
ROR: rotao para a direita (abreviatura do ingls Rotate Right).
expr5 indica a quantidade do deslocamento a ser aplicado no
registrador Rm.
! um indicador se o registrador base deve ser atualizado. Se
presente, o montador monta o valor 1 no bit 21 da instruo (bit W,
do ingls write-back, na Figura 2.1), indicando que o registrador Rn
deve ter o valor atualizado, ao final da instruo, com o valor do
endereo efetivo. Se ausente, o valor do registrador Rn permanece
inalterado.
O Exemplo 2.5 ilustra a sintaxe dos comandos LDR e STR com
endereamento pr-fixado indireto por registrador base e registrador
ndice escalado.
1
2
3
4
5
6
7
8
9
10
11
12

2.4

ldr

r1, [r0,r2,lsl#1]

@
@
@
ldrgt r2, [r8,-r3,lsr#2]! @
@
@
ldrltb r3, [r9,+r10,asr#4] @
@
@
str
r4, [r10,-r0,ror#5]! @
@
@

carrega palavra em r1, incondicional


Exemplo 2.5: Instrues LDR e STR com
endereo efetivo r0+(r2<<1)
endereamento pr-fixado indireto por
r0 no alterado
registrador base e registrador ndice
carrega palavra em r2, condicional
escalado.
endereo efetivo r8-(r3>>2)
r8 tem valor alterado ao final
carrega byte em r3, condicional
endereo efetivo r9+(r10 >>arit. 4)
r9 no alterado
armazena r4 em palavra, incondicional
endereo efetivo r10-(r0 rotacionado 5 posies)
r10 tem valor alterado ao final

Modos de endereamento ps-indexados

Os modos de endereamento ps-indexados so muito similares


aos modos de endereamento pr-indexados. A diferena que,
nos modos de endereamento ps-indexados, o endereo efetivo do
operando o valor do registrador base, mas aps o acesso memria,
o registrador base (sempre) atualizado, adicionando ou subtraindo
o valor do operando indexador (constante, registrador ndice ou

transferncia entre um registrador e memria

registrador ndice escalado). Como o registrador base sempre


atualizado no caso de endereamento ps-indexado (pois no teria
sentido ter o operando ps-indexado se no fosse para atualizao
do registrador base), o indicador ! no utilizado, e o bit 21 da
instruo (bit W, do ingls write-back, na Figura 2.1), tem sempre o
valor 1.
O formato dos comandos LDR e STR em linguagem de montagem
nos modos de endereamento ps-indexados descrito a seguir, onde
um componente entre chaves (como {cond} indica um componente
opcional e os outros campos so iguais aos apresentados para os
modos de endereamento pr-indexados.

Endereamento indireto por registrador mais constante


instr{cond}{B} Rd, [Rn], #expr12

Endereamento pr-indexado indireto por registrador base e registrador


ndice
instr{cond}{B} Rd, [Rn], {+|-} Rm

Endereamento pr-fixado indireto por registrador base e registrador ndice escalado:


instr{cond}{B} Rd, [Rn], {+|-} Rm, shift #expr5

O montador diferencia entre os modos pr-fixado e ps-fixado


pela sintaxe do comando, que ligeiramente diferente (note a posio dos operandos em relao s chaves). O Exemplo 2.6 ilustra as
instrues LDR e STR com modos de endereamento ps-indexados.

23

24

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

linguagens de montagem

@ modo de endereamento registrador base e constante


ldrplb r3,[r9],#2
@ carrega byte em r3, condicional
str

r4,[r10],#-2

@ armazena r4 em

palavra, incondicional

@ modo de endereamento registrador base e registrador ndice


ldrvs r2,[r8],-r3
@ carrega palavra em r2, condicional
@ endereo efetivo r8-r3
@ r8 tem valor alterado ao final
ldrvcb r3,[r9],+r10
@ carrega byte em r3, condicional
@ endereo efetivo r9+r10
@ r9 no alterado
str
r4,[r10],-r0
@ armazena r4 em palavra, incondicional
@ endereo efetivo r10-r0
@ r10 tem valor alterado ao final
@ modo de endereamento registrador base e registrador ndice escalado
strhi

r5,[r11],r0

ldr

r1,[r0],r2,lsl#1

@ armazena r5 em palavra, condicional

@
@
@
ldrgt r2,[r8],-r3,lsr#2 @
@
@
strltb r3,[r9],+r10,asr#4 @
@
@

carrega palavra em r1, incondicional


endereo efetivo r0
r0 alterado para r0+(r2<<1)
carrega palavra em r2, condicional
endereo efetivo r8-(r3>>2)
r8 tem valor alterado ao final
armazena r3 em byte, condicional
endereo efetivo r9
r9 alterado para r9+(r10 >>arit. 4)

Problema 2.1. Traduzir para linguagem de montagem ARM o seguinte


trecho de programa C:
1
2
3
4
5
6

char b,vetor_char[100];
int a,i,vetor_int[100];
...
vetor_char[i]=b;
vetor_int[i]=a;
...

O Exemplo 2.7 mostra uma soluo para o Problema 2.1. Note


que para carregar o endereo da varivel vetor_char utilizamos
uma instruo LDR cujo operando uma palavra de memria
(ender_vetor_char) que contm o endereo da varivel. Isso porque,
como todas as intrues no ARM so codificadas em uma palavra,
no h espao na instruo para que qualquer valor imediato seja
codificado. Dessa forma, como veremos no Captulo ??, muitas vezes
necessrio utilizar essa abordagem para carregar uma constante em
um registrador.
Problema 2.2. Traduzir para linguagem de montagem ARM o seguinte
trecho de programa C:
1
2
3

int *p,*q;
...
*p++=*--q;

Exemplo 2.6: Instrues LDR e STR


com modos de endereamento psindexados.

transferncia entre um registrador e memria

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

vetor_int:
.skip 100
a:
.skip 4
i:
.skip 4
vetor_char:
.skip 100
b:
.skip 1
.align 2
ender_vetor_char:
.word vetor_char
ender_vetor_int:
.word vetor_int
@...
ldr
r0,a
ldr
r1,i
ldr
r3,ender_vetor_char
str
r0,[r3,r1]
ldr
r0,b
ldr
r3,ender_vetor_int
str
r0,[r3,r1,LSL#2]

Exemplo 2.7: Soluo para o Problema 2.1.

@
@
@
@
@
@
@

carrega valor de a
ndice
endereo de vetor_char
armazena em vetor_char[i]
carrega valor de b
endereo base
armazena em vetor_int[i]

...

O Exemplo 2.8 mostra uma soluo para o Problema 2.2.


1
2
3
4
5
6
7
8
9
10
11
12
13

Exemplo 2.8: Soluo para o Problema 2.2.

p:
.skip 4
q:
.skip 4
...

2.5

ldr
ldr

r1,q
r0,[r1,#-4]!

ldr
str

r2,p
r0,[r2],#4

str
str

r2,p
r1,q

@
@
@
@
@
@
@
@

carrega valor de q
carrega valor para atribuio,
pr-decremento de q com write-back
carrega valor de p
armazena valor da atribuio,
ps-incremento de p com write-back
armazena valor atualizado de p
armazena valor atualizado de q

Exerccios

2.5.1. Traduza para linguagem de montagem ARM o seguinte trecho


de programa em C:
1
2
3
4
5

int *p,i,k;
...
*p++=i;
*++p=k;
...

25

26

linguagens de montagem

2.5.2. Traduza para linguagem de montagem ARM o seguinte trecho


de programa em C:
1
2
3
4
5

char b,vetor_char[100];
int a,i,vetor_int[100];
...
b=vetor_char[i++];
a=vetor_int[i++];

3
Desvios e Processamento de dados
3.1

Desvios

No processador ARM a as instrues de desvio podem ter endereamento imediato ou endereamento indireto por registrador.

3.1.1 Desvios com endereamento imediato


A Figura3.1 mostra a codificao das instrues de desvio com
endereamento imediato.
31

Cond

27

26

25

24

Offset

O formato geral do comando de desvio com endereamento


imediato em linguagem de montagem
B{cond} endereo

onde
cond um sufixo de condio da Tabela 1.3.
endereo um endereo que deve estar dentro do intervalo

[pc

(224

1), pc + 224 ]

O endereo alvo do desvio calculado relativo ao registrador


contador de programa, pc. O montador calcula a diferena, em
complemento de dois, do ponto de montagem e do endereo alvo.
Como no processador ARM todos os endereos devem ser mltiplos
de quatro, os dois bits menos significativos de um endereo so zero,
e portanto no precisam ser armazenados no campo Offset. Assim,
o montador desloca, de dois bits para a direita, o valor da diferena

Figura 3.1: Codificao das instrues


de desvio com endereamento imediato.

28

linguagens de montagem

encontrada entre o ponto de montagem e o endereo alvo, e monta o


valor resultante no campo Offset.
No momento da execuo, o processador extrai o valor do campo
Offset, estende o bit de sinal para 32 bits, desloca esse valor que dois
bits para a esquerda, adiciona com o valor corrente do registrador
contador de programa e finalmente atualiza o valor do registrador
contador de programa com o valor calculado. A pipeline esvaziada
e o processador inicia a execuo da instruo no endereo alvo.
O Exemplo 5.1 ilustra a sintaxe do comando B.
1
2
3
4
5
6

bne
b
loop:
...
fim:
...

loop
fim

Exemplo 3.1: Instrues de desvio com


endereamento imediato.

@ desvio condicional
@ desvio incondicional
@ um rtulo
@ outro rtulo

3.1.2 Desvios com endereamento por registrador


A Figura3.2 mostra a codificao das instrues de desvio com
endereamento por registrador.
31

28

Cond

24

0001

20

0010

16

1111

12

1111

1111

0001

No momento da execuo, se o campo de condio satisfeito, o


contedo do registrador Rd copiado para o registrador pc.
O formato geral do comando de desvio com endereamento
imediato em linguagem de montagem

Rn
Figura 3.2: Codificao das instrues
de desvio com endereamento por
registrador.

BX{cond} Rd

onde
cond um sufixo de condio da Tabela 1.3.
Rd um registrador cujo valor ser usado como endereo alvo.
O Exemplo 5.1 ilustra a sintaxe do comando B.
1
2

bxmi r10
bx
r8

@ desvio condicional
@ desvio incondicional

A instruo BX utilizada tambm para passar para o modo de


execuo THUMB: se o bit menos significativo do registrador Rd
igual a 1, o processador passa a executar no modo THUMB a partir

Exemplo 3.2: Instrues de desvio com


endereamento por registrador.

desvios e processamento de dados

29

do endereo alvo. Caso o bit menos significativo do registrador Rd


seja igual a 0, o processador continua executando no modo ARM a
partir do endereo alvo.

3.2

Processamento de dados

As instrues de processamento de dados do ARM englobam todas


as instrues aritmticas, lgicas e de transferncia entre registradores. Elas compartilham o mesmo formato bsico de codificao,
mostrado na Figura 3.3, embora tenham diferenas quanto sintaxe
dos comandos em linguagem de montagem.
31

28

Cond

26 25

00

21 20

Opcode

16

Rn

12

Rd

Operando2

Na Figura 3.3, o campo Cond o campo de condio, que controla


a execuo condicional da instruo, conforme descrito na Seo 1.3.
O campo Opcode codifica a instruo; como esse campo tem 4 bits,
h 16 instrues distintas, descritas na Tabela 3.1.

Figura 3.3: Codificao das instrues


de processamento de dados.

Tabela 3.1: Instrues de processamento


de dados.

Opcode

Comando

Nome

Operao

0000

AND
EOR
SUB
RSB
ADD
ADC
SBC
RSC
TST
TEQ
CMP
CMN
ORR
MOV
BIC
MVN

E-lgico
Ou-exclusivo
Subtrao
Subtrao reversa
Adio
Adio com vai-um
Subtrao com empresta-um
Subtrao reversa com empresta-um
Testa bits
Testa equivalncia
Comparao
Comparao negativa
Ou-lgico
Move registrador
Desliga bit
Move registrador negado

Rd

Rn

Rd

Rn

Rd

Rn

Rd

Operando2

Rd

Rn

0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111

Rd
Rd
Rd
Rn
Rn
Rn

^ Operando2

Operando2
Operando2
Rn

+ Operando2
Rn + Operando2 + C
Rn
Operando2 + C
Operando2
Rn + C
^ Operando2

Operando2
Operando2

Rn

+ Operando2
Rd
Rn _ Operando2
Rd

Operando2

Rd

Rn

Rd

not Operando2

^ not Operando2

Diferentemente do Faska, em que toda instruo aritmtica ou


lgica atualiza os bits de condio, no ARM possvel escolher se
a instruo de processamento de dados deve ou no atualizar os
bits de condio. O bit S da instruo (Figura 3.3) determina se o
processador deve ou no atualizar os bits de condio.

1
1

30

linguagens de montagem

O bit I define como o campo Operando2 est codificado. Se I


zero, Operando2 um registrador Rm, que pode ainda ser deslocado
com a Unidade de Deslocamentos; nesse caso, o campo Operando2
codificado como mostra a Figura 3.4.
Os bits de 4 a 11 especificam o tipo de deslocamento e o a quantidade de bits que o registrador Rm deve ser deslocado (Shf). A quantidade de bits que o registrador Rm deve ser deslocado pode ser
especificada como um valor imediato de cinco bits (Imed5) ou atravs
de um outro registrador Rs.
Se o bit I igual a 1, Operando2 um valor imediato de oito bits,
Imed8, que pode ainda ser deslocado ou rotacionado com a Unidade
de Deslocamentos; nesse caso, o campo Operando2 codificado como
mostra a Figura 3.5.
O campo Shf, tanto quando Operando2 um valor imediato ou
um registrador especifica o tipo de deslocamento a ser aplicado.
Os tipos de deslocamento possveis so os mesmos j vistos na
Seo 2.3.3, cujos nomes em linguagem de montagem so mostrados
na Tabela 3.2.
Comando

Operao

LSL
LSR
ASR
ROR

Deslocamento lgico para a esquerda


Deslocamento lgico para a direita
Deslocamento aritmtico para a direita
Rotao para a direita

3.2.1 Instrues de transferncia entre registradores


As instrues de transferncia entre registradores so MOV (copia
registrador) e MVN (copia registrador negado). Elas podem efetuar
a carga de um valor imediato para um registrador,
a cpia de um registrador para outro,
o deslocamento de um registrador.
Os formatos dos comandos MOV e MVN em linguagem de montagem so:
instr{cond}{S} Rd, Operando2

onde
instr especifica a instruo e pode ser MOV ou MVN.
cond um sufixo de condio da Tabela 1.3.

11

Rm

Imed5

Shf

Rs

Shf

Figura 3.4: Codificao do campo


Operando2 quando o operando um
registrador.

11

Shf

Imed8

Figura 3.5: Codificao do campo


Operando2 quando o operando um
valor imediato.

Tabela 3.2: Operaes de deslocamento.

desvios e processamento de dados

S, se presente, faz com que o montador coloque o valor 1 no bit 20


da instruo (bit S na Figura 3.3), indicando que a operao deve
atualizar o valor dos bits de condio N e Z de acordo com o valor
resultante do registrador Rd. Se no presente, o bit S da instruo
0 e a operao no altera o valor de nenhum bit de condio.
Rd o registrador destino para a operao.
Operando2 pode ser
um valor imediato; nesse caso a sintaxe em linguagem de montagem para Operando2 #expr32. O montador procura encontrar
um valor de oito bits e uma operao de deslocamento para
montar respectivamente nos campos Imed8 e Shf da Figura 3.5
que produzam o valor expr32. Se no encontra, um erro gerado (o valor expr32 no pode ser carregado de forma imediata
em um registrador).
um registrador (possivelmente deslocado pela Unidade de
deslocamento); nesse caso a sintaxe em linguagem de montagem para Operando2 Rm {, Tiposhift Rs, onde Tiposhift um dos
comandos da Tabela 3.2.
O Exemplo 3.3 ilustra a sintaxe dos comando MOV e MVN.
1
2
3
4
5
6
7
8
9
10
11
12
13

mov

r1,r2

mvn

r3,r4

mvneqs r10,#0

mov

r12,r8,lsr#2

movgt

r9,r9,lsl#2

movcc

r13,r10,ror r2

@
@
@
@
@
@
@
@
@
@
@
@
@

cpia simples, incondicional


r1 <-- r2
cpia com negao, incondicional
r3 <-- -r4
carga de registrador com valor imediato
r10 <-- -1
condicional; se executada, bits N=1 e Z=0
cpia com deslocamento, incondicional
r12 <-- r8 / 4
deslocamento, condicional
r9 <-- r9 * 4
cpia com deslocamento, incondicional
r9 <-- r10 rotacionado r2 bits

3.2.2 Instrues que no armazenam o resultado


As instrues CMP (compara), CMN (compara com negao), TEQ
(testa equivalncia) e TST (testa bits) no armazenam o resultado da
operao em um registrador, conforme a descrio da operao na
Tabela 3.1. O formato dos comandos correspondentes em linguagem
de montagem :
instr{cond} Rn, Operando2

onde

Exemplo 3.3: Instrues MOV e MVN.

31

32

linguagens de montagem

instr especifica a instruo e pode ser CMP, CMN, TEQ ou TST.


cond um sufixo de condio da Tabela 1.3.
Rn um registrador, usado como primeiro da operao.
Operando2 especifica o segundo operando da operao, no mesmo
formato descrito na Seo 3.2.1. .
Note que o sufixo S no necessrio, pois implcito que essas
instrues atualizam os bits de condio. Todos os bits de condio
(C, N, V e Z) so atualizados de acordo com a operao e o resultado.
O Exemplo 3.4 ilustra a sintaxe dos comandos que no armazenam
o resultado em um registrador.
1
2
3
4
5
6
7
8
9
10
11

cmp

r1,r2

cmnmi

r10,r12

teqeq

r10,#1

tst

r9,r8,lsl#3

tstcs

r0,r11,ror r1

@
@
@
@
@
@
@
@
@
@
@

comparao simples, incondicional


Exemplo 3.4: Instrues de processa[C,N,V,Z] <-- r1-r2
mento de dados que no armazenam o
comparao com negao, condicional
resultado.
[C,N,V,Z] <-- r10-(-r12)
testa bits com valor imediato
[C,N,V,Z] <-- r10 ou_exclusivo 1
condicional
testa bits com registrador, incondicional
[C,N,V,Z] <-- r10 e_logico r8*8
testa bits com registrador, condicional
[C,N,V,Z] <-- r0 e_logico (r11 rotacionado r1 bits)

3.2.3 Instrues que armazenam o resultado


As instrues aritmticas e lgicas no ARM so
ADD (adio),
SUB (subtrao),
ADC (adio com vai-um),
SBC (subtrao com empresta-um),
RSB (subtrao reversa),
AND (e-lgico),
ORR (ou-lgico),
EOR (ou-exclusivo)
RSC (subtrao reversa com empresta-um)
BIC (desliga bit).
O formato geral dos comandos correspondentes em linguagem de
montagem

desvios e processamento de dados

33

instr{cond}{S} Rd, Rn, Operando2

onde
instr especifica a instruo e pode ser AND, EOR, SUB, RSB, ADD,
ADC, SBC, RSC, ORR ou BIC.
cond um sufixo de condio da Tabela 1.3.
S, se presente, faz com que o montador coloque o valor 1 no bit 20
da instruo (bit S na Figura 3.3), indicando que a operao deve
atualizar o valor dos bits de condio N e Z de acordo com o valor
resultante do registrador Rd. Se no presente, o bit S da instruo
0 e a operao no altera o valor de nenhum bit de condio.
Rd o registrador destino, onde o resultado da operao armazenado.
Rn um registrador, usado como primeiro operando da operao.
Operando2 especifica o segundo operando da operao, no mesmo
formato descrito na Seo 3.2.2.
O Exemplo 3.5 ilustra a sintaxe de alguns comandos de processamento de dados que armazenam o resultado em um registrador.
1
2
3
4
5
6
7
8
9
10
11

add

r1,r2,r3

subeqs r3,r7,r9,lsr r10

rsbpls r4,r6,r8,lsl #4

ands

r14,r14,#2048

@
@
@
@
@
@
@
@
@
@
@

adio, incondicional
r1 <-- r2 + r3
bits de condio no so alterados
subtrao, condicional
r3 <-- r7 + (r9 desloc. direita por r10)
bits de condio so atualizados
subtrao reversa, condicional
r4 <-- (r8 * 16) - r6
bits de condio so atualizados
e-lgico, incondicional
r14 <-- r14 & 0x800

Problema 3.1. Escrever um trecho de programa em linguagem de montagem


ARM para substituir, em uma cadeia de caracteres, toda ocorrncia do
caractere espao em branco (byte 0x20) pelo caractere - (byte 0x2d).
Suponha que o endereo da cadeia seja dado em r0 e o nmero de elementos
em r1.
O Exemplo 3.6 mostra uma soluo para o Problema 3.1. O trecho das linhas 8 a 19 substitui os caracteres conforme especificado.
Esse exemplo serve tambm para ilustrar a necessidade do uso de
instrues LDR para carregar algumas constantes em registradores.
Como nem todo valor pode ser carregado em um registrador com
endereamento imediato no ARM (com instrues MOV), se torna

Exemplo 3.5: Instrues de processamento de dados que armazenam o


resultado.

34

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

linguagens de montagem

@ Substitui caracteres (espao) por - em cadeia de caracteres


.org 0x1000
inicio:
ldr
r0,ender_cadeia
ldr
r1,tamanho_cadeia
substitui:
cmp
ble
add
mov
loop:
ldrb
cmp
streqb
cmp
bne
final:
b

@ carrega endereo de cadeia em r0, e


@ nmero de elementos da cadeia em r1

r1,#0
final
r2,r0,r1
r1,#0x2d

@ se comprimento zero,retorna

r3,[r0],#1
r3,#0x20
r1,[r0,#-1]
r0,r2
loop

@
@
@
@
@
@

continua

@ continua o programa (no mostrado)

@ r2 marca final da cadeia


@ r1 contm caractere -
examina caractere corrente
ps-indexada, r0 atualizado
caractere espao?
se sim, substitui
chegou ao final da cadeia?
no, continua

cadeia:
.ascii
"Uma cadeia de caracteres"
tamanho_cadeia:
.word
. - cadeia
ender_cadeia:
.word
cadeia
.end
...

necessrio definir uma varivel inicializada com o valor da constante,


e usar uma instruo LDR. Assim, para carregar o endereo do rtulo
cadeia no registrador r0 (linha 5), usamos uma instruo LDR cujo
operando a varivel ender_cadeia declarada nas linhas 27 e 28,
inicializada pelo montador com o endereo do rtulo cadeia. Esse
mtodo de declarar uma varivel inicializada com uma constante
utilizado com tanta frequncia que o montador do ARM oferece
uma facilidade para o programador. Se o operando de uma instruo
LDR for uma expresso constante precedido do caractere =, o montador declara automaticamente uma varivel temporria, armazena
a expresso constante no rtulo da varivel temporria, e substitui
o operando da instruo LDR pelo rtulo da varivel temporria.
Assim, para carregar no registrador r0 o valor 1005 (0x3ed, que no
pode ser montado como valor imediato em uma instruo MOV),
podemos utilizar o pseudo-comando
ldr

r0,=1005

@ carrega valor 1005 em r0

Portanto, como um rtulo uma expresso constante para o


montador, no Exemplo 3.6 podemos eliminar as linhas 27 e 28 e
substituir a linha 5 por

Exemplo 3.6: Uma soluo para o


Problema 3.1.

desvios e processamento de dados

ldr

r0,=cadeia

@ carrega endereo de cadeia em r0

O Exemplo 3.6 ilustra ainda outra facilidade oferecida pelo montador ARM: o smbolo especial . tem o valor do ponto de montagem
corrente. Isso til por exemplo para calcular o nmero de bytes de
uma cadeia de caracteres, como na linha 26: o valor da expresso
.

cadeia

o nmero de bytes da cadeia declarada na linha 24.


Problema 3.2. Traduzir o comando condicional do Exemplo 3.7, em C, para
linguagem de montagem do ARM.
1
2
3
4
5
6

Exemplo 3.7: Comando condicional


com duas expresses lgicas em C.

int x, y, z;
...
if (x==y && x==z)
x=0;
else
x=100;

O Exemplo 3.8 mostra uma soluo para o Problema 3.2. Note que
no necessrio utilizar instrues de desvio.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

x: .skip 4
y: .skip 4
z: .skip 4
...
ldr
r0,x
ldr
r1,y
ldr
r2,z
cmp
cmpeq
moveq
movne
str

r0,r1
r0,r1
r3,#0
r3,#100
r3,x

Exemplo 3.8: Uma soluo para o


Problema 3.1.

@ carrega endereo de cadeia em r0, e


@ carrega endereo de cadeia em r0, e
@ carrega endereo de cadeia em r0, e
@
@
@
@
@

primeira expresso do if
executa segunda expresso se primeira no verdadeira
prepara registrador r3 com constante
uma delas ser atribuda a x
armazena constante em x

...

Uma implementao do comando switch do Exemplo ?? utilizando


uma tabela de desvios apresentada no Exemplo 3.9.

35

36

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

linguagens de montagem

...
ldr

r0,val

@ carrega variavel de seleo


@ primeiro verificamos os limites
cmp
r0,#1000
@ menor que menor entrada na tabela?
blt
casedefault
@ sim, desvia
ldr
r1,=1005
@ maior valor, no pode ser montado imediato
cmpge r0,r1
@ compara com maior valor
bgt
casedefault
@ val maior que a maior entrada na tabela
@ r0 ser o ndice na tabela
sub
r0,r0,#1000
@ primeiro valor tem ndice zero
ldr
r1,=tab_switch
@ carrega endereo da tabela de desvios
ldr
pc,[r1,r0,lsl#2] @ desvia para seleo (pc = r1 + r0*4)
tab_switch:
.word case1000
.word case1001
.word casedefault
.word casedefault
.word case1004
.word case1005
case1000:
ldr
r0,y
str
r0,x
@ x = y
b
final
@ break
case1001:
ldr
r0,x
str
r0,y
@ y = x
b
final
@ break
case1004:
ldr
r0,x
str
r0,t
@ t = x
@ note que no h break
case1005:
mov
r0,#0
str
r0,t
@ t = 0
b
final
@ break
casedefault:
mov
r0,#0
str
r0,t
@ t = 0
str
r0,x
@ x = 0
str
r0,y
@ y = 0
final:
...

Exemplo 3.9: Implementao do


comando switch do Exemplo ?? usando
uma tabela de desvios.

4
Instrues de pilha e transferncia mltipla entre registradores e memria
As instrues de transferncia mltipla transferem um grupo de
registradores da memria para o processador ou do processador para
a memria.
A Figura4.1 mostra a codificao das instrues de transferncia
mltipla.
31

28

Cond

25 24 23 22 21 20

100

P U S W L

16

Rn

Lista de Registradores

Na Figura 2.1, o campo Cond o campo de condio, que controla


a execuo condicional da instruo, conforme descrito na Seo 1.3.
O campo Rn indica o registrador base, que contm o endereo base
do operando, utilizado no clculo do endereo efetivo do operando,
que varia de acordo com o modo de endereamento utilizado pela
instruo. Os bits P e U controlam o modo de endereamento: P
(pre/post) controla se o registrador base deve ser pr (P = 0) ou ps (P
= 1) indexado; o campo U (up/down) controla se a indexao envolve
decremento (U = 0) ou incremento (U = 1) do registrador base. O bit
W (write-back) indica se o registrador base deve ser atualizado com
a indexao; o bit L indica se a operao carrega registradores ou
armazena registradores.
O campo Lista de registradores contm um bit para cada registrador
visvel, e controla quais registradores devem ser transferidos (se o bit
correspondente for 1 na instruo, o registrador deve ser transferido).
Todos, ou um grupo de registradores, podem ser transferidos, mas
a lista no pode ser vazia (ou seja, pelo menos um bit deve ter valor
1 na instruo). Os registradores so armazenados ou carregados de
endereos consecutivos de memria.
Cada modo de endereamento tem um comando especfico em

Figura 4.1: Codificao das instrues


de transferncia mltipla.

38

linguagens de montagem

linguagem de montagem, mostrados na Tabela 4.1. Para convenincia,


cada modo de endereamento tem dois nomes: um para ser usado
quando a instruo est sendo utilizada para implementar uma pilha
e outro nome para outros usos.
Tabela 4.1: Modos de endereamento
das instrues de transferncia mltipla.

Pilha

Outros

Descrio

LDMED

LDMIB

carrega com pr incremento

LDMFD

LDMIA

carrega com ps incremento

LDMEA

LDMDB

carrega com pr decremento

LDMFA

LDMDA

carrega com ps decremento

STMFA

STMIB

armazena com pr incremento

STMEA

STMIA

armazena com ps decremento

STMFD

STMDB

armazena com pr incremento

STMED

STMDA

armazena com ps decremento

Os nomes base dos comandos em linguagem de montagem so


LDM (do ingls load multiple) e STM (do ingls store multiple). Os
sufixos IA, IB, DA e DB, usados para instrues normais (que no se
referem a pilhas), significam respectivemente incrementa depois (do
ingls increment after), incrementa antes (do ingls increment before),
decrementa depois (do ingls decrement after) e decrementa antes (do
ingls decrement before).
Nos comandos relativos a operaes de pilha, so utilizados os sufixos FD, ED, FA e EA, que se referem ao tipo da pilha implementada.
As letras F e E se referem se o ponteiro da pilha deve ser
pr-indexado (pilha cheia, do ingls Full, significando que o
espao corrente que o apontador de pilha aponta est ocupado, e
portanto necessrio pr-indexar o apontador) ou
ps-indexado (pilha vazia, do ingls Empty, significando que
o espao corrente que o apontador de pilha aponta no est ocupado).
As letras A e D se referem a uma pilha que cresce para endereos crescentes (do ingls Ascending) ou que cresce para endereos
decrescentes (do ingls Empty). Se a pilha do tipo Ascending, uma
instruo STM incrementa o registrador base, e uma instruo LDM
decrementa o registrador base. Se a pilha do tipo Descending, uma
instruo STM decrementa o registrador base, e uma instruo LDM
incrementa o registrador base.
O formato dos comandos LDM e STM em linguagem de montagem
:
LDMmodo{cond} Rn{!}, lista_de_registradores
STMmodo{cond} Rn{!}, lista_de_registradores

instrues de pilha e transferncia mltipla entre registradores e memria

onde um componente entre chaves indica um componente opcional e


modo indica o modo de endereamento, e pode ser FD, ED, FA, EA,
IA, IB, DA ou DB. O montador monta os bits P e U de acordo com o
modo de endereamento, como mostrado na Tabela 4.1.
cond um sufixo de condio da Tabela 1.3.
Rn o registrador base.
! um indicador se o registrador base deve ser atualizado. Se
presente, o montador monta o valor 1 no bit 21 da instruo (bit
W, do ingls write-back, na Figura 4.1), indicando que o registrador
Rn deve ter o valor atualizado, ao final da instruo, pelo nmero
de bytes transferidos (para mais ou para menos, dependendo do
modo de endereamento). Se ausente, o valor do registrador Rn
permanece inalterado.
lista_de_registradores uma lista delimitada por chaves ({ e }),
indicando quais registradores devem ser transferidos. Na lista, os
elementos so separados por vrgulas, e podem ser registradores
ou faixas de registradores (no formato reg-reg, como r2-r5). O
registrador de menor nmero armazenado ou carregado do
menor endereo de memria, o registrador de maior nmero
armazenado ou carregado do maior endereo de memria.
O Exemplo 4.2 ilustra a sintaxe dos comandos LDR e STR com
endereamento direto.
1
2
3

stmia
stmfd
ldmfdeq

r0,{r0-r15}
@ salva todos os registradores na memria
sp!,{r0,r1,r3} @ empilha trs registradores
sp!,{r1-r3,r14} @ desempilha quatro registradores, condicional

Para simplificar a implementao de pilhas de sistema (que utilizam o registrador SP como base e o modo de endereamento FD), o
montador aceita tambm comandos PUSH e POP similares aos utilizados pelo processador Faska. Nesse formato, o registrador base
implcito (SP e o modo de endereamento, tambm implcito, FD).
PUSH{cond} lista_de_registradores
POP{cond} lista_de_registradores

onde um componente entre chaves indica um componente opcional e


cond um sufixo de condio da Tabela 1.3.

Exemplo 4.1: Instrues LDM e STM.

39

40

linguagens de montagem

lista_de_registradores uma lista delimitada por chaves ({ e }),


indicando quais registradores devem ser transferidos, como especificado acima.
O comando
lista_de_registradores

PUSH

equivale ao comando
STMFD sp!, lista_de_registradores

e o comando
POP

lista_de_registradores

equivale ao comando
LDMFD sp!, lista_de_registradores

1
2
3

push
popgt
pop

{r0-r8}
{r0,r1,r3}
{r0-r3,r13}

@ empilha registradores de r0 a r8, incondicional


@ desempilha trs registradores, condicional
@ desempilha cinco registradores: r0 a r3, e r13

Exemplo 4.2: Instrues PUSH e POP.

5
Procedimentos
Para agilizar a execuo de chamadas de procedimento, o processador ARM no utiliza a pilha para armazenar o endereo de retorno
em chamadas de procedimento. O endereo de retorno armazenado, no momento da chamada, no registrador ligador (r14, ou lr).
A Figura5.1 mostra a codificao das instrues de chamada de
procedimento.
31

Cond

27

26

25

24

Offset

O comando em linguagem de montagem para chamada de procedimentos BL (do ingls branch and link).
O formato geral do comando em linguagem de montagem igual
ao comando de desvio com endereamento imediato (Seo 3.1.1):
BL{cond} endereo

onde
cond um sufixo de condio da Tabela 1.3.
endereo um endereo que deve estar dentro do intervalo

[pc

(224

1), pc + 224 ]

O endereo do procedimento calculado relativo ao registrador


contador de programa, pc. O montador calcula a diferena, em
complemento de dois, do ponto de montagem e do endereo do
procedimento. Como no processador ARM todos os endereos devem
ser mltiplos de quatro, os dois bits menos significativos de um
endereo so zero, e portanto no precisam ser armazenados no
campo Offset. Assim, o montador desloca, de dois bits para a direita,
o valor da diferena encontrada entre o ponto de montagem e o

Figura 5.1: Codificao das instrues


de chamada de procedimento.

42

linguagens de montagem

endereo do procedimento, e monta o valor resultante no campo


Offset.
No momento da execuo, o processador armazena o valor do
registrador contador de programa pc no registrador de ligao lr,
extrai o valor do campo Offset, estende o bit de sinal para 32 bits,
desloca esse valor que dois bits para a esquerda, adiciona com o valor
corrente do registrador contador de programa e finalmente atualiza
o valor do registrador contador de programa com o valor calculado.
A pipeline esvaziada e o processador inicia a execuo da primeira
instruo do procedimento no endereo alvo.
O Exemplo 5.1 ilustra a sintaxe do comando BL.
1
2
3
4
5
6
7

blpl Calcula
bl
Imprime
...
Calcula:
...
Imprime:
...

@ chamada de procedimento condicional


@ chamada de procedimento incondicional
@ um procedimento
@ outro procedimento

O processador ARM no necessita de uma instruo especfica


para o retorno de procedimento. Como o endereo de retorno est
no registrador lr, para retornar do procedimento basta efetuar um
desvio por registrador:
bx

lr

@ retorna de procedimento, incondicional

Problema 5.1. Escreva um procedimento Ordena que ordene um vetor de


inteiros com sinal. O endereo do vetor dado no registrador r0, e o nmero
de elementos no registrador r1.
O Exemplo 5.2 mostra uma soluo para o Problema 5.1, usando
o mtodo de ordenao por insero. Nesse mtodo, iniciamos
considerando que um sub-vetor de comprimento um (o primeiro
elemento do vetor) est ordenado. A cada passo, aumentamos o
comprimento do sub-vetor ordenado encontrando a posio correta
de mais um elemento do vetor. O exemplo inclui um cdigo em C,
usado como referncia na implementao.

Exemplo 5.1: Instrues de chamada de


procedimento.

procedimentos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

@
@
@
@
@
@
@

Exemplo 5.2: Procedimento para


ordenar um vetor de inteiros.

******
Ordena
******
Ordena vetor de inteiros com sinal
entrada: endereo do vetor em r0, nmero de bytes em r1 (r1>0)
sada: vetor ordenado crescentemente
destri: r2,r3,r4,r5,r6,r7 e flags

Ordena:
mov
for_i:
cmp
bge
ldr
mov
for_j:
subs
bmi
ldr
cmp
ble
add
str
b
end_for_j:
add
str
add
b
fim:
bx

r2,#1

@ r2 varivel i

r2,r1
fim
r4, [r0,r2,lsl#2]
r5,r2

@
@
@
@

todos os elementos foram processados?


ento terminou
val = a[i], r4 varivel val
r5 varivel j

r5,r5,#1
end_for_j
r6,[r0,r5,lsl#2]
r6,r4
end_for_j
r7,r5,#1
r6,[r0,r7,lsl#2]
for_j

@
@
@
@
@
@
@
@

passou do incio do vetor?


sim, terminou este passo
r6 a[j]
if (a[j] <= val)
encontramos a posio de val
r7 j+1
a[j+1]=a[j]
continua o for j

r5,r5,#1
r4,[r0,r5,lsl#2]
r2,r2,#1
for_i

@
@
@
@

r5 tem j+1
a[j+1]=val, coloca elemento val na posio
avana i
continua o for i

lr

@ quando terminou, retorna

@@@@@@@
@ void Ordena(int a[], int compr) {
@
int i,j,val;
@
for (i=1; i<compr; i++) {
@
val=a[i];
@
for (j=i-1; j>=0; j--) {
@
if (a[j]<=val) break;
@
a[j+1]=a[j];
@
}
@
a[j+1]=val;
@
}
@ }
@@@@@@@@

43

44

linguagens de montagem

Problema 5.2. Escreva uma funo Divide que efetue a operao de diviso
de nmeros inteiros. O dividendo dado no registrador r0, o divisor no
registrador r1. A funo deve retornar o quociente no registrador r0 e o
resto no registrador r1.
O Exemplo 5.3 mostra uma soluo para o Problema 5.2, usando
divises sucessivas. Esse mtodo simples de implementar mas no
eficiente: o nmero de subtraes realizadas igual ao valor do
quociente. Portanto, se o quociente grande, a operao muito
cara.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

@
@
@
@
@
@
@

Exemplo 5.3: Funo para dividir dois


inteiros sem sinal.

******
DivideSuc
******
Divide dois inteiros sem sinal pelo mtodo de subtraes sucessivas
entrada: dividendo em r0, divisor em r1
sada: quociente em r0, resto em r1
destri: r0,r1,r2 e flags

DivideSuc:
mov
DivSuc1:
subs
addhi
bhi
addne
moveq
mov
bl

r2,#0

@ r2 o quociente

r0,r0,r1
r2,r2,#1
DivSuc1

@
@
@
@
@
@
@

r1,r0,r1
r1,#0
r0,r2
lr

subtrai divisor do dividendo


incrementa quociente
enquando r0 > r1
armazena valores de retorno nos registradores
se dividendo ficou menor que divisor
seno resto zero
quociente em r0

Um mtodo melhor para diviso similar ao que normalmente


usamos para fazer diviso com lpis e papel: a cada iterao da
operao, subtramos a maior parcela possvel do dividendo. Por
exemplo, para dividir 237 por 5, a primeira parcela que subtramos
200 (pois 200 = divisor 40), resultando em um quociente parcial
de 40 deixando um resto igual a 37 para ser ainda dividido. Dividimos ento 37 por 5, e nessa iteraco a parcela que subtramos
30 = divisor 6, que somada primeira parcela para formar
o quociente parcial de 46, com resto 7. Dividimos ento 7 por 5, e
nessa iterao subtramos a parcela 5 = divisor 1, que somada
ao quociente parcial para formar o quociente final igual a 47 com
resto 2. Note que a cada iterao a maior parcela que subtramos na
forma de uma constante multiplicada por uma potncia de 10 (2 102 ,
3 101 , 5 100 ). Note ainda que o nmero de interaes igual a
log10 do dividendo.
O Exemplo 5.4 mostra uma soluo para o Problema 5.2 usando a
abordagem descrita acima. Como a base binria, a constante multiplicadora de cada parcela 0 ou 1. A funo inicialmente calcula
a maior parcela que pode ser subtrada, multiplicando por 2 suces-

procedimentos

45

sivamente o divisor, enquanto esse for menor do que o dividendo


(linhas 12 a 18). Ento sucessivamente subtramos as parcelas, da
maior potncia de 2 para a menor, acumulando o quociente parcial
no registrador r2 (linhas 20 a 27). O nmero de parcelas log2 do
dividendo, fazendo com que em mdia a funo do Exemplo 5.4
execute muito mais rpido do que a funo do Exemplo 5.3.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

@
@
@
@
@
@
@
@

Exemplo 5.4: Funo para dividir dois


inteiros sem sinal, otimizada.

******
Divide
******
Divide dois inteiros sem sinal pelo mtodo de subtraes sucessivas
otimizada (nmero de ubtraes log2 divisor)
entrada: dividendo em r0, divisor em r1
sada: quociente em r0, resto em r1
destri: r0,r1,r2,r3 e flags

Divide:
mov

r3,#1

@ vai conter maior potncia de 2

cmp
cmpcc
movcc
movcc
bcc

r1,#0x80000000
r1,r0
r1,r1,asl#1
r3,r3,asl#1
Div1

@
@
@
@
@

mov

r2,#0

@ r2 vai ser o quociente, inicia com zero

cmp

r0,r1

subcs
addcs
movs
movne
bne

r0,r0,r1
r2,r2,r3
r3,r3,lsr#1
r1,r1,lsr#1
Div2

@
@
@
@
@
@

mov
mov

r1,r0
r0,r2

bx

lr

Div1:
enquanto bit mais signif. do divisor no 1
e enquanto divisor menor que dividendo
desloca divisor, formando maior parcela
desloca potncia de 2

Div2:
se dividendo maior que o divisor
(na primeira e na ltima iterao no )
subtrai parcela do dividendo
conta potncia de dois no quociente
agora diminiui a potncia de 2
e divide a parcela por 2

@ terminou, armazena resto em r1


@ e quociente em r0

Div3:

Problema 5.3. Escrever um procedimento Subtrai64 que efetue a operao


de subtrao de dois valores inteiros de 64 bits, com sinal. Cada valor
armazenado em duas palavras de memria consecutivas: a palavra menos
significativa de um valor tem o menor endereo, a palavra mais significativa
tem o maior endereo. O endereo de um valor de 64 bits o endereo da
palavra menos significativa.
So dados como parmetros o endereo do minuendo em r0, o endereo do
subtraendo em r1, e o endereo de onde deve ser armazenada a diferena em
r2.
Se o procedimento do tipo folha, ou seja, no realiza nenhuma
outra chamada de procedimento, como dos exemplos anteriores, a
pilha no precisa ser utilizada para armazenar o endereo de retorno,

46

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

linguagens de montagem

@
@
@
@
@
@
@
@
@

Exemplo 5.5: Funo para subtrair dois


inteiros de 64 bits com sinal.

**********
Subtrai64
**********
Subtrai dois inteiros de 64 bits. Cada inteiro armazenado em
duas palavras consecutivas na memria.
entrada: endereo do minuendo em r0, endereo do subtraendo em r1
e endereo do resultado em r2
sada: diferena, armazenada no endereo do resultado
destri: r3,r4 e flags

Subtrai64:
ldr
ldr
subs
str
ldr
ldr
sbcs
str
bx

r3,[r0],#4
r4,[r1],#4
r3,r3,r4
r3,[r2],#4
r3,[r0],#-4
r4,[r1],#-4
r3,r3,r4
r3,[r2],#-4
lr

@
@
@
@
@
@
@
@
@

primeira palavra do minuendo, avana apontador


primeira palavra do subtraendo, avana apontador
calcula diferena
armazena primeira palavra do resultado,
e avana apontador
carrega segunda palavra do minuendo
carrega segunda palavrado subtraendo
calcula diferena, com carry da primeira
armazena segunda palavra do resultado

j que este colocado no registrador lr no momento da chamada. Se


o procedimento chama outro procedimento, o registrador lr deve ser
armazenado na pilha antes da nova chamada.
Problema 5.4. Escrever um procedimento DifAbs64 que efetue calcule
o valor absoluto da diferena dois valores inteiros de 64 bits, com sinal,
utilizando a funo Subtrai64. So dados como parmetros o endereo do
primeiro valor em r0, o endereo do segundo valor em r1, e o endereo de
onde deve ser armazenada o valor absoluto da diferea em r2.

procedimentos

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

@
@
@
@
@
@
@
@
@

********
DifAbs64
********
Calcula valor absoluto da diferena entre dois inteiros de 64 bits. Cada
inteiro armazenado em duas palavras consecutivas na memria.
entrada: endereo do operando1 em r0, endereo do operando2 em r1
e endereo do resultado em r2
sada: valor absoluto da diferena, armazenado no endereo do resultado
destri: r0,r1,r2,r3,r4 e flags

DifAbs64:
push
bl
ldr
teq
poppl
bxpl
sub
mov
str
str
mov
mov
bl
add
pop
bx

{lr}
Subtrai64
r3,[r2,#4]
r3,#0
{lr}
lr
sp,sp,#8
r3,#0
r3,[sp,#0]
r3,[sp,#4]
r0,sp
r1,r2
Subtrai64
sp,sp,#8
{lr}
lr

@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@
@

salva endereo de retorno


efetua subtrao
palavra mais significativa do resultado
testa bit de sinal
se positivo terminou, recupera end. retorno
e retorna
seno, resultado = -resultado
varivel local na pilha
para armazenar valor 0, com 64 bits
primeira palavra 0
segunda palavra 0
primeiro parmetro valor 0
segundo parmetro resultado
inverte sinal do resultado
desaloca varivel local da pilha
recupera endereo de retorno
retorna

Exemplo 5.6: Funo para calcular o


valor absoluto da diferena de dois
inteiros de 64 bits com sinal.

47

6
Entrada, Sada e Interrupes
6.1

Entrada e sada

No processador ARM a entrada e sada mapeada na memria, ou


seja, o processador ARM no tem instrues especiais para acessar
entrada e sada. Para comunicao do processador com os dispositivo
so usadas as instrues normais de acesso memria (LDR e STR).

6.2

Interrupes e Excees

Interrupes e excees no ARM so associadas aos modos de operao do processador. O ARM possui dois tipos interrupes externas:
FIQ (fast interrupt requests, interrupes rpidas) e IRQ (interrupt requests, interrupes normais), trs tipos de excees: Reset, Data abort,
Pre-fetch abort e Undefined instruction.
A Tabela 6.2 mostra as prioridades e os modos de operao que o
processador entra quando uma determinada exceo ou interrupo
ocorre.
Tabela 6.1: Interrupes e excees, e
respectivos modos de operao.

Exceo

Modo

Descrio

Reset
Data Abort
FIQ
IRQ
Prefetch Abort
SVC
Undefined
Instruction

Supervisor
Abort
FIQ
IRQ
Abort
Supervisor
Undefined

Processador est iniciando ou pino de reset do processador foi ativado.


Instruo de transferncia de dados tentou acesso em endereo ilegal.
Pino de interrupo rpida do processador foi ativado.
Pino de interrupo do processador foi ativado.
Processador tentou executar instruo em endereo ilegal.
Instruo de chamada a sistema executada.
Processador no reconhece instruo corrente.

Os tipos de interrupes e excees tm prioridades: se um tipo


mais prioritrio est sendo atendido os eventos de outros tipos ficam

50

linguagens de montagem

pendentes. Alm disso, para as interrupes externas FIQ e IRQ, a


interrupo somente tratada se o bit de controle o registrador CPSR
igual a zero, indicando que a interrupo est habilitada (bit I e F
na Figura 1.2). Caso o bit seja um a interrupo fica pendente.
Tabela 6.2: Prioridades de interrupes
e nmeros no vetor de interrupo.

Exeo

Prior.

Tipo para o vetor de interrupes

Reset
Data Abort
FIQ
IRQ
Prefetch Abort
SVC
Undefined Instruction

1
2
3
4
5
6
6

0
4
7
6
3
2
1

Quando uma interrupo aceita, o processador


muda o modo de operao para o modo correspondente ao evento;
copia o registrador CPSR no registrador SPSR do modo correspondente;
armazena o endereo endereo de retorno da interrupo no
registrador lr (r14) do modo correspondente;
desvia para o endereo tipo_da_interrupo 4 (elemento do vetor
de interrupo correspondente ao tipo da interrupo ou exceo,
mostrados na Tabela 6.2.
O vetor de interrupes no ARM tem oito palavras, cada uma
correspondendo a uma interrupo ou exceo, e normalmente est
localizado no endereo 0 da memria (pode ser mudado por programa, acessando registradores especiais do processador). Algumas
implementaes possuem um controlador de interrupes integrado,
que recebe pedidos dos dispositivos, e informa o tipo de pedido da
interrupo mais prioritrio ao processador; nesse caso, o vetor de
interrupes tem mais palavras (o nmero de interrupes distintas
depende do controlador de interrupes).
O Exemplo 6.1 mostra um trecho de programa com a inicializao
do vetor de interrupes. Como FIQ a ltima entrada do vetor,
o seu tratador pode ser colocado imediatamente aps o vetor de
interrupes. Nesse exemplo, duas formas de inicializar o vetor de
interrupes so mostradas, uma usando uma instruo de desvio
(B), e outra usando uma instruo de carga (LDR) do registrador
pc. A diferena que com uma instruo de desvio o tratador da
interrupo no pode estar muito distante, pois o endereo alvo

entrada, sada e interrupes

relativo, codificado como um valor imediato de 24 bits. J na carga


direta ao registrador pc, o tratador pode estar em qualquer endereo
da memria (mas uma palavra a mais reservada pelo montador
para armazenar o endereo do tratador).
1
2
3
4
5
6
7
8
9
10
11

.org 0
vetor_int:
b
trata_reset
ldr
pc,=trata_undef
b
trata_svc
ldr
pc,=trata_prefetch
ldr
pc,=trata_abort
.skip 4
ldr
pc,=trata_irq
trata_fiq:
...

Exemplo 6.1: Exemplo de vetor de


interrupes.
@
@
@
@
@
@
@
@
@

tipo 0, Reset
tipo 1, Undefined Instruction
tipo 2, SVC
tipo 3, Prefetch abort
tipo 4, Data abort
tipo 5, reservado
tipo 6, IRQ
tipo 7, FIQ
tratador FIQ pode ser colocado aqui

O Exemplo 6.1 tambm ilustra o caso em que a implementao


no possui controlador de interrupes (ou possui e no necessrio), de modo que FIQ a interrupo de tipo mais alto que existe.
Nesse caso, como o vetor tem apenas oito posies, o cdigo tratador
de interrupo FIQ pode ser colocado logo em seguida ao vetor, no
necessitando de uma instruo de desvio.
Para retornar do tratamento de uma interrupo ou exceo deve
ser utilizada a instruo
movs

pc,lr

que restaura o registrador de estado, copiando o registrador de


estado SPSR para o registrador de estado CPSR do modo em que
o processador estava quando a interrupo foi aceita, e desvia para
o endereo de retorno armazenado no registrador lr, voltando a
executar o cdigo interrompido.
Como cada modo de operao tem registradores sp e lr, especficos do modo, e o registrador de estado CPSR guardado no registrador SPSR do modo, todo o mecanismo de interrupo executado
com apenas um acesso memria, para carregar a instruo que desvia para o tratador. Alm disso, no modo FIQ os registradores de r8
a r12 tambm so especficos do modo, de forma que o tratador pode
utilizar esses registradores sem se preocupar em salvar registradores
de usurio, agilizando muito o processamento de interrupes.
Note ainda que, como cada modo tem o seu prprio apontador
de pilha, os tratadores podem utilizar pilhas independentes da pilha
de usurio. Obviamente, para isso necessrio que as pilhas sejam
inicializadas antes de as interrupes serem habilitadas.

51

52

linguagens de montagem

31

28

Cond

6.3

24

1111

Comentrio

Chamada a Sistema

Figura 6.1: Codificao da instruo de


chamada de chamada a sistema.

O comando em linguagem de montagem para chamada de procedimentos SVC (do ingls supervisor call), tambm chamada de SWI (do
ingls software interrupt).
O formato geral do comando em linguagem de montagem :
SVC{cond} expr24

onde
cond um sufixo de condio da Tabela 1.3.
exp24 uma expresso que deve resultar em um valor inteiro de
24 bits sem sinal. O montador avalia a expresso e monta o valor
neste campo.
O Exemplo 5.1 ilustra a sintaxe do comando SVC.
1
2
3
4
5

.equ
...
svc
svceq
...

Exemplo 6.2: Instrues de chamada a


sistema.

WRITE, 0x04
WRITE
0x7

@ chamada a sistema, incondicional


@ chamada a sistema, condicional

No momento da execuo, o processador dispara o mecanismo


de interrupo: muda para o modo Supervisor, armazena o valor do
registrador contador de programa pc no registrador de ligao lr
no novo modo (este o endereo de retorno), salva o registrador de
estado CPSR no registrador SPSR, desabilita interrupes do tipo IRQ
e executa a instruo presente na posio 2 no vetor de interrupo.
O processador ignora o valor do campo expr24 presente na instruo. Ele pode ser utilizado para passar um cdigo (por exemplo a
razo da chamada ao sistema), mas o programador deve consultar a
instruo para obter o cdigo. O programador deve nesse caso utilizar o registrador lr para acessar a instruo (a instruo de chamada
est no endereo lr-4). Uma maneira mais eficiente de comunicar o
tipo da chamada de sistema utilizar os registradores. A conveno
mais recente, para aplicaes embarcadas, utilizar o registrador r7
para indicar o tipo da chamada a sistema. Os registradores de r0 a r4
so utilizados para passar os parmetros para a chamada.
O Exemplo

entrada, sada e interrupes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

@ Programa que imprime uma mensagem na tela e termina


@ conveno Embbeded Applications Binary Interface (EABI)
msg:
.ascii
"Hello, Im ARM!\n"
len = . - msg
main:
@ syscall write(int fd, const void *buf, size_t count)
mov
r0, #1
@ descritor de arquivo (1 stdout)
ldr
r1, =msg
@ endereo do buffer
ldr
r2, =len
@ nmero de bytes
mov
r7, #4
@ write chamada a sistema de tipo 4
svc
#0
@ executa chamada
@ syscall exit(int
mov
r0, #0
mov
r7, #1
svc
#0
.end

status)
@ status de retorno 0
@ exit chamada a sistema do tipo #1
@ executa chamada, terminando o programa

53

Exemplo 6.3: Programa que imprime


mensagem e termina.