MEMRIA
PRINCIPAL
Barramento de dados
CLOCK
Barramento de endereos
Barramento de controle
REGS. DE
REGS.
ESPECIAIS
PROPSITO
UNIDADE
GERAL
DE ENTRADA
UNID. DE
UNIDADE DE
ARITMTICA E LGICA
E SADA
CONTROLE
DISPOSITIVOS
DE E/S
Pgina 1 de 9
- UCP ou CPU
- UC
- UAL ou ULA
- RDM
- REM
- PC
- RI
- SP
Memria Principal
Memria Secundria
Unidade de E/S
Interfaces
Canais de E/S
Processadores de E/S
Dispositivos de E/S
Histrico:
Primeiros computadores eletrnicos surgiram na dcada de 30
IBM PC foi concebido em 1980
Pgina 2 de 9
1.2 Memria
Organizao da memria:
Endereo
...
4MB
...
1048576
...
1765
...
4
3
2
1
0
Contedo
...
10110101
...
01001010
...
01001101
...
01010000
11111111
11101001
11011010
01100100
Pgina 3 de 9
...
...
RDM
REM
PC
RI
SP
UNID. DE
UNIDADE DE
ARITMTICA E LGICA
CONTROLE
Pgina 4 de 9
Operao
Armazena o contedo de AX na
palavra de memria de endereo 0
Comentrios
MOV AX,A
ADD AX,4h
MOV A, AX
Observa-se que:
para cada instruo em linguagem montadora corresponde apenas uma
instruo em linguagem de mquina;
uma instruo em linguagem de mquina pode corresponder a mais de um
byte;
a programao em linguagem de mquina tediosa e suscetvel a erros.
Pgina 5 de 9
O fluxograma:
Incio
Apresentar um prompt
Mudar de linha
Fim
Pgina 6 de 9
Pgina 7 de 9
Explicando as partes:
a) O programa inicia sua operao ao ser lanado pelo DOS.
b) O usurio estimulado a interagir pela apresentao de um ?:
MOV AH,2
MOV DL,'?'
INT 21h
Pgina 8 de 9
Tente com outras letras ou procure modificar o programa para obter outros
efeitos com caracteres digitados no teclado.
Pgina 9 de 9
Byte
Word
= 2 bytes = 16 bits
Posio de bits:
Para 1 byte:
Para 1 word:
7 6 5 4 3 2 1 0
0 1 0 1 0 1 0 1
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
byte alto (high byte)
| byte baixo (low byte)
Obs:
Words so armazenados em bytes consecutivos em memrias de 8 bits.
Byte baixo
= byte inferior ou byte de menor ordem -> endereo N
Byte alto
= byte superior ou byte de maior ordem -> endereo N+1
Pgina 1 de 9
b) 1 word
0101011101101110b
b) word
0573268
Pgina 2 de 9
= 13.161 + 5.160
= 208 + 80 = 288d
= 1101_0101b = 11010101b
b) word
A03916
Procedimento
Pgina 3 de 9
Exemplo 1: 01110001b
valor no sinalizado = 0.27 + 1.26 + 1.25 + 1.24 + 0.23 + 0.22 + 0.21 + 1.20
= 64 + 32 + 16 + 1 = 113d
valor sinalizado
logo: +113d
Exemplo 2: 10110001b
valor no sinalizado = 1.27 + 0.26 + 1.25 + 1.24 + 0.23 + 0.22 + 0.21 + 1.20
= 128 + 32 + 16 + 1 = 177d
valor sinalizado
10110001
01001110
1_
01001111
magnitude (7 bits)
Pgina 4 de 9
logo: - 79d
Exemplo 3: 70FFh
= 0111000011111111b
valor sinalizado
Exemplo 4: C777h
= 1100011101110111b
positivo, 2 bytes
positivo, 3 dgitos hexa, 2 bytes, byte alto 0Eh, byte baixo F0h
positivo, 1 byte, 01h
positivo, se 2 bytes => 0000000010000000b
negativo, se 1 byte => 10000000b
negativo, byte alto 80h, byte baixo 00h
negativo
negativo
Pgina 5 de 9
Pgina 6 de 9
Ler a varivel A
Ler a varivel B
Somar A + B
Pgina 7 de 9
Pgina 8 de 9
Pgina 9 de 9
Processador Co-proc.
4004
8008
8080
8085
8086
8088
186
188
286
386 (368 DX)
386 SX
486 (486 DX)
486 SX
486 DX2
486 DX4
Pentium
Pentium
Celeron
Pentium Pro
Pentium 2
Pentium 3
Pentium 4
8087
8087
8087
8087
287
387
387 SX
487 SX
-
Ano de
introduo
1971
1972
1974
1978
1978
1979
1982
1982
1982
1985
1988
1989
1991
1992
1993
1993
No.
de bits
4
8
8
8
16
8 (16)
16
8 (16)
16
32
16 (32)
32
32
32
32
32/64
No. de
Velocidade
transistores
(MHz)
2.205
3.300
4.500
6.200
29.000
4,77 a 10
29.000
4,77 a 10
100.000
8 a 16
100.000
8 a 16
134.000
8 a 12,5
375.000
16 a 40
375.000
16, 20
1.200.000
25, 33, 50
1.200.000
20, 25
?
66
?
99
3.100.000
60, 66, 90
Pesquise e ...
Complete !
1 GHz ?
Pgina 1 de 11
Pgina 2 de 11
Pgina 3 de 11
BX (base) ->
Pgina 4 de 11
endereado por
"
"
"
CS
DS
SS (stack segment)
ES
IP (instruction pointer)
Pgina 5 de 11
Pgina 6 de 11
organizao:
1 registrador de 16 bits
6 FLAGS de estado
3 FLAGS de controle
7 bits no utilizados (sem funo)
15 14 13 12
11 10 9
OF DF IF
8
7
TF SF
6
ZF
Pgina 7 de 11
4
AF
2
PF
0
CF
Registradores de dados
AH
BH
CH
DH
AL
BL
CL
DL
AX
BX
CX
DX
Registradores de segmentos
CS
DS
SS
ES
Registradores ndices e
apontadores
SI
DI
SP
BP
IP
Registrador de sinalizadores
FLAGS
Pgina 8 de 11
Apndice
Gerenciamento de memria por segmentao
->
->
->
->
00000h
00001h
00002h
00003h
->
FFFFFh
Segmento de memria:
Pgina 9 de 11
->
segmento:offset
Exemplo de endereamento
8350:0420h
segmento no.
deslocamento
8350h
0420h
Graficamente:
8
19
0 |0
43 0
15
15
8
19
15
0 CS (base)
0 IP (offset)
0
para a memria
Pgina 10 de 11
Identificador Identificador
de segmento alternativo
CS
SS
DS
CS, SS, ES
DS
CS, SS, ES
ES
-
Offset
IP
SP, BP
*
SI
DI
ex:
base
offset
028Ch
0003h
028C3h
base
offset
0287h
0053h
028C3h.
Pgina 11 de 11
Declaraes (statements):
instrues, que so convertidas em cdigo de mquina
diretivas, que instruem o montador a realizar alguma tarefa especfica:
- alocar espao de memria para variveis
- criar uma sub-rotina (procedure ou procedimento)
[Cod. oper.]
[Operando(s)] [;Comentrio]
Exemplo:
INICIO:
MOV
CX,5h
;inicializar contador
Pgina 1 de 30
O campo Nome:
Pode ser um rtulo de instruo, um nome de sub-rotina, um nome de
varivel, contendo de 1 a 31 caracteres, iniciando por uma letra e contendo
somente letras, nmeros e os caracteres ? . @ _ : $ % .
Obs: o Montador traduz os nomes por endereos de memria.
Exemplos:
nomes vlidos
LOOP1:
.TEST
@caracter
SOMA_TOTAL4
$100
nomes invlidos
DOIS BITS
2abc
A42.25
#33
instrues
MOV
ADD
INC
JMP
diretivas
.MODEL
.STACK
nome PROC
Pgina 2 de 30
Campo de operandos:
Instrues podem conter 0, 1 ou 2 operandos no 8086.
Exemplos:
NOP
INC AX
ADD
A,2d
Pgina 3 de 30
Campo de comentrio:
- um ponto-e-vrgula ( ; ) marca o incio deste campo;
- o Montador ignora tudo aps o este marcador;
- comentrios so opcionais.
Exemplos:
MOV CX,0
;movimenta 0 para CX (bvio!)
MOV CX,0
;CX conta no. de caracteres, inicialmente vale 0
;
(linhas em branco: separao)
;
;
(linha inteira de comentrio)
;inicializao dos registradores
Pgina 4 de 30
1110101b
ou
1110101B
- decimal:
- hexa:
64223h ou 64223H
0FFFFh comea com um decimal e termina com h
1B4Dh
Caracteres ASCII:
Caracteres isolados ou strings de caracteres devem estar escritos dentro
de aspas simples ( ) ou duplas ( ).
Exemplos:
A ou A
ola, como vai
EXEMPLO
Pgina 5 de 30
Variveis:
Varivel um nome simblico para um dado atualizvel pelo programa.
cada varivel possui um tipo e recebe um endereo de memria;
usa-se pseudo-instrues para definir o tipo da varivel;
o Montador atribui o endereo de memria.
Pseudoinstruo
DB
DW
DD
DQ
DT
Entende-se por
define byte (8 bits)
define word (16 bits, 2 bytes consecutivos)
define doubleword (2 palavras, 4 bytes consecutivos)
define quadword (4 palavras, 8 bytes consecutivos)
define ten bytes (10 bytes consecutivos)
DB
valor_ inicial
DB
DB
DB
DB
0
10h
0150h
?
Exemplos:
Alfa
A
B
BIT
;equivale a 00h
;ilegal, por que?
;no inicializada
Pgina 6 de 30
DW
valor_inicial
WORD1
CONTA
C
DW
DW
DW
0h
0150h
?
;equivale a 0000h
;OK!, por que?
;no inicializada
WORD1
DW
1234h
Exemplos:
10h,20h,30h
1000h,123h,0h,0FFFFh
abC
61h,62h,43h
Pgina 7 de 30
DB
Alo!, 0Ah,0Dh,$
O caracter '
$' marca o fim de umstring de caracteres e no exibido.
Constantes:
Constante um nome simblico para um dado de valor constante, que seja
muito utilizado num programa.
Para atribuir um nome a uma constante, utiliza-se a pseudo-instruo EQU
(equates -> igual a) e a sintaxe:
Nome
EQU
valor_da_constante
LF
CR
LINHA1
EQU
EQU
EQU
0Ah
;caracter Line Feed como LF
0Dh
;caracter Carriage return como CR
Digite seu nome completo
MENSAGEM
DB
LINHA1,LF,CR
Exemplos:
Observao:
Constantes no geram cdigo de mquina.
Pgina 8 de 30
Operando fonte
Reg. de dados
Reg. de segmento
Posio de memria
Constante
Operando destino
Registrador de Registrador de
dados
segmento
sim
sim
sim
no
sim
sim
sim
no
Posio de
memria
sim
sim
no
sim
MOV AH,A
MOV AH,41h
MOV AH,BL
MOV AX,CS
Pgina 9 de 30
Depois
AX
0006h
AX
8FFFh
WORD1
8FFFh
WORD1
8FFFh
MOV AX,WORD2
MOV WORD1,AX
;instruo invlida
;esta restrio contornada como segue
;
;
;
;primeiro o contedo de WORD2 vai para AX
;depois, o contedo de AX movido para a
;posio de memria WORD1
Pgina 10 de 30
XCHG destino,fonte
Usada para trocar dados (nos dois sentidos) entre:
registrador e registrador
registrador e uma posio de memria
no permitido trocas diretas entre posies de memria
Combinaes legais de operandos:
Operando fonte
Reg. de dados
Reg. de segmento
Posio de memria
Operando destino
Registrador
Posio de
de dados
memria
sim
sim
no
no
sim
no
XCHG AH,BL
Depois
AH
14h
AL
FFh
AH
E0h
AL
FFh
BH
C2h
BL
E0h
BH
C2h
BL
14h
Pgina 11 de 30
ADD destino,fonte
SUB destino,fonte
Usadas para adicionar (ou subtrair) dados entre:
registrador e registrador
registrador e uma posio de memria
adicionar (ou subtrair) um nmero diretamente a (de) um registrador ou
posio de memria
Combinaes legais de operandos:
Operando fonte
Reg. de dados
Posio de memria
Constante
Operando destino
Registrador
Posio de
de dados
memria
sim
sim
sim
no
sim
sim
ADD BX,AX
ADD AX,WORD1
SUB WORD2,AX
SUB BL,5
Pgina 12 de 30
Depois
AX
0006h
AX
0009h
DX
0003h
DX
0003h
Obs 1:
ADD BYTE1,BYTE2 ;instruo invlida
;esta restrio contornada como segue
;
;
;
MOV AL,BYTE2
;primeiro o contedo de BYTE2 vai para AL
ADD BYTE1,AL
;depois, o contedo de AL somado ao da
;posio de memria BYTE1, resultado final
;em BYTE1
Pgina 13 de 30
INC destino
DEC destino
Usadas para adicionar 1 (incrementar) ou subtrair 1 (decrementar) ao/do
contedo de:
um registrador
uma posio de memria
Exemplos:
INC CX
;incrementa o contedo de CX
INC WORD1
DEC BYTE2
DEC CL
Depois
BYTE1
06h
BYTE1
07h
Pgina 14 de 30
NEG destino
Usada para substituir o contedo destino pelo seu complemento de 2,
operando sobre:
um registrador
uma posio de memria
Exemplos:
NEG BX
NEG WORD1
Depois
BX
0002h
BX
FFFEh
Pgina 15 de 30
Modelos de memria
O tamanho que os segmentos de cdigo e de dados devem ter especificado
pelo modelo de memria por meio da diretiva .MODEL.
Sintaxe:
.MODEL modelo_de_memria
Modelo
Descrio
SMALL
Cdigo em 1 segmento;
Dados em 1 segmento
MEDIUM Cdigo em mais de 1 segmento;
Dados em 1 segmento
COMPACT Cdigo em 1 segmento;
Dados em mais de 1 segmento
LARGE
Cdigo em mais de 1 segmento;
Dados em mais de 1 segmento;
Nenhum array maior que 64 Kbytes
HUGE
Cdigo em mais de 1 segmento;
Dados em mais de 1 segmento;
Arrays maiores que 64 Kbytes
Obs:
Pgina 16 de 30
Segmento de dados
- Contem a definio e declarao das variveis.
- Pode-se tambm fazer a atribuio de smbolos para constantes.
Sintaxe:
Exemplo:
.DATA
.DATA
WORD1
BYTE1
MENSAGEM
LF
DW
DB
DB
EQU
A8h
5
Isto e uma mensagem
0Ah
.STACK
tamanho
Exemplo:
.STACK 100h
Pgina 17 de 30
Segmento de cdigo
- Contem propriamente as instrues do programa
- Dentro do segmento de cdigo, as instrues so organizadas em
procedures ou procedimentos.
Sintaxe:
.CODE
Exemplo:
.CODE
nome
PROC
;
;corpo da procedure -> instrues
;
nome ENDP
;
;outras procedures seguem abaixo, se existirem
onde:
Pgina 18 de 30
TITLE nome_do_programa
.MODEL
SMALL
.STACK100h
.DATA
;
;definio dos dados: variveis e constantes
;
.CODE
EXEMPLO PROC
;
;seqncia de instrues
;
EXEMPLO ENDP
;
;segue outras rotinas ou partes do programa
;
END EXEMPLO
Obs:
na primeira linha tem-se a diretiva TITLE seguida do nome do programa;
na ltima linha tem-se a diretiva END, seguida do nome da procedure
principal;
se no houver definio de procedure, usa-se apenas END.
Pgina 19 de 30
INT 21h
AH = 1h
AL = cdigo ASCII do caracter digitado no teclado
AH = 2h
DL = cdigo ASCII do caracter a exibir
exibio na tela do monitor
Pgina 20 de 30
Exemplos:
a) Trecho padro de programa para providenciar a entrada de um caracter
ASCII pelo teclado:
MOV
AH,1h
INT
21h
AH,2h
DL,?
21h
Smbolo
Funo
BEL
BS
HT
LF
CR
Pgina 21 de 30
AH = 4Ch
Resultado:
AH = 9h
DX = offset do endereo onde comea o string
Resultado:
string exibido
Obs: o string de caracteres deve terminar com o caracter $, que marca o fim
da sequncia e no exibido.
Pgina 22 de 30
AX,@DATA
DS,AX
Pgina 23 de 30
Funo:
Caractersticas desejveis:
- Permitir representaes simblicas de rtulos, cdigos de instruo e
operandos.
- Aceitar comentrios, para facilitar a documentao.
- Aceitar representao de nmeros em vrias bases numricas.
- Aceitar pseudo-instrues, que definem localizaes (rtulos),
reservam memria, equacionam smbolos, etc., mas no geram cdigo
de mquina.
Processo de montagem:
- Converso de cdigos mnemnicos em seus equivalentes cdigos
binrios.
- Converso de nmeros decimais, hexadecimais e octais em seus
equivalentes binrios.
- Atribuio de endereos para as instrues do programa principal e
das subrotinas.
- Atribuio de endereos na memria para as palavras de dados.
Pgina 24 de 30
Macro instrues:
So instrues simblicas definidas pelo usurio, que englobam vrias
instrues em linguagem de montagem. Quando invocadas, so
traduzidas pelo montador (expandidas) em mais de um cdigo de
mquina.
Pgina 25 de 30
O processo de montagem
Editor
Programa
fonte em
mnemnicos
Arquivo texto
*.ASM
Verificao da
sintaxe da
instruo
Montador
(Assembler)
Busca do
cdigo em
Ling. de Mq.
Arquivo
intermediro
*.OBJ
Programa em
Linguagem de
Mquina
Lincador
(Linker)
Arquivo
executvel
*.EXE
Pgina 26 de 30
4.7 Exemplos.
a) Programa para imprimir um string de caracteres.
TITLE PROGRAMA PARA EXIBICAO DE 'STRING' NO MONITOR
.MODEL SMALL
.STACK 100h
.DATA
MENSAGEM
DB
'ALO! Como voces estao indo?$'
.CODE
MAIN PROC
;
;inicializando o registrador DS
;
MOV AX,@DATA
MOV DS,AX
;segmento de dados inicializado
;
;obtendo o offset da posio de memria de MENSAGEM
;
LEA DX,MENSAGEM
;offset do endereo vai para DX
;
;exibindo a MENSAGEM
;
MOV AH,9
;funcao DOS para exibir 'string'
INT 21h
;exibindo
;
;retorno ao DOS
;
MOV AH,4Ch
;funcao DOS para saida
INT 21h
;saindo
MAIN ENDP
END MAIN
Pgina 27 de 30
EQU
EQU
0DH
0AH
DB
DB
Obs: quando for exibida a MENSAGEM2, INT 21h continua ativa pois no h o
caracter $, permitindo que a varivel CHAR seja exibida em seguida.
Pgina 28 de 30
Pgina 29 de 30
2) Escreva um programa para (a) questionar o usurio sobre suas iniciais (trs
por exemplo), (b) ler as iniciais e (c) exibi-las de cima para baixo, em linhas
separadas e na margem esquerda da tela.
3) Escreva um programa para ler um dgito hexadecimal de A a F (maisculo)
e exibi-lo em decimal na prxima linha. Utilize mensagens convenientes.
Sugesto:
Entre um digito hexa: C
O seu valor decimal vale: 12
Pgina 30 de 30
organizao:
15 14 13 12
Nome
Carry Flag
Parity Flag
Auxiliary Carry
Zero Flag
Sign Flag
Overflow Flag
1 registrador de 16 bits
6 FLAGS de estado
3 FLAGS de controle
7 bits no utilizados (sem funo)
11 10 9
OF DF IF
8
TF
7
SF
6 5
ZF
4 3
AF
2
1
PF
0
CF
Flags de estado
Smbolo
Funo/caracterstica
CF
Indicador de "vai-um"
PF
Indicador de nmero PAR de 1's no byte inferior
AF
Indicador de "vai-um" para operaes em BCD
ZF
Indicador de "zero" na ltima operao
SF
Indicador de resultado negativo
OF
Indicador de erro de transbordamento
Pgina 1 de 4
Overflow ->
Tipos
8 bits
16 bits
No-sinalizado
Sinalizado (C2)
0 a 255
-128 a +127
0 a 65.535
- 32.768 a + 32.767
Pgina 2 de 4
FFh
01h
1111 1111b
+ 0000 0001b
1 0000 0000b
->
repres. no-sinalizada
repres. sinalizada
255
-1
+
1
+1
256 (fora da faixa) 0 (OK)
ADD AL,BL
7Fh
7Fh
0111 1111b
+ 0111 1111b
0 1111 1110b
->
repres. no-sinalizada
127
+
127
254 (OK)
repres. sinalizada
+ 127
+ 127
254 (fora)
->
->
Pgina 3 de 4
Flags afetados
nenhum
nenhum
nenhum
todos
todos, exceto CF que no afetado
todos, CF=1 se o resultado no for zero
Exemplos:
;onde ambos AX e BX valem FFFFh
ADD AX,BX
FFFFh
FFFFh
FFFEh
Como resultado:
CF = 1
PF = 0
AF = 1
SF = 1
ZF = 0
OF = 0
INC AL
FFh
01h
100h
Como resultado:
1111 1111 b
1b
1 0000 0000 b
CF = no afetado
PF = 1
AF = 1
SF = 0
Pgina 4 de 4
ZF = 1
OF = 0
Pgina 1 de 12
Operando destino
Registrador de
Posio de
dados
memria
sim
Sim
sim
No
sim
Sim
(destino) - (fonte)
;compara os contedos de DX e BX
CMP AX,WORD1
CMP AH,A
Pgina 2 de 12
Pgina 3 de 12
Descrio
Condies
Saltos sinalizados
JG
ou salto se maior do que
OU
JNLE
salto se no menor do que ou igual a
JGE
ou salto se maior do que ou igual a
OU
JNL
salto se no menor do que
JL
ou salto se menor do que
OU
JNGE
salto se no maior do que ou igual a
JLE
ou salto se menor do que ou igual a OU
JNG
salto se no maior do que
Saltos no-sinalizados
JA
ou salto se acima de
JNBE
salto se no abaixo de ou igual a
JAE
ou salto se acima de ou igual a
JNB
salto se no abaixo de
JB
ou salto se abaixo de
JNAE
salto se no acima de ou igual a
JBE
ou salto se abaixo de ou igual a
JNA
salto se no acima de
OU
SF OF
ZF = 1 OU
SF OF
OU
CF = 0
ZF = 0
CF = 0
OU
CF = 1
OU CF = 1
ZF = 1
Pgina 4 de 12
ZF = 0 E
SF = OF
SF = OF
ZF = 1
ZF = 0
CF = 1
CF = 0
OF = 1
OF = 0
SF = 1
SF = 0
PF = 1
PF = 0
OU
Pgina 5 de 12
ABAIXO:
CONTINUA:
...
;mais do que 126 bytes de instrues: limitao para JXXX
...
;corpo de algum lao
;
DEC CX
JNZ ABAIXO
JMP CONTINUA
JMP TOPO
MOV ...
;programa continua
...
Pgina 6 de 12
rtulo_de_destino
Tem como contador implcito o registrador CX, que deve ser inicializado
antes do lao.
Salta para rtulo_de_destino enquanto o contedo de CX no for zero.
Quando CX = 0, a prxima instruo aps LOOP ser executada.
CX decrementado automaticamente quando LOOP executada.
Nenhum FLAG afetado.
Exemplo de instrues vlidas:
LOOP
PT1
LOOP
TOPO
LOOP
RETORNO
TOPO:
TOPO:
Pgina 7 de 12
Pgina 8 de 12
Apndice
Algumas estruturas de linguagens de alto nvel
1) Estrutura IF - THEN - ELSE
Em linguagem de alto nvel:
IF
(condio)
THEN
(seqncia 1)
ELSE
(seqncia 2)
END_IF
AL (menor ou igual a) BL
THEN
(exibir AL)
ELSE
(exibir BL)
END_IF
Em linguagem montadora:
....
;if AL menor ou igual a BL
MOV AH,2h
CMP AL,BL
JA TROCA
;then
MOV DL,AL
INT 21h
JMP FIM
;else
TROCA: MOV DL, BL
INT 21h
;end_if
FIM:
.....
Pgina 9 de 12
2) FOR loop
Em linguagem de alto nvel:
FOR
(nmero_de_vezes)
DO
(seqncia de instrues)
END_FOR
Exemplo: Exiba uma seqncia de 80 asteriscos no monitor de vdeo.
Em linguagem de alto nvel:
FOR
(80 vezes) DO
(exibir * )
END_FOR
Em linguagem montadora:
...
;for 80 vezes
MOV CX,80d
MOV AH,2h
MOV DL, *
;do
TOPO:
INT 21h
LOOP TOPO
;end_for
...
Exerccio: modifique o programa que exibe todos os caracteres ASCII (pgina
1 deste captulo), utilizando apenas a instruo LOOP.
Pgina 10 de 12
3) WHILE loop
Em linguagem de alto nvel:
WHILE
(condio_verdadeira)
DO
(seqncia de instrues)
END_WHILE
Exemplo: Ler caracteres ASCII do teclado, contando sua quantidade, at que
o caracter Carriage Return (CR) aparea.
Em linguagem de alto nvel:
WHILE
(caracter diferente de CR)
DO
(ler caracter do teclado e armazen-lo)
(contador = contador +1)
END_WHILE
Em linguagem montadora:
...
MOV DX,0h
MOV AH,1h
INT 21h
;while
LOOP:
CMP AL,0Dh
JE FIM
MOV (algum lugar), AL
INC DX
INT 21h
JMP LOOP
;end_while
FIM:
;inicializao do contador
;l o primeiro caracter em AL
; o caracter CR?
;salto quando caracter igual a CR
;salvando o caracter lido
;conta nmero de caracteres
;l o prximo caracter em AL
;fecha o lao WHILE
Pgina 11 de 12
4) REPEAT loop
Em linguagem de alto nvel:
REPEAT
(seqncia de instrues)
UNTIL
(condio_verdadeira)
;inicializao
;l um caracter em AL
;salvando o caracter lido
;conta nmero de caracteres
; o caracter CR?
;salto enquanto caracter no CR
Pgina 12 de 12
b
0
1
0
1
a AND b
0
0
0
1
a OR b
0
1
1
1
a XOR b
0
1
1
0
a
0
1
NOT a
1
0
Pgina 1 de 22
AND destino,fonte
OR destino,fonte
XOR destino,fonte
Operando fonte
Reg. de dados
Posio de memria
Constante
Operando destino
Registrador
Posio de
de dados
memria
sim
sim
sim
no
sim
sim
Flags afetados:
SF, ZF, PF refletem o resultado (armazenado no operando destino)
AF no afetado
CF e OF ficam em zero, ou seja, so resetados
AND CH,01h
OR WORD1,BX
Pgina 2 de 22
Depois
BL
AAh = 1010 1010b
BL
0Ah = 0000 1010b
AL
0Fh = 0000 1111b
AL
0Fh = 0000 1111b
=0
= bit(x)
= bit(x)
bit(x) AND 1
bit(x) OR 1
bit(x) XOR 1
= bit(x)
=1
= complemento do bit(x)
Criao de mscaras: padro de "0" e "1" para manipular bits por meio de
operaes lgicas.
AND pode ser utilizado para zerar (clear ou reset) bits especficos: basta
ter um 0 na posio que se deseja este efeito.
OR pode ser utilizado para setar (set) bits especficos: deve-se ter um 1 na
posio em que se deseja este efeito.
Pgina 3 de 22
Exemplos de mscaras:
1) Setar os bits MSB e LSB do registrador AX, dado AX = 7444h:
OR AX,8001h
AX (antes)
8001h
AX (depois)
->
->
->
7444h
->
->
F445h
OR______________________________________
->
->
0011 0111b
0000 1111b
->
->
0000 0111b
->
AND_______________________
Obs: nesta converso, tem-se apenas que zerar (resetar) os 4 ltimos bits.
3) Convertendo letra minscula em maiscula, supondo o caracter em AL:
AND AL,0DFh
AL (antes)
DFh
AL (depois)
->
->
0110 0001b
1101 1111b
->
61 h = "a"
->
0100 0001b
->
41h = "A"
AND_______________________
Obs: para esta converso, tem-se apenas que zerar (resetar) o bit 5 de AL.
Pgina 4 de 22
->
->
->
7444h
->
->
0000h = 0
XOR_____________________________________
SUB AX,AX
->
->
->
7444h
->
->
7444h (no 0)
OR______________________________________
Obs:
esta operao deixa o registrador CX inalterado
modifica o FLAG ZF somente quando o contedo de CX realmente zero
esta forma mais rpida de executar do que CMP CX,0000h.
Pgina 5 de 22
NOT destino
Usada para aplicar o operador lgico NOT em todos os bits de:
um registrador
uma posio de memria
o resultado a complementao (inverso) de todos os bits
Flags afetados: nenhum
Exemplos de instrues vlidas:
NOT AX
NOT AL
NOT BYTE1
Depois
BYTE1
81h = 1000 0001b
BYTE1
7Eh = 0111 1110b
Pgina 6 de 22
TEST destino,fonte
Usada para aplicar o operador lgico AND entre:
registrador e registrador
registrador e uma posio de memria
o operando fonte pode ser tambm uma constante
sem afetar o operando destino (no armazena o resultado do AND).
Combinaes legais de operandos:
Operando fonte
Reg. de dados
Posio de memria
Constante
Operando destino
Registrador
Posio de
de dados
memria
sim
sim
sim
no
sim
sim
Flags afetados:
SF, ZF, PF refletem o resultado (armazenado no operando destino)
AF no afetado
CF e OF ficam em zero
Exemplos de instrues vlidas:
TEST AX,BX
TEST AL,01h
Pgina 7 de 22
Depois
AX
4444h = 0100 0100 0100 0100b
AX
0100 0100 0100 0100b
ZF
0
ZF
1
Pgina 8 de 22
Pgina 9 de 22
Significado
Shift Left - deslocamento para a esquerda
Shift Arithmetic Left - deslocamento aritmtico para a esquerda
Shift Right - deslocamento para a direita
Shift Arithmetic Right - deslocamento aritmtico para a direita
Flags afetados:
SF, ZF, PF refletem o resultado da ltima rotao
AF no afetado
CF contem o ltimo bit deslocado para fora
OF = 1 se ocorrer troca de sinal aps o ltimo deslocamento
Exemplos de instrues vlidas:
SHL AX,1
SAL BL,CL
SAR DH,1
Pgina 10 de 22
Mecnica de deslocamento
(ver figura 7.2 na pgina 123, figura 7.3 na pgina 124 e 7.4 na pgina 125 do livro-texto)
Pgina 11 de 22
Exemplos:
1) Multiplique o contedo de AX por 8, supondo AX contendo 0005h = 5d:
AX (original)
= 5d
= 10d
= 20d
= 40d
trecho de programa:
...
MOV
SHL
...
CL,3
AX,CL
0000 1001= 9d
0000 0100= 4d
CF = 1
Obs: pelo fato do nmero 9 ser impar, sua diviso por dois foi arredondada
para o inteiro imediatamente inferior.
trecho de programa:
...
MOV
SAR
...
CL, 02
DH,CL
Pgina 12 de 22
Significado
Rotate Left - rodar para a esquerda
Rotate Right - rodar para a direita
Rotate Carry Left - rodar para a esquerda atravs do flag CF
Rotate Carry Right - rodar para a direita atravs do flag CF
Flags afetados:
SF, ZF, PF refletem o resultado da ltima rotao
AF no afetado
CF contem o ltimo bit deslocado para fora
OF = 1 se ocorrer troca de sinal aps a ltima rotao
Exemplos de instrues vlidas:
ROL AX,1
ROR BL,CL
RCR DH,1
Pgina 13 de 22
Mecnica de rotao
(ver figura 7.5 na pgina 126, figura 7.6 na pgina 127, 7.7 na pgina 128 e figura 7.8 na pgina 129 do livro-texto)
Pgina 14 de 22
Exemplos:
1) Conte o nmero de bits "1's" presentes em AX, sem destru-lo:
Utilizando:
- CX como contador de bits
- BL como contador de "1's"
TOPO:
PT1:
...
XOR BL,BL
MOV CX,16
ROL AX, 1
JNC PT1
INC BL
LOOP TOPO
...
TOPO:
...
XOR BL,BL
MOV CX,8
SHL AL,1
RCR BL,1
LOOP TOPO
MOV AL,BL
...
Pgina 15 de 22
Pgina 16 de 22
;for 16 vezes do
PT1:
;if CF = 1
;then
;else
PT2:
;end_if
;end_for
...
MOV CX,16
MOV AH,02h
ROL BX,1
JNC PT2
;salta se CF = 0
;como CF = 1
;exibe na tela "1" = 31h
;como CF = 0
;exibe na tela "0" = 30h
LOOP PT1
;repete 16 vezes
...
Pgina 17 de 22
Pgina 18 de 22
Pgina 19 de 22
;for 4 vezes do
TOPO:
...
MOV CH,4
MOV CL,4
MOV AH,2h
MOV DL,BH
SHR DL,CL
;if DL , 10
ADD DL,30h
JMP PT1
LETRA:
ADD DL,37h
PT1:
INT 21h
ROL BX,CL
DEC CH
JNZ TOPO
;exibe
;roda BX 4 casas para a direita
...
;programa continua
;then
;else
;end_if
;end_for
Pgina 20 de 22
Pgina 21 de 22
0000 0100= 4d
com resto
0000 0010= 2d
BL =
Pgina 22 de 22
8. A pilha e subrotinas
8.1 Organizao da Pilha (stack)
Stack:
estrutura de dados de uma dimenso organizada em algum trecho
(segmento) da Memria;
o primeiro item adicionado o ltimo a ser removido (first-in, last-out);
a posio da pilha mais recentemente acrescida o topo da pilha.
Declarao do segmento de pilha:
.STACK 100h
PUSH fonte,
PUSHF
POP destino,
POPF
Pgina 1 de 10
onde fonte :
um registrador de 16 bits
uma palavra de memria ou varivel de 16 bits (de tipo DW)
A execuo de PUSH resulta nas seguintes aes:
o registrador SP (stack pointer) decrementado de 2
uma cpia do contedo da fonte armazenado na pilha de forma que
- a posio SS:SP
-> armazena o byte baixo da fonte
- a posio SS:(SP + 1) -> armazena o byte alto
o contedo da fonte no alterado
A execuo de PUSHF , que no possui operando, resulta:
o registrador SP (stack pointer) decrementado de 2
uma cpia do contedo do registrador de FLAGS armazenado na pilha
Exemplo de operao:
Offset
Antes
0100h
00FFh
00FEh
00FDh
00FCh
00FBh
00FAh
00F9h
...
(Base)
?
?
?
?
?
?
?
?
...
PUSH AX
PUSHF
;instruo 1
;instruo 2
Depois de 1
<- SP
?
12h
34h
?
?
?
?
?
<- SP
Pgina 2 de 10
Depois de 2
?
12h
34h
56h
78h
?
?
?
AX
1234h
<- SP
FLAGS
5678h
Offset
Antes
0100h
00FFh
00FEh
00FDh
00FCh
00FBh
00FAh
00F9h
...
(Base)
?
12h
34h
56h
78h
?
?
?
...
POPF
POP AX
;instruo 1
;instruo 2
Depois de 1
<- SP
?
12h
34h
56h
78h
?
?
?
<- SP
Pgina 3 de 10
Depois de 2
?
12h
34h
56h
78h
?
?
?
<- SP
AX
antes
F0D3h
depois
1234h
FLAGS
antes
006Ah
depois
5678h
Pgina 4 de 10
Pgina 5 de 10
Instruo de retorno:
RET
Pgina 6 de 10
Mecanismo de chamada:
Offset
Seg. de Cdigo
MAIN PROC
...
...
CALL SUB1
1012h ;prxima instruo
SP ->
SUB1 PROC
1200h ;primeira instruo
...
...
1300h RET
Antes
Depois
IP
1012h
IP
1200h
Pilha
?
?
?
?
?
?
?
Pilha
?
12h
10h
?
?
?
?
SP->
0100h
00FFh
00FEh
00FDh
00FCh
00FBh
00FAh
Mecanismo de retorno:
Offset
Seg. de Cdigo
MAIN PROC
...
...
CALL SUB1
1012h ;prxima instruo
SUB1 PROC
1200h ;primeira instruo
...
...
1300h RET
SP ->
Pgina 7 de 10
Antes
Depois
IP
1300h
IP
1012h
Pilha
?
12h
10h
?
?
?
?
Pilha
?
12h
10h
?
?
?
?
SP->
0100h
00FFh
00FEh
00FDh
00FCh
00FBh
00FAh
Um exemplo de subrotina:
TITLE MULTIPLICACAO POR SOMA E DESLOCAMENTO
.MODEL SMALL
.STACK 100h
.CODE
PRINCIPAL PROC
...
;supondo a entrada de dados
CALL MULTIPLICA
...
;supondo a exibio do resultado
MOV AH,4Ch
INT 21h
PRINCIPAL
ENDP
MULTIPLICA PROC
;multiplica dois numeros A e B por soma e deslocamento
;entradas: AX = A, BX = B, numeros na faixa 00h - FFh
;saida:
DX = A*B (produto)
PUSH AX
PUSH BX
;salva os conteudos de AX e BX
AND DX,0
;inicializa DX em 0
;repeat
;if B e' impar
TOPO:
TEST BX,1
;B e' impa
r?
JZ PT1
;nao, B e' par (LSB = 0)
;then
ADD DX,AX
;sim, entao produto = produto + A
;end_if
PT1:
SHL AX,1
;desloca A para a esquerda 1 bit
SHR BX,1
;desloca B para a direita 1 bit
;until
JNZ TOPO
;fecha o loop repeat
POP BX
POP AX
;restaura os conteudos de BX e AX
RET
;retorno para o ponto de chamada
MULTIPLICA ENDP
END PRINCIPAL
Pgina 8 de 10
Pgina 9 de 10
Pgina 10 de 10
Pgina 1 de 13
Resultado
hexadecimal
0000 FFFF h
FFFF FFFF h
ou +1
ou -1
DX
AX
CF/OF
0000 h
FFFF h
FFFF h
FFFF h
0
0
Resultado
hexadecimal
00FF E001 h
00FF E001 h
DX
AX
CF/OF
00FF h
00FF h
E001 h
E001 h
1
1
AH
AL
CF/OF
7F h
00 h
80 h
80 h
1
1
AL = 80 h =
BL = FF h =
Resultado
decimal
32640
128
Pgina 2 de 13
(high word)
(low word)
Pgina 3 de 13
DX : AX
BX
= 0000 0005 h =
5
=
FFFE h = 65534
Quociente
decimal
0
-2
ou
ou
+5
-2
Resto decimal
AX
DX
5
1
0000 h
FFFE h
0005 h
0001 h
AX = 0005 h
BL = FF h
Quociente
decimal
0
-5
=
=
5 ou + 5
256 ou - 1
Resto decimal
AL
AH
5
0
00 h
FB h
05 h
00 h
AX = 00FB h
BL = FF h
Quociente
decimal
0
-251 *
=
=
251 ou + 251
256 ou
-1
Resto decimal
AL
AH
251
-
00 h
-
FB h
-
Pgina 4 de 13
Pgina 5 de 13
Pgina 6 de 13
Pgina 7 de 13
END_IF
contador = 0
REPEAT
dividir quociente por 10
colocar o resto na pilha
contador = contador + 1
UNTIL quociente = 0
FOR contador vezes DO
retirar um resto (nmero) da pilha
converter para caracter ASCII
exibir o caracter no monitor
END_FOR
Pgina 9 de 13
Pgina 11 de 13
IMUL CX
IMUL BYTE1
IDIV BX
IDIV BL
CBW
;se AL = 5Fh
Pgina 12 de 13
Pgina 13 de 13