a < b - IC

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