Organização Básica de
computadores e linguagem de
montagem
Prof. Edson Borin
2o Semestre de 2011
Instruções de Desvio
desvio incondicional: uma que é codificada em duas palavras, com a segunda palavra
contendo o valor do endereço alvo do desvio, e uma instrução codificada em uma
palavra, na qual o endereço alvo é dado em um registrador. O mnemônico utilizado
para as duas instruções é jmp, do inglês jump (salto).
Desvio Incondicional
JMP
Armazena byte de registrador na memória
Sintaxe
Operação
Flags
Codificação
31
jmp expr32
ip ← imd32
–
0
20
31
0
imd32
jmp rdest
ip ← rdest
Exemplo 14 desvio incondicional
–
31
0
21
rdest
3.3. INSTRUÇÕES DE DESVIO
Desvio Incondicional Direto
1
2
3
4
5
6
7
8
9
10
11
12
13
14
org
set
200h
r0, 0
jmp
fora
mov
...
org
fora:
mov
r1,
r2
;
;
;
;
;
;
;
uma instrução qualq
montada na posição
instrução de desvio
a codificação utili
primeira palavra: 2
segunda palavra: 0
esta instrução não
3000h
r2,
r1
; esta instrução é a
; executada após o de
32
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CAPÍTULO 3.
Desvio Incondicional Indireto
org
set
300h
r0, 1
jmp
r10
mov
r3,
r4
;
;
;
;
;
;
uma instrução qualque
montada na posição 30
instrução de desvio i
a codificação utiliza
21000a00h
esta instrução não é
...
org
4000h
mov
r4,
fora:
r3
; se r10 tem o valor 40
; instrução é a próxima
; após o desvio incondi
O cálculo do endereço alvo do desvio é diferente do caso do desvio incondicional, em
que o endereço alvo é um valor absoluto, dado na segunda palavra da instrução.
No caso das operações de desvio condicional, o processador utiliza o valor codificado
no campo imd8 para calcular o endereço alvo. O endereço alvo é calculado de forma
relativa ao valor corrente do registrador ip: o valor do campo imd8 , transformado em
um inteiro de 32 bits, com sinal, é adicionado ao valor corrente de ip para determinar
o novo valor de ip.
Desvios Condicionais
Jcond
Desvio condicional
Sintaxe
jcond expr8
Operação
ip ← ip + ext(imd8 )
Flags
–
Codificação
31
xx
0
imd8
No descritor, a sintaxe é dada como jcond expr8 pois no caso geral o operando
é uma expressão inteira cujo resultado deve ser possível armazenar em oito bits;
mas na grande maioria dos casos a expressão é composta de apenas um rótulo. O
montador monta, no campo imd8 , o valor da expressão (ip − endereço alvo). O valor
do campo imd8 é interpretado como um inteiro com sinal, de forma que o endereço
alvo pode ser menor ou maior do que o ip corrente, fazendo com que o fluxo do
Desvios Condicionais
34
Instr.
jc
jnc
jz
jnz
jo
jno
js
jns
jl
jle
jg
jge
ja
CAPÍTULO 3. O PROCESSADOR FAÍSKA
Nome
Cond.
Codif.
desvia se vai-um (menor sem sinal)
C=1
22h
desvia se não vai-um (maior ou igual sem sinal)
C=0
23h
desvia se zero
Z=1
24h
desvia se diferente de zero
Z=0
25h
desvia se overflow
O=1
26h
desvia se não overflow
O=0
27h
desvia se sinal igual a um
S=1
28h
desvia se sinal igual a zero
S=0
29h
desvia se menor (com sinal)
S�=O
2ah
desvia se menor ou igual (com sinal)
Z=1 ou S�=O
2bh
desvia se maior (com sinal)
Z=0 e S=O
2ch
desvia se maior ou igual (com sinal)
S=O
2eh
desvia se acima (maior sem sinal)
C=0 e S=O
2fh
Comparando números
• O Faíska (e a maioria dos microprocessadores) utiliza as
flags setadas por operações aritméticas para comparar
números.
Exemplo:
sub r2, r1 ; Modifica Carry, Zero, Sinal, Overflow
• O que acontece com a flag Z se r1 for igual a r2?
Comparando números
• Exemplo
if (a == b)
{
a = a + 1;
}
else
{
b = b - 2;
}
a: ds 4
b: ds 4
Comparando números
• Exemplo
if (a == b)
{
a = a + 1;
}
else
{
b = b - 2;
}
a: ds 4
b: ds 4
!
ld r1, a
!
ld r2, b
!
mov r0, r2
!
sub r0, r1 ; if (a==b)
!
jnz else
!
add r1, 1 ; then
!
jmp fim_se
else:
!
sub r2, 1 ; else
fim_se:
Comparando números
Exemplo:
sub r2, r1 ; Modifica Carry, Zero, Sinal, Overflow
• Vamos assumir que não houve overflow (Flag O = 0), o
que acontece com a flag S se r2 é menor do que r1?
Flag O
Flag S
0
0
0
1
1
0
1
1
Relação entre r2 e r1
Comparando números
Exemplo:
sub r2, r1 ; Modifica Carry, Zero, Sinal, Overflow
• Vamos assumir que não houve overflow (Flag O = 0), o
que acontece com a flag S se r2 é menor do que r1?
Flag O
Flag S
Relação entre r2 e r1
0
0
r2 > r1 ou r2 == r1
0
1
r2 < r1
1
0
r2 < r1
1
1
r2 > r1
Comparando números
Exemplo:
sub r2, r1 ; Modifica Carry, Zero, Sinal, Overflow
•
•
•
•
•
Flag O
Flag S
Relação entre r2 e r1
0
0
r2 > r1 ou r2 == r1
0
1
r2 < r1
1
0
r2 < r1
1
1
r2 > r1
r2 == r1 r2 < r1 r2 > r1 r2 <= r1
r2 >= r1
quando: Z == 0
quando: O != S
quando: O = S e Z != 0
quando: O != S ou Z == 1
quando: O == S
Comparando números
• Exemplo
if (a < b)
{
a = a + 1;
}
else
{
b = b - 2;
}
a: ds 4
b: ds 4
Comparando números
• Exemplo
if (a < b)
{
a = a + 1;
}
else
{
b = b - 2;
}
a: ds 4
b: ds 4
!
ld r1, a
!
ld r2, b
!
mov r0, r2
!
sub r0, r1 ; if (a==b)
!
jge else
!
add r1, 1 ; then
!
jmp fim_se
else:
!
sub r2, 1 ; else
fim_se:
Nova Instrução Aritmética
• CMP: Parecida com o SUB, mas não modifica o
registrador
dest.
3.3. INSTRUÇÕES DE DESVIO
37
CMP
Comparação
Sintaxe
cmp rdest , expr8
cmp rdest , rf onte
Operação
rdest − ext(imd8 )
rdest − rf onte
Flags
CSZO
CSZO
Codificação
31
0
14
imd8
rdest
31
0
15
rdest
Vamos re-escrever a solução para o Exemplo 18 com a instrução cmp.
rf onte
Controle do Fluxo de Execução
• Sentença condicional “Se-Então” (If-Then)
Exemplo: C/C++
...
if (x >= 10)
{
y = x;
}
x<10
...
Controle do Fluxo de Execução
• Sentença condicional “Se-Então” (If-Then)
Exemplo: C/C++
...
if (x >= 10)
{
y = x;
}
x<10
...
Exemplo: Ling. de Montagem
; x está em r1
; y está em r2
...
cmp r1, 10
jl pula ; salta se r1<10
mov r2, r1
x<10
pula:
...
• jl salta para o alvo se o resultado da última comparação
foi “menor que” assumindo números com sinal. Para
números sem sinal use “jc” (Veja o manual do Faíska)
Controle do Fluxo de Execução
• Sentença condicional “Se-Então-Senão” (If-Then-Else)
Exemplo: C/C++
...
if (x >= 10) {
y = y + 1;
}
else {
y = x;
}
...
Controle do Fluxo de Execução
• Sentença condicional “Se-Então-Senão” (If-Then-Else)
Exemplo: C/C++
Exemplo: Ling. de Montagem
...
if (x >= 10) {
y = y + 1;
x<10
}
else {
y = x;
}
...
...
cmp r1, 10
jl else
add r2, 1
jmp cont
else:
mov r2, r1
cont:
...
x<10
Controle do Fluxo de Execução
• Laço “enquanto” (while)
Exemplo: C/C++
...
i=0;
while
{
y =
i =
}
...
(i < 20)
y+3;
i+1;
i>=20
Exemplo: Ling. de Montagem
; i está em r1
; y está em r2
...
set r1, 0
; i=0
enquanto:
cmp r1, 20 ; se i >= 20
jge cont
; sai do laco
add r2, 3
; y=y+3
add r1, 1
; i=i+1
jmp enquanto
cont:
r1>=20
...
Controle do Fluxo de Execução
• Laço “para” (for)
Exemplo: C/C++
...
for (i=0; i<10; i++)
{
y = y+2; i<10
}
...
Exemplo: Ling. de Montagem
; i está em r1
; y está em r2
...
set r1, 0
; i=0
for:
cmp r1, 10 ; se i >= 10
jge cont
; sai do laco
add r2, 2
; y=y+2
add r1, 1
; i=i+1
jmp for
r1<10
cont:
...
Controle do Fluxo de Execução
• Laço “faça-enquanto” (do-while)
Exemplo: C/C++
...
i=0;
do
{
i = i+1;
} while (y < 20);
...
Exemplo: Ling. de Montagem
; i está em r1
; y está em r2
...
=> Exercício
Controle do Fluxo de Execução
• Sentenças com múltiplas condições:
Exemplo: C/C++
Exemplo: Ling. de Montagem
; x está em r1
; y está em r2
...
...
if ((x>=10) && (y<20))
cmp r1, 10
{
jl pula
; Pula se x < 10
x = y;
cmp r2, 20
}
jge pula
; Pula se y >= 20
...
mov r1, r2 ; x = y
pula:
...
Exemplo
• Exemplo 19: Escreva um trecho de programa que
determine qual o maior valor de uma cadeia de
números de 32 bits, sem sinal, cujo endereço
inicial é dado em r2. Inicialmente, r3 contém o
número de valores presentes na cadeia; suponha
que r3 > 0. Ao final do trecho, r0 deve conter o
valor máximo e r1 deve conter o endereço do valor
máximo.
Exemplo
• Exemplo 20: Escreva um trecho de programa para
mover um bloco de palavras de memória da
posição apontada por r1 para a posição apontada
por r2. O tamanho do bloco (número de palavras)
que deve ser movido é dado em r3.
Exemplo
• Exemplo 21: Escreva um trecho de programa que
verifique se uma cadeia de bytes é palíndrome (ou
seja, dá o mesmo resultado quando lida da direita
para a esquerda.