Você está na página 1de 120

Cap.

1 Introduo aos Microcomputadores Digitais

1. Introduo aos Microcomputadores Digitais


1.1 Organizao de um computador digital
Um computador digital pode ser descrito de uma forma simplificada segundo
o diagrama de blocos:

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

UNIDADE CENTRAL DE PROCESSAMENTO - CPU

DISPOSITIVOS
DE E/S

Pgina 1 de 9

Cap.1 Introduo aos Microcomputadores Digitais

Unidade Central de Processamento:


Unidade de Controle
Unidade de Aritmtica e Lgica
Registradores de Propsito Geral
Registradores Especficos
Reg. de Dados da Memria
Reg. de Endereos da Memria
Contador de Programa (Program Counter)
Registrador de Instrues
Apontador de Pilha (Stack Pointer)
Outros (conforme a CPU)

- 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

Cap.1 Introduo aos Microcomputadores Digitais

1.2 Memria

Memria: local do computador (hardware) onde se armazenam temporria ou


definitivamente dados (nmeros, caracteres e instrues)

Posio de memria ou endereo: localidade fsica da memria onde se


encontra o dado.

Organizao da memria:
Endereo
...
4MB
...
1048576
...
1765
...
4
3
2
1
0

Contedo
...
10110101
...
01001010
...
01001101
...
01010000
11111111
11101001
11011010
01100100

Obs: no 8086, a memria organizada em bytes (conjunto de 8 bits).

Pgina 3 de 9

Cap.1 Introduo aos Microcomputadores Digitais

1.3 A CPU e a execuo de um programa


MEMRIA
Barramento de dados
Barramento de endereos
Barramento de controle
A

...

...

RDM

REM

PC
RI
SP
UNID. DE

UNIDADE DE
ARITMTICA E LGICA

CONTROLE

UNIDADE CENTRAL DE PROCESSAMENTO - CPU

Ciclo de busca e execuo de uma instruo


1a. etapa: Busca da instruo na memria (FETCH)
REM <-- PC
RDM <-- (REM)
2a. etapa: Decodificao da instruo
RI <-- RDM
ocorre a decodificao do contedo de RI na UC
PC <-- PC + n
3a. etapa: Busca dos operandos da instruo (se houver)
REM <-- endereo do operando (Ex: REM <-- REM + 1)
RDM <-- (REM)
4a. etapa: Execuo da instruo

Pgina 4 de 9

Cap.1 Introduo aos Microcomputadores Digitais

1.4 Linguagem de mquina e linguagem montadora

Exemplo de um mesmo programa em linguagens de mquina e montadora:

Instruo de mquina (binrio)

Operao

10100001 00000000 00000000

Busca o contedo da palavra de


memria 0 e o coloca no reg. AX
Adiciona 4 ao reg. AX

00000101 00000100 00000000


10100011 00000000 00000000

Armazena o contedo de AX na
palavra de memria de endereo 0

Instruo em linguagem montadora

Comentrios

MOV AX,A

ADD AX,4h
MOV A, AX

; busca o contedo da posio de


; memria dada por A e o coloca no
; reg. AX
; adiciona 4 a AX, resultado em AX
;
; armazena o contedo de AX na
; posio de memria definida por A

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

Cap.1 Introduo aos Microcomputadores Digitais

1.5 Atividade prtica: Criando e rodando um programa

A especificao do programa ECO DO TECLADO NA TELA:


- iniciar
- apresentar um prompt ao usurio
- ler um caracter do teclado
- exibir o caracter lido na prxima linha da tela do monitor
- terminar

O fluxograma:

Incio

Apresentar um prompt

Ler um caracter do teclado

Mudar de linha

Exibir caracter lido

Fim

Pgina 6 de 9

Cap.1 Introduo aos Microcomputadores Digitais

O programa ECO completo:


TITLE PROGRAMA DE ECO DO TECLADO NA TELA
.MODEL SMALL
.STACK 100h
.CODE
MAIN PROC
;
;apresentacao do prompt ?
MOV AH,2
;funcao DOS para exibir caracter
MOV DL,?
;caracter ?
INT 21h
;exibir
;
;entrada do caracter pelo teclado
MOV AH,1
;funcao DOS para leitura de caracter
INT 21h
;caracter e lido em AL
MOV BL,AL
;salvando-o temporariamente em BL
;
;movendo de linha
MOV AH,2
;funcao DOS para exibir caracter
MOV DL,0Dh ;caracter ASCII <CR> - return
INT 21h
;executando
MOV DL,0Ah ;caracter ASCII <LF> - line feed
INT 21h
;executando
;
;exibindo na tela o caracter lido: efeito de ECO
MOV DL,BL
;recuperando o caracter salvo
INT 21h
;exibir
;
;retorno ao DOS
MOV AH,4Ch ;funcao DOS para saida
INT 21h
;saindo
MAIN ENDP
END MAIN

Pgina 7 de 9

Cap.1 Introduo aos Microcomputadores Digitais

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

;funcao DOS para exibir caracter


;caracter '?'
;exibir

c) Lendo o caracter teclado pelo usurio e salvando-o em num registrador:


MOV AH,1
INT 21h
MOV BL,AL

;funcao DOS para leitura de caracter


;caracter e' lido em AL
;salvando-o em BL

d) Movendo o cursor da tela para o incio da prxima linha:


MOV AH,2
MOV DL,0Dh
INT 21h
MOV DL,0Ah
INT 21h

;funcao DOS para exibir caracter


;caracter ASCII <CR> - return
;executando
;caracter ASCII <LF> - line feed
;executando

e) Recuperando o caracter lido e exibindo-o:


MOV DL,BL
INT 21h

;recuperando o caracter salvo


;exibir

f) O programa termina devolvendo controle ao DOS:


MOV AH,4Ch
INT 21h

;funcao DOS para saida


;saindo

Pgina 8 de 9

Cap.1 Introduo aos Microcomputadores Digitais

Como obter o programa ECO.EXE executvel.


1. Edite o program ECO utilizando um editor de texto simples, com sada em
texto ASCII. Sugesto: use o EDIT do DOS ou o Bloco de Notas
(NOTEPAD) do Windows. Sugere-se que o arquivo (texto ASCII) tenha a
extenso .ASM

C:\ > EDIT ECO.ASM <enter>

2. Rode o programa Montador TASM (Borland). Como resultado, aparece em


seu diretrio de trabalho um arquivo ECO.OBJ

C:\ > TASM ECO. ASM <enter>

3. Rode o programa Lincador TLINK. Como resultado, aparece em seu


diretrio de trabalho um arquivo ECO.EXE.

C:\ > TLINK ECO.OBJ <enter>

4. Rode o programa ECO.EXE, respondendo ao ? com uma letra K, por


exemplo.
C:\ > ECO.EXE <enter>
?K
K
C:\ >

<- letra K digitada pelo usurio


<- eco da letra K aparece na tela
<- note que o controle retorna ao DOS

Tente com outras letras ou procure modificar o programa para obter outros
efeitos com caracteres digitados no teclado.

Pgina 9 de 9

Cap2 Representao de Nmeros e Caracteres.

2. Representao de Numeros e Caracteres.


2.1 Conceitos bsicos
Bit

= BInary digiT = vale sempre 0 ou 1


elemento bsico de informao

Byte

= 8 bits processados em paralelo (ao mesmo tempo)

Word

= 2 bytes = 16 bits

Double word = 2 words = 4 bytes = 32 bits


Nibble

= 4 bits (utilidade para BCD)

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

Cap2 Representao de Nmeros e Caracteres.

2.2 Representao de nmeros


Nmeros em base binria (base 2):
a) 1 byte
00100111b

= 0.27 + 0.26 + 1.25 + 0.24 + 0.23 + 1.22 + 1.21 + 1.20


= 0 + 0 + 32 + 0 + 0 + 4 + 2 + 1 = 39d
= 2716 ou 27h

b) 1 word
0101011101101110b

= 0.215 + 1.214 + ... + 1.22 + 1.21 + 0.20


= 22382d
= 576E16 ou 576Eh (mais fcil de representar!)

high byte = 0101 0111b = 57h


low byte = 0110 1110b = 6Eh

Nmeros em base octal (base 8):


a) byte
2578

= 2.82 + 5.81 + 7.80


= 128 + 40 + 7 = 175d
= 010_101_111b = 10101111b

b) word
0573268

= 0.85 + 5.84 + 7.83 + 3.82 + 2.81 + 6.80


= 0 + 20480 + 3584 + 192 + 16 + 6 = 24278d
= 000_101_111_011_010_110b = 0101111011010110b

Pgina 2 de 9

Cap2 Representao de Nmeros e Caracteres.

Nmeros em base hexadecimal (base 16):


a) byte
D516

= 13.161 + 5.160
= 208 + 80 = 288d
= 1101_0101b = 11010101b

b) word
A03916

= 10.163 + 0.162 + 3.161 + 9.160


= 40960 + 0 + 48 + 9 = 41017d
= 1010_0000_0011_1001b = 1010000000111001b

Converso entre bases numricas:


Tipo de converso

Procedimento

Decimal => Binrio

Divises sucessivas por 2 at se obter zero no


quociente; leitura dos dgitos binrios de baixo
para cima.
Binrio = > Decimal
Soma de potncias de 2 cujo expoente a
posio do bit e cujo coeficiente o prprio bit.
Hexadecimal => Binrio Expandir cada dgito hexa em quatro dgitos
binrios segundo seu valor.
Binrio => Hexadecimal Compactar cada quatro dgitos binrios em um
nico dgito hexa segundo seu valor.
Decimal => Hexadecimal Divises sucessivas por 16 at se obter zero no
quociente; leitura dos dgitos de baixo para cima.
Hexadecimal => Decimal Soma de potncias de 16 cujo expoente a
posio do dgito e cujo coeficiente o valor do
prprio dgito hexa.

Pgina 3 de 9

Cap2 Representao de Nmeros e Caracteres.

2.3 Representao sinalizada e no sinalizada de nmeros inteiros:

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

bit de sinal = 0 => " + " (positivo)


= 1.26 + 1.25 + 1.24 + 0.23 + 0.22 + 0.21 + 1.20
= 64 + 32 + 16 + 1 = 113d

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

bit de sinal = 1 => " - " (negativo)

10110001

<= nmero em complemento de 2 (C2)

01001110
1_
01001111

<= nmero com todos os bits invertidos

magnitude (7 bits)

<= valor do nmero (magnitude)

= 1.26 + 0.25 + 0.24 + 1.23 + 1.22 + 1.21 + 1.20


= 64 + 8 + 4 + 2 + 1 = 79d

Pgina 4 de 9

logo: - 79d

Cap2 Representao de Nmeros e Caracteres.

Exemplo 3: 70FFh

= 0111000011111111b

valor no sinalizado = 0.215 + 1.214 + ... + 1.22 + 1.21 + 1.20

valor sinalizado

bit de sinal = 0 => " + " (positivo)


= valor igual ao no sinalizado

Exemplo 4: C777h

= 1100011101110111b

valor no sinalizado = 1.215 + 1.214 + ... + 1.22 + 1.21 + 1.20


bit de sinal = 1 => " - " (negativo)
valor sinalizado

= a ser calculado considerando o nmero em C2

Alguns nmeros em hexadecimal, em representao sinalizada:


0FFFh
EF0h
1h
80h
8000h
C321h
FFFFh

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

Cap2 Representao de Nmeros e Caracteres.

2.4 Representao de caracteres ASCII:


Letras e pontuao no so representveis diretamente em computadores
e circuitos lgicos.
Utiliza-se alguns cdigos binrios de de 6, 7 ou 8 bits, que atribuem a cada
combinao binria um caracter alfa-numrico.
cdigo mais conhecido e utilizado o ASCII (American Standard Code for
Information Interchange). Veja a tabela 2.5, pagina 32 do livro-texto.
Exemplos:
A 42h ou 0100 0010
B 43h ou 0100 0011
X 58h ou 0101 1000
a 62h ou 0110 0010
x 78h ou 0111 1000
0 30h ou 0011 0000
9 39h ou 0011 1001
? 3Fh ou 0011 1111
20h ou 0010 0000
. 2Eh ou 0010 1110

Pgina 6 de 9

Cap2 Representao de Nmeros e Caracteres.

2.5 Exemplo de um programa processando nmeros


A especificao do programa SOMA:
- iniciar
- ler a varivel A da memria
- ler a varivel B da memria
- somar A + B
- converter o resultado para caracter ASCII
- exibir o caracter no monitor
- terminar
O fluxograma:
Incio

Ler a varivel A

Ler a varivel B

Somar A + B

Converter o resultado para


caracter ASCII

Exibir caracter no monitor


Fim

Pgina 7 de 9

Cap2 Representao de Nmeros e Caracteres.

O programa SOMA completo:


TITLE PROGRAMA PARA SOMA DE DOIS NUMEROS
.MODEL SMALL
.STACK 100h
;
.DATA
A
DB
2
;definicao e inicializacao da variavel A
B
DB
5
;definicao e inicializacao da variavel B
SUM DB
?
;definicao da variavel SUM (no inicializada)
;
.CODE
;inicializacao de DS
MOV AX,@DATA
MOV DS,AX
;inicializa DS
;
;soma dos numeros
MOV AL,A
;AL recebe o conteudo de A
ADD AL,B
;AL contem A+B
MOV SUM,AL
;variavel SUM recebe o conteudo de AL
;
;conversao de hexa para ASCII
ADD SUM,30h
;somando 30h para compatibilizar a
;quatidade em SUM com o caracter ASCII
;
;visualizacao do resultado na tela
MOV AH,02h
;funcao DOS para exibicao de caracter
MOV DL,SUM
;dado pronto para sair em DL
INT 21h
;exibe na tela
;
;saida do DOS
MOV AH,4Ch
;funcao de retorno para o DOS
INT 21h
;saida para o DOS
END

Pgina 8 de 9

Cap2 Representao de Nmeros e Caracteres.

2.6 Atividades prticas:


Rode o programa utilizando o TASM e o TLINK.
Verifique o que ocorrer se os valores definidos inicialmente nas variveis A
e B forem alterados para:
a) 2 e 5
b) 2 e 5
Troque a instruo ADD AX,B por SUB AX,B e use as variveis:
c) 2 e 5
d) 2 e 5
Procure explicar os resultados obtidos com o auxlio da teoria de nmeros
sinalizados e com a tabela de caracteres ASCII.
Tente agora especificar os valores iniciais de A e B em:
a) Binrio
b) Hexadecimal
Faa finalmente 2 e 5 expressos em binrio e em hexadecimal. Use
complemento de 2 para representar o nmero negativo.
Se voc desejar formatar a resposta que o programa exibe no monitor,
procure incluir mudanas de linha e alguns tabs para mover o cursor na tela.

Pgina 9 de 9

Cap3 Organizao do Microprocessador 8086

3. Organizao do microprocessador 8086


3.1 A famlia Intel 86 (ou 80X86)

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 ?

O primeiro IBM PC foi construdo com o 8088 (verso de 8 bits do 8086).

Todo software produzido para a famlia 80x86 mantem compatibilidade


com os futuros microprocessadores.

Pgina 1 de 11

Cap3 Organizao do Microprocessador 8086

3.2 Arquitetura do microprocessador 8086

(referir ao livro-texto, figura 1.6, pgina 8)

Configurao interna do 8086

barramento de endereos comum com o de dados: 20 bits


endereos: 20 bits, 220 = 1.048.576 combinaes = 1 MByte (1 MB)
dados: utiliza somente 16 bits do barramento comum
barramento de controle: 16 bits independentes do barramento comum

Pgina 2 de 11

Cap3 Organizao do Microprocessador 8086

O 8086 divide-se internamente em duas unidades.

Execution Unit (EU) - unidade de execuo:

UAL - realiza operaes aritmticas de +, -, X, / e operaes lgicas AND,


OR, NOT, XOR;

contem registradores para armazenamento temporrio durante as


operaes, que so endereados por nome.

BUS Interface Unit (BIU) - unidade de interface de barramento:

faz a comunicao de dados entre a EU e o meio externo (memria, E/S);

controla a transmisso de sinais de endereos, dados e controle;

controla a sequncia de busca e execuo de instrues;

mecanismo de pre-fetch: busca at 6 instrues futuras deixando-as na


fila de instrues (instruction queue) -> aumento de velocidade.

Registradores: elementos de memria muito rpida dentro da CPU.

de dados, ou de propsito geral


de endereos (segmentos, apontadores e ndices)
sinalizadores de estado e controle (FLAGS)

Pgina 3 de 11

Cap3 Organizao do Microprocessador 8086

3.2.1 Registradores de dados:


AX, BX, CX e DX

so todos registradores de 16 bits


utilizados nas operaes aritmticas e lgicas
podem ser usados como registradores de 16 ou 8 bits
AH e AL
BH e BL
CH e CL
DH e DL

8 registradores de 8 bits cada


"H" -> byte alto ou superior
"L" -> byte baixo ou inferior

AX (acumulador) -> utilizado como acumulador em operaes aritmticas e


lgicas; em instrues de E/S, ajuste decimal, converso, etc

BX (base) ->

usado como registrador de BASE para referenciar posies


de memria;
BX armazena o endereo BASE de uma tabela ou vetor de
dados, a partir do qual outras posies so obtidas
adicionando-se um valor de deslocamento (offset).

CX (contador) -> utilizado em operaes iterativas e repetitivas para


contar bits, bytes ou palavras, podendo ser incrementado ou
decrementado; CL funciona como um contador de 8 bits.

DX (dados) -> utilizado em operaes de multiplicao para armazenar


parte de um produto de 32 bits, ou em operaes de diviso,
para armazenar o resto;
utilizado em operaes de E/S para especificar o endereo de
uma porta de E/S.

Pgina 4 de 11

Cap3 Organizao do Microprocessador 8086

3.2.2 Registradores de segmento:


CS, DS, SS e ES

so todos registradores de 16 bits


o endereamento no 8086 diferenciado para:
- cdigo de programa (instrues)
- dados
- pilhas

segmento: um bloco de memria de 64 KBytes, enderevel.

durante a execuo de um programa no 8086, h 4 segmentos ativos:


segmento de cdigo:
segmento de dados:
segmento de pilha:
segmento extra:

endereado por
"
"
"

CS
DS
SS (stack segment)
ES

3.2.3 Registrador apontador de instruo:

IP (instruction pointer)

utilizado em conjunto com CS para localizar a posio, dentro do


segmento de cdigo corrente, da prxima instruo a ser
executada;

IP automaticamente incrementado em funo do nmero de


bytes da instruo executada.

Pgina 5 de 11

Cap3 Organizao do Microprocessador 8086

3.2.4 Registradores apontador de pilha e de ndice:


Armazenam valores de deslocamento de endereos (offset), a
fim de acessar regies da memria muito utilizadas:
pilha,
blocos de dados,
arrays e strings.
Podem ser utilizados em operaes aritmticas e lgicas,
possibilitando que os valores de deslocamento sejam resultados
de computaes anteriores.

SP (stack pointer - apontador de pilha) utilizado em conjunto com SS,


para acessar a rea de pilha na memria; aponta para o topo da pilha.

BP (base pointer - apontador de base) o ponteiro que, em conjunto com


SS, permite acesso de dados dentro do segmento de pilha.

SI (source index - ndice fonte) usado como registrador ndice em alguns


modos de endereamento indireto, em conjunto com DS.

DI (destination index - ndice destino) similar ao SI, atuando em conjunto


com ES.

Obs: SI e DI facilitam a movimentao de dados sequenciados entre


posies fonte (indicado por SI) e posies destino (indicado por DI).

Pgina 6 de 11

Cap3 Organizao do Microprocessador 8086

3.2.5 Registrador de sinalizadores (FLAGS):

indica o estado do microprocessador durante a execuo de cada


instruo;

conjunto de bits individuais, cada qual indicando alguma propriedade;

subdividem-se em: FLAGS da estado (status) e FLAGS de controle.

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

Para maiores detalhes, veja o Cap. 5.

Pgina 7 de 11

4
AF

2
PF

0
CF

Cap3 Organizao do Microprocessador 8086

3.2.6 Os registradores do 8086 (viso geral):

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

O registrador IP corresponde ao Contador de Programa - PC


Todos os registradores so de 16 bits
AH -> byte alto de AX; AL byte baixo de AX; ambos de 8 bits

Pgina 8 de 11

Cap3 Organizao do Microprocessador 8086

Apndice
Gerenciamento de memria por segmentao

O 8086 possui 20 bits para acessar posies de memria fsica


220 = 1.048.576 bytes (1 Mbyte) posies endereveis
Exemplos de endereos:
0000 0000 0000 0000 0000b
0000 0000 0000 0000 0001b
0000 0000 0000 0000 0010b
0000 0000 0000 0000 0011b
....
1111 1111 1111 1111 1111b

->
->
->
->

00000h
00001h
00002h
00003h

->

FFFFFh

-> 5 dgitos hexa

O 8086 opera internamente com 16 bits


Problema: Como gerar endereos com 20 bits?
Soluo:
Utilizar a idia de segmentao de memria!

Segmento de memria:

bloco de 64 Kbytes de posies de memria consecutivas

216 = 65.536 bytes (64 Kbytes)

Segmento de memria identificado por um nmero de segmento

Uma posio de memria especificada pelo nmero de segmento e


por um deslocamento (offset) em relao ao incio do segmento

Pgina 9 de 11

Cap3 Organizao do Microprocessador 8086

Formato de endereo lgico

->

segmento:offset

Exemplo de endereamento

Dado o endereo lgico:


reconhece-se:

8350:0420h

segmento no.
deslocamento

8350h
0420h

o endereo fsico vale:


83500h
0420h
83920h

-> desloca-se 1 casa hexa (4 casas binrias)


-> soma-se o deslocamento
-> endereo fsico resultante (20 bits)

Graficamente:
8

19

0 |0

43 0

15

15

8
19

15

0 CS (base)

<- endereo lgico

0 IP (offset)
0

<- endereo fsico

para a memria

Pgina 10 de 11

Cap3 Organizao do Microprocessador 8086

Tipos de referncia memria


Busca de instruo
Operao com pilha
Varivel (dado)
Fonte para instruo com string
Destino para instruo com string

Identificador Identificador
de segmento alternativo
CS
SS
DS
CS, SS, ES
DS
CS, SS, ES
ES
-

Offset
IP
SP, BP
*
SI
DI

O identificador de segmento (base) aponta para uma regio da memria;

O offset aponta para um local dentro deste segmento;

O offset aquele que aparece nos programas como o endereo dos


dados, rtulos e endereos de instrues;

O identificador de segmento aparece somente quando um novo segmento


precisa ser especificado;

Segmentao um esquema muito til para gerar cdigos relocveis;

A maioria das variveis est localizada no segmento de dados; podem


tambm estar localizadas em outros segmentos;

Endereos lgicos diferentes podem representar o mesmo endereo fsico;

ex:

base
offset

028Ch
0003h

endereo fsico ->

028C3h

base
offset

0287h
0053h

endereo fsico ->

028C3h.

Pgina 11 de 11

Cap4 Introduo Linguagem Montadora do 8086

4. Introduo linguagem montadora do 8086


4.1 A sintaxe assembly do 8086
A linguagem montadora no sensvel letra maiscula ou minscula
Para facilitar a compreenso do texto do programa, sugere-se:
uso de letra maiscula para cdigo
uso de letra minscula para comentrios

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)

Formato de uma declarao (linha de programa):


[Nome]

[Cod. oper.]

[Operando(s)] [;Comentrio]

Exemplo:
INICIO:

MOV

CX,5h

;inicializar contador

A separao entre os campos deve ser do tipo <espao> ou <tab>.

Pgina 1 de 30

Cap4 Introduo Linguagem Montadora do 8086

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

Campo de cdigo de operao:


Contem o cdigo de operao simblico (mnemnico)
No caso de diretivas, contem o cdigo de pseudo-instruo
Exemplos:

instrues
MOV
ADD
INC
JMP

diretivas
.MODEL
.STACK
nome PROC

Pgina 2 de 30

Cap4 Introduo Linguagem Montadora do 8086

Campo de operandos:
Instrues podem conter 0, 1 ou 2 operandos no 8086.
Exemplos:
NOP

;sem operandos: instrui para fazer nada

INC AX

;um operando: soma 1 ao contedo de AX

ADD

A,2d

;dois operandos: soma 2 ao contedo da palavra


;de memria A

No caso de instrues de dois operandos:


o primeiro, operando destino: registrador ou posio de memria
onde o resultado armazenado; o contedo inicial modificado;
o segundo, operando fonte: no modificado pela instruo;
os operandos so separados por uma vrgula.

No caso de diretivas, o campo de operandos contem mais informaes


acerca da diretiva.

Pgina 3 de 30

Cap4 Introduo Linguagem Montadora do 8086

Campo de comentrio:
- um ponto-e-vrgula ( ; ) marca o incio deste campo;
- o Montador ignora tudo aps o este marcador;
- comentrios so opcionais.

Uma boa prtica de programao comentar tudo e incluir a


informao acerca da idia por trs da codificao (o algortmo).

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

Cap4 Introduo Linguagem Montadora do 8086

4.2 Formato de dados, variveis e constantes


Nmeros:
Exemplos:
- binrio:

1110101b

ou

1110101B

- decimal:

64223 ou 64223d ou 64223D


1110101 considerado decimal (ausncia do B)
-2184D (nmero decimal negativo)

- hexa:

64223h ou 64223H
0FFFFh comea com um decimal e termina com h
1B4Dh

Exemplos de nmeros ilegais:


1,234
FFFFh
1B4D

caracter estranho (vrgula)


no comea por nmero de 0 a 9
difcil distinguir do nome de uma varivel
no termina com h ou H

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

Cap4 Introduo Linguagem Montadora do 8086

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)

- Definio de variveis de tipo byte:


Nome

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

Cap4 Introduo Linguagem Montadora do 8086

- Definio de variveis de tipo word:


Nome

DW

valor_inicial

WORD1
CONTA
C

DW
DW
DW

0h
0150h
?

;equivale a 0000h
;OK!, por que?
;no inicializada

WORD1

DW

1234h

;byte baixo 34h, endereo WORD1


;byte alto 12h endereo WORD1+1

Exemplos:

- Array: sequncia de bytes ou words consecutivos na memria


armazenar dados relacionados
armazenar caracteres ASCII organizados (ex: texto)
Exemplos:
BYTE_ARRAY
DB
WORD_ARRAYDW

10h,20h,30h
1000h,123h,0h,0FFFFh

Um array pode conter um string de caracteres, sendo definido como:


LETRAS DB
LETRAS DB

abC
61h,62h,43h

;e equivalente aos caracteres ASCII


;depende se maiscula ou minscula

Pgina 7 de 30

Cap4 Introduo Linguagem Montadora do 8086

- Combinao de caracteres e nmeros numa mesma definio:


MENSAGEM

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

Cap4 Introduo Linguagem Montadora do 8086

4.3 Algumas instrues iniciais


MOV destino,fonte
Usada para transferir dados entre:
registrador e registrador
registrador e uma posio de memria
mover um nmero diretamente para um registrador ou posio de memria
Combinaes legais de operandos:

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

Exemplos de instrues vlidas:


MOV AX,WORD1

;movimenta o contedo da posio de memria WORD1


;para o registrador AX

MOV AH,A

;transfere o caracter ASCII A para AH

MOV AH,41h

;idem anterior: 41h corresponde ao caracter A

MOV AH,BL

;move o contedo do byte baixo de BX para


;o byte alto de AX

MOV AX,CS

;transfere uma cpia do contedo de CS para AX

Pgina 9 de 30

Cap4 Introduo Linguagem Montadora do 8086

Graficamente: suponha a instruo MOV AX,WORD1


Antes

Depois

AX
0006h

AX
8FFFh

WORD1
8FFFh

WORD1
8FFFh

Obs: para a instruo MOV no permitido operar de posio de memria


para posio de memria diretamente, por motivos tcnicos do 8086.
Por exemplo:
MOV WORD1,WORD2

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

Cap4 Introduo Linguagem Montadora do 8086

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

Exemplos de instrues vlidas:


XCHG AX,WORD1

;troca o contedo da posio de memria WORD1


;com o do registrador AX

XCHG AH,BL

;troca o contedo do byte baixo de BX com o


;do byte alto de AX

Graficamente: suponha a instruo XCHG AH,BL


Antes

Depois

AH
14h

AL
FFh

AH
E0h

AL
FFh

BH
C2h

BL
E0h

BH
C2h

BL
14h

Pgina 11 de 30

Cap4 Introduo Linguagem Montadora do 8086

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

Exemplos de instrues vlidas:


ADD AX,BX

;soma o contedo de BX com AX, resultado em AX

ADD BX,AX

;soma o contedo de AX com BX, resultado em BX

ADD AX,WORD1

;soma o contedo da posio de memria WORD1


;ao do registrador AX, resultado em AX

SUB WORD2,AX

;subtrai o contedo do registrador AX do contedo da


;posio de memria WORD2, resultado em WORD2

SUB BL,5

;subtrai a quantidade 5 decimal do contedo de BL

Pgina 12 de 30

Cap4 Introduo Linguagem Montadora do 8086

Graficamente: suponha a instruo ADD AX,DX


Antes

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

Obs 2: o resultado de SUB, se for negativo, estar armazenado no registrador


destino em complemento de 2.

Pgina 13 de 30

Cap4 Introduo Linguagem Montadora do 8086

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

;incrementa o contedo da posio de memria WORD1

DEC BYTE2

;decrementa o contedo da posio de memria BYTE2

DEC CL

;decrementa o contedo de CL (byte baixo de CX)

Graficamente: suponha a instruo INC BYTE1


Antes

Depois

BYTE1
06h

BYTE1
07h

Pgina 14 de 30

Cap4 Introduo Linguagem Montadora do 8086

NEG destino
Usada para substituir o contedo destino pelo seu complemento de 2,
operando sobre:
um registrador
uma posio de memria

Exemplos:
NEG BX

;gera o complemento de 2 do contedo de BX

NEG WORD1

;idem, no contedo da posio de memria WORD1

Graficamente: suponha a instruo NEG BX


Antes

Depois

BX
0002h

BX
FFFEh

Pgina 15 de 30

Cap4 Introduo Linguagem Montadora do 8086

4.4 estrutura de um programa em Linguagem Montadora

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:

A menos que haja muitas linhas de programa (muito cdigo) ou muitos


dados, o modelo apropriado o SMALL.
A diretiva .MODEL deve vir antes de qualquer definio de segmento.

Pgina 16 de 30

Cap4 Introduo Linguagem Montadora do 8086

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

Segmento de pilha (stack segment)


- Reserva um bloco de posies de memria consecutivas para
armazenar a pilha
- Deve ter espao suficiente para suportar a pilha no seu mximo
tamanho
Sintaxe:

.STACK

tamanho

Exemplo:
.STACK 100h

;reserva 100h bytes para a rea de pilha, um


;tamanho razovel para a maioria das aplicaes

Pgina 17 de 30

Cap4 Introduo Linguagem Montadora do 8086

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:

nome -> identificao da procedure


PROC e ENDP -> pseudo-instrues usadas para delimitar a procedure
para um programa simples, no h necessidade de se definir a procedure.

Pgina 18 de 30

Cap4 Introduo Linguagem Montadora do 8086

Exemplo de uma estrutura de programa assembly completo:

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

Cap4 Introduo Linguagem Montadora do 8086

4.5 Instrues de entrada e sada


IN e OUT -> instrues Assembly para acessar portas de E/S para perifricos
No so utilizadas na maioria das aplicaes:
(1) os endereos das portas de E/S variam conforme o modelo do PC
(2) mais fcil utilizar o BIOS ou o DOS para funes de E/S
Para acessar as rotinas de E/S do BIOS ou DOS utiliza-se a instruo:
INT nmero_de_interrupo
Obs: o programa em curso interrompido, passando o controle para o DOS,
que realiza a operao de E/S e retorna o controle para o programa.
Exemplo:

INT 21h

;acessa um grande nmero de funes de E/S do DOS


Algumas funes DOS de E/S:

Funo 1h: Entrada de um caracter simples pelo teclado


Acesso:
Resultado:

AH = 1h
AL = cdigo ASCII do caracter digitado no teclado

Funo 2h: Exibio de caracter simples no monitor de vdeo


Acesso:
Resultado:

AH = 2h
DL = cdigo ASCII do caracter a exibir
exibio na tela do monitor

Pgina 20 de 30

Cap4 Introduo Linguagem Montadora do 8086

Exemplos:
a) Trecho padro de programa para providenciar a entrada de um caracter
ASCII pelo teclado:
MOV

AH,1h

INT

21h

;prepara para entrar caracter pelo teclado


;o processador espera at que o usurio
;digite o caracter desejado
;aps a digitao, caracter ASCII em AL
;se um caracter no-ASCII for digitado, AL = 0h

Obs: o caracter teclado tambm aparece no monitor, por causa do DOS.


b) Trecho padro de programa para providenciar a sada de um caracter
ASCII para o monitor de vdeo:
MOV
MOV
INT

AH,2h
DL,?
21h

;prepara para exibir caracter no monitor


;o caracter ?
;exibe (monitor apresenta ?)
;aps a exibio, o cursor da tela avana para a
;prxima posio da linha (se j for atingido o fim
;da linha, vai para o incio da prxima linha)

Obs: tambm se pode exibir caracteres ASCII de controle:


Cdigo
ASCII
07h
08h
09h
0Ah
0Dh

Smbolo

Funo

BEL
BS
HT
LF
CR

Bell (som de bip)


Back Space (espao para trs)
Tab (tabulao)
Line Feed (mover para uma nova linha)
Carriage Return (ir para o inicio da linha)

Pgina 21 de 30

Cap4 Introduo Linguagem Montadora do 8086

Mais funes DOS de E/S:


Funo 4Ch: Termina o processo corrente e transfere controle para o DOS
Acesso:

AH = 4Ch

Resultado:

sada para o DOS

Funo 9h: Exibio de string de caracteres no monitor de vdeo


Acesso:

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.

Para exibio de um string de caracteres h dois problemas:


a) DS inicialmente no est apontando para o segmento de dados do
programa recm iniciado (DS ainda aponta para algum segmento de dados do
DOS);
b) deve-se colocar em DX o offset do endereo do string que queremos exibir

Pgina 22 de 30

Cap4 Introduo Linguagem Montadora do 8086

Como apontar DS para o segmento de dados do programa?


@DATA -> palavra reservada para obter o nmero do segmento de dados
definido pela diretiva .DATA, que contem as variveis e constantes.
Exemplo: para inicializar corretamente DS para o programa corrente
.DATA
...
.CODE
MOV
MOV

AX,@DATA
DS,AX

;coloca o nmero do segmento de dados em AX


;pois DS no pode receber @DATA diretamente

Obs: o programa Montador traduz o nome @DATA pelo nmero de segmento


onde se encontram os dados definidos pela diretiva .DATA.
Como colocar em DX o offset do endereo de um string a exibir?
LEA destino,fonte
Significa Load Effective Address -> coloca uma cpia do offset do endereo
da posio de memria fonte no registrador destino.
Exemplo:
.DATA
MENSAGEM DB Adoro OBCLM!$
...
.CODE
LEA DX,MENSAGEM
;DX carregado com o offset de MENSAGEM
Obs: aps esta operao, DX conter o offset da posio de memria onde
inicia o string MENSAGEM

Pgina 23 de 30

Cap4 Introduo Linguagem Montadora do 8086

4.6 Introduo aos montadores (assemblers)

Funo:

Gerar a linguagem de mquina de um programa escrito em uma linguagem


simblica (linguagem de montagem, onde os smbolos so os mnemnicos).

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

Cap4 Introduo Linguagem Montadora do 8086

Diretivas (ou Diretrizes) ou pseudo-instrues:

Cdigos especiais para o montador, que no geram cdigo de mquina,


sendo geralmente instrues para:
- Definio de formato de dados
- Definio de espaos de memria (dados, pilha)
- Criao de subrotinas
- Determinao do tipo do processador e co-processador

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

Cap4 Introduo Linguagem Montadora do 8086

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

Cap4 Introduo Linguagem Montadora do 8086

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

Cap4 Introduo Linguagem Montadora do 8086

b) Programa de converso de letra minscula para maiscula.


Especificao do programa:
- apresente ao usurio uma mensagem do tipo
Entre com uma letra minuscula:
- ler um caracter do teclado (no necessrio testar se letra)
- apresente uma segunda mensagem do tipo
Em maiuscula ela fica:
- apresente em seguida a letra convertida
- retornar ao DOS

Sugesto 1: Caracteres ASCII Carriage Return e Line Feed como variveis.


CR
LF

EQU
EQU

0DH
0AH

Sugesto 2: Como exibir um string de caracteres juntamente com uma


varivel?
MENSAGEM2
CHAR

DB
DB

CR,LF,'Em maiuscula ela fica: '


?,'$'

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

Cap4 Introduo Linguagem Montadora do 8086

Uma possvel soluo:


TITLE PROGRAMA PARA CONVERSAO DE LETRA MINUSC./MAIUSC.
.MODEL SMALL
.STACK 100h
.DATA
CR
EQU
0Dh
LF
EQU
0Ah
MENSAGEM1
DB
'Entre com uma letra minuscula: $'
MENSAGEM2
DB
CR,LF,'Em maiuscula ela fica: '
CHAR
DB
?,'$'
.CODE
MAIN PROC
;inicializando o registrador DS
MOV AX,@DATA
MOV DS,AX
;DS inicializado
;exibindo a MENSAGEM1
LEA DX,MENSAGEM1
;offset do endereco de MENSAGEM1 em DX
MOV AH,9
;funcao DOS para exibir 'string'
INT 21h
;exibindo
;entrada do caracter e conversao para maiuscula
MOV AH,1
;funcao DOS para leitura de caracter
INT 21h
;entrada
SUB AL,20h
;conversao ASCII de minuscula/maiuscula
MOV CHAR,AL
;salvando caracter na variavel CHAR
;exibindo a MENSAGEM2 e o caracter convertido
LEA DX,MENSAGEM2
;offset do endereco de MENSAGEM1 em DX
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 29 de 30

Cap4 Introduo Linguagem Montadora do 8086

4.8 Atividades prticas.


1) Escreva um programa para (a) exibir um ?, (b) ler dois dgitos decimais
cuja soma seja menor que 10 e (c) exibir sua soma na prxima linha.
Sugesto:
?27
A soma de 2 e 7 vale 9

<- em negrito, a entrada do usurio

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

<- em negrito, a resposta mensagem

4) Escreva um programa que leia trs iniciais, exiba-as de forma centrada


dentro de uma moldura de asteriscos de 11 x 5 (horizontal x vertical) e por fim
produza um bip no computador.
Sugesto: declare a moldura de asteriscos e as iniciais como um string.
Obs: adapte os programas 2 e 4 para ler 2, 4, 5 ou mais iniciais em funo de
seu nome.

Pgina 30 de 30

Cap5 O registrador de sinalizadores (FLAGS)

5. O registrador de sinalizadores (FLAGS)


5.1 Flags de Status e Flags de Controle

indica o estado do microprocessador aps a execuo de cada instruo;

conjunto de bits individuais, cada qual indicando alguma propriedade;

subdividem-se em: Flags de Estado (status) e Flags de Controle.

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

Obs: o emprego dos Flags de Controle ser discutido juntamente com


operaes com arrays e interrupes.

Pgina 1 de 4

Cap5 O registrador de sinalizadores (FLAGS)

5.2 Overflow (erro de transbordamento)

Overflow ->

ocorre porque a representao dos nmeros est limitada a


uma certa faixa

Tipos

8 bits

16 bits

No-sinalizado
Sinalizado (C2)

0 a 255
-128 a +127

0 a 65.535
- 32.768 a + 32.767

Qualquer operao aritmtica que tenha como resultado um nmero fora


da faixa de representao, estar produzindo Overflow.

O resultado armazenado no registrador destino estar truncado e ter,


portanto, um valor incorreto.

Tem-se dois Flags que podem indicar overflow: CF e OF


CF -> indica se h um vai-um para fora do Bit Mais Significativo do nmero
MSB (most significant bit) ..... o nmero transbordou !
OF -> testa o vem-um que chega e o vai-um gerado no MSB:
se iguais (0 e 0 ou 1 e 1) -> OF = 0
se diferentes, OF = 1 ..... e ocorreu o overflow !

Pgina 2 de 4

Cap5 O registrador de sinalizadores (FLAGS)

Exemplos de operaes com 8 bits:


ADD AL,BL

FFh
01h

;AL contem FFh e BL contem 01h

1111 1111b
+ 0000 0001b
1 0000 0000b

->

repres. no-sinalizada
repres. sinalizada
255
-1
+
1
+1
256 (fora da faixa) 0 (OK)

Logo aps a execuo da instruo:


CF = 1 , indicado em negrito;
OF = 0 , pois no MSB o "vem-um" igual ao "vai-um" (ambos 1).

ADD AL,BL

7Fh
7Fh

;ambos AL e BL contm 7Fh

0111 1111b
+ 0111 1111b
0 1111 1110b

->

repres. no-sinalizada
127
+
127
254 (OK)

repres. sinalizada
+ 127
+ 127
254 (fora)

Logo aps a execuo da instruo:


CF = 0 , indicado em negrito;
OF = 1 , pois no MSB o "vem-um" diferente do "vai-um".
Portanto:
representao no-sinalizada
representao sinalizada

->
->

Pgina 3 de 4

Flag CF indica overflow;


Flag OF indica overflow.

Cap5 O registrador de sinalizadores (FLAGS)

5.3 Como as instrues afetam os Flags


Algumas instrues, imediatamente aps a sua execuo:
afetam todos os Flags;
afetam apenas alguns;
no afetam nenhum.
Instruo
MOV
XCHG
LEA
ADD/SUB
INC/DEC
NEG

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

;onde AL contem FFh

INC AL
FFh
01h
100h

1111 1111 1111 1111 b


1111 1111 1111 1111 b
1 1111 1111 1111 1110 b

Como resultado:

1111 1111 b
1b
1 0000 0000 b

... Como implementado o INC AL ?

CF = no afetado
PF = 1

AF = 1
SF = 0

Pgina 4 de 4

ZF = 1
OF = 0

Cap6 Instrues de controle de fluxo.

6. Instrues de controle de fluxo


Instrues de lao (loop) e de salto (jump) permitem que:

o programa "tome" certas decises, alterando seu curso;


certas partes de um programa sejam repetidas um nmero controlado de
vezes;
permite implementar a inteligncia de qualquer algortmo.

Exemplo preliminar: exibio na tela de todos os caracteres ASCII.


TITLE EXIBICAO DE CARACTERES ASCII
.MODEL SMALL
.STACK 100h
.CODE
;inicializacao de alguns registradores
;
MOV AH,2
;funcao DOS para exibicao de caracter
MOV CX,256
;contador com o numero total de caracteres
MOV DL,00h
;DL inicializado com o primeiro ASCII
;
;definicao de um processo repetitivo de 256 vezes
;
PRINT_LOOP:
INT 21h
;exibir caracter na tela
INC DL
;incrementa o caracter ASCII
DEC CX
;decrementa o contador
JNZ PRINT_LOOP ;continua exibindo enquanto CX nao for 0
;
;quando CX = 0, o programa quebra a sequencia do loop
;saida para o DOS
;
MOV AH,4Ch
INT 21h
END

Pgina 1 de 12

Cap6 Instrues de controle de fluxo.

6.1 A instruo de comparao


CMP destino,fonte
CMP (Compare) compara os contedos destino e fonte, que podem ser:
registrador e registrador
registrador e uma posio de memria
um nmero diretamente como operando fonte
Combinaes legais de operandos:
Operando fonte
Reg. de dados
Posio de memria
Constante
CMP calcula a subtrao:

Operando destino
Registrador de
Posio de
dados
memria
sim
Sim
sim
No
sim
Sim

(destino) - (fonte)

Todos os Flags de Estado so afetados e o resultado no armazenado.


Exemplos de instrues vlidas:
CMP DX,BX

;compara os contedos de DX e BX

CMP AX,WORD1

;compara o contedo do registrador AX com o da


;posio de memria WORD1

CMP AH,A

;compara o contedo de AH com o caracter ASCII A

Pgina 2 de 12

Cap6 Instrues de controle de fluxo.

6.2 Saltos condicionais


JXXX rtulo_de_destino

XXX uma condio dependente de algum dos Flags de Estado

Se a condio XXX verdadeira:


- a prxima instruo a ser executada aquela definida pelo
rtulo_de_destino;
- a CPU ajusta o registrador IP para apontar para a posio de memria
dada por rtulo_de_destino.

Se a condio XXX falsa:


- a prxima instruo aquela que imediatamente segue o salto.

Faixa de endereamento do rtulo_de_destino:


- deve preceder JXXX no mais do que 126 bytes;
- deve suceder JXXX no mais do que 127 bytes.

H trs classes de saltos condicionais:


- saltos sinalizados: dependem de um resultado na forma de um
nmero sinalizado;
- saltos no-sinalizados: dependem de um resultado na forma de um
nmero no-sinalizado;
- saltos de Flag simples: que dependem do status de algum dos Flags.

A instruo JXXX no altera nenhum Flag.

Pgina 3 de 12

Cap6 Instrues de controle de fluxo.

Tipos de saltos condicionais


Smbolo

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

Saltos de Flag simples


JE
ou salto se igual
OU
JZ
salto se igual a zero
JNE
ou salto se no igual
OU
JNZ
salto se no igual a zero
JC
salto se h VAI-UM (carry)
JNC
salto se no h VAI-UM (not carry)
JO
salto se h overflow
JNO
salto se no h overflow
JS
salto se o sinal negativo
JNS
salto se o sinal no-negativo (+)
JP ou JPE
salto se a paridade PAR (even)
JNP ou JPO salto se a paridade IMPAR (odd)

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

Cap6 Instrues de controle de fluxo.

6.3 Diferena entre Saltos sinalizados e no-sinalizados


a) Trecho de programa que supe quantidades no-sinalizadas:
;supondo que AX contem 7FFFh e BX contem 8000h
...
CMP AX,BX
JA PT2
;o salto no ocorre porque 7FFFh < 8000h
...
...
PT2:
MOV ...
;continuao do programa
b) Trecho de programa que supe quantidades sinalizadas:
;supondo que AX contem 7FFFh e BX contem 8000h
...
CMP AX,BX
JG PT2
;o salto ocorre porque 7FFFh (+) > 8000h (-)
...
...
PT2:
MOV ...
;continuao do programa
Exemplo: Supondo que AX e BX contenham nmeros sinalizados, escreva
um trecho de programa que coloque o maior deles em CX.
...
MOV CX,AX
CMP AX,BX
JNL ABAIXO
MOV CX,BX
ABAIXO: ...
...

;AX j pressuposto ser o maior deles


;poderia ser tambm JGE ABAIXO
;caso BX seja de fato o maior deles
;continuao do programa

Pgina 5 de 12

Cap6 Instrues de controle de fluxo.

6.4 Salto incondicional


JMP rtulo_de_destino

Rtulo_de_destino uma posio no programa, no mesmo segmento de


cdigo onde JMP aparece

No h restrio de faixa de endereamento como em JXXX

JMP pode ajudar a solucionar o problema de faixa de endereamento das


instrues JXXX

Exemplo: trecho utilizando JMP e JXXX


TOPO:

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

Cap6 Instrues de controle de fluxo.

6.5 Uma instruo de lao especial - LOOP.


LOOP

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

Obs: so equivalentes as seqncias

TOPO:

MOV CX, (valor_inicial)


...
...
LOOP TOPO

TOPO:

Pgina 7 de 12

MOV CX, (valor_inicial)


...
...
DEC CX
JNZ TOPO

Cap6 Instrues de controle de fluxo.

6.6 Atividades prticas.


1) Escreva um programa que apresente uma '?', leia em seguida duas letras
maisculas e exiba-as na prxima linha, em ordem alfabtica.
2) Modifique o programa de exibio de caracteres ASCII (pgina 1), de forma
a exibir 16 caracteres por linha separados por espaos em branco.
3) Escreva um programa que pea ao usurio para teclar um dgito
hexadecimal, exiba na prxima linha o seu valor decimal e pergunte ao
usurio se deseja continuar a utilizar o programa: se for digitado S (sim), o
programa se repete desde o comeo; se for digitado outro caracter, o
programa termina. Teste se o dgito hexa est na faixa de valores correta. Se
no estiver, exiba uma mensagem para o usurio tentar de novo.
4) Crie um trecho de cdigo modificando o programa do exerccio (3) acima,
tal que se o usurio falhar em entrar com um dgito hexa na faixa correta mais
do que trs tentativas, o programa exibe uma mensagem adequada e termina.
5) Crie um programa que implemente uma multiplicao por meio de somas
sucessivas. Faa as consideraes que achar necessrias.
6) Crie um programa que implemente uma diviso por meio de subtraes
sucessivas, exibindo o quociente e o resto com mensagens adequadas. Faa
as consideraes que achar necessrias.

Pgina 8 de 12

Cap6 Instrues de controle de fluxo.

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

Exemplo: Suponha que AL e BL contenham dois caracteres ASCII; exiba


aquele que seja o primeiro em ordem alfabtica.
Em linguagem de alto nvel:
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

Cap6 Instrues de controle de fluxo.

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

Cap6 Instrues de controle de fluxo.

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

Cap6 Instrues de controle de fluxo.

4) REPEAT loop
Em linguagem de alto nvel:
REPEAT
(seqncia de instrues)
UNTIL

(condio_verdadeira)

Exemplo: Ler caracteres ASCII do teclado, contando sua quantidade, at que


o caracter Carriage Return (CR) aparea.
Em linguagem de alto nvel:
REPEAT

(ler caracter do teclado e armazen-lo)


(contador = contador + 1)
UNTIL (caracter igual a CR)
Em linguagem montadora:
...
MOV DX,0h
MOV AH,1h
;repeat
LOOP:
INT 21h
MOV (algum lugar),AL
INC DX
CMP AL,0Dh
JNE LOOP
;until
...

;inicializao
;l um caracter em AL
;salvando o caracter lido
;conta nmero de caracteres
; o caracter CR?
;salto enquanto caracter no CR

Obs: O lao realizado ao menos uma vez; o caracter CR armazenado.

Pgina 12 de 12

Cap7 Instrues lgicas, de deslocamento e de rotao

7. Instrues lgicas, de deslocamento e de rotao

So instrues que permitem mudar o padro de bits num byte (8 bits) ou


numa palavra (16 bits).

Linguagens de alto nvel (exceto C) no permitem manipular diretamente


bits.

Instrues lgicas AND, OR, XOR e NOT so usadas para:


- resetar (reset) ou limpar (clear) um bit:
1 -> 0
- setar (set) um bit:
0 -> 1
- examinar bits
- realizar mscaras para manipular bits em determinadas posies
Operadores lgicos:
a
0
0
1
1

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

Obs: em bytes ou palavras, os operadores lgicos so aplicados bit a bit.

Instrues de deslocamento (shift):


- deslocar para a esquerda 1 casa bimria => multiplicar por dois
- deslocar para a direita 1 casa binria => dividir por dois
- os bits deslocados para fora so perdidos

Instrues de rotao (rotate):


- deslocar de forma circular (em anel) para a esquerda ou para a direita
- nenhum bit perdido, pois aquele que for deslocado para fora de um
lado reintroduzido no outro lado.

Pgina 1 de 22

Cap7 Instrues lgicas, de deslocamento e de rotao

7.1 Instrues lgicas

AND destino,fonte
OR destino,fonte
XOR destino,fonte

Usadas para aplicar os operadores lgicos correspondentes bit a bit entre:


registrador e registrador
registrador e uma posio de memria
o operando fonte pode ser tambm uma constante
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, ou seja, so resetados

Exemplos de instrues vlidas:


XOR AX,BX

;operador XOR aplicado aos contedos de AX e BX,


;resultado em AX

AND CH,01h

;operador AND aplicado ao contedo de CH, tendo


;como fonte o valor imediato 01h = 0000 0001b

OR WORD1,BX

;operador OR entre contedos da posio de memria


;WORD1 e de BX, resultado armazenado em WORD1

Pgina 2 de 22

Cap7 Instrues lgicas, de deslocamento e de rotao

Graficamente: suponha a instruo AND BL,AL


Antes

Depois

BL
AAh = 1010 1010b

BL
0Ah = 0000 1010b

AL
0Fh = 0000 1111b

AL
0Fh = 0000 1111b

Obs: Propriedades dos operadores lgicos aplicados bit a bit:


bit(x) AND 0
bit(x) OR 0
bit(x) XOR 0

=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.

XOR pode ser utilizado para complementar (inverter) bits especficos:


deve-se ter um 1 na posio em que se deseja este efeito.

Pgina 3 de 22

Cap7 Instrues lgicas, de deslocamento e de rotao

Exemplos de mscaras:
1) Setar os bits MSB e LSB do registrador AX, dado AX = 7444h:
OR AX,8001h
AX (antes)
8001h
AX (depois)

->
->

0111 0100 0100 0100b


1000 0000 0000 0001b

->

7444h

->

1111 0100 0100 0101b

->

F445h

OR______________________________________

2) Convertendo o cdigo ASCII de um dgito numrico em seu valor binrio:


AND AL,0Fh
AL (antes)
0Fh
AL (depois)

(em substituio a: SUB AL,30h)

->
->

0011 0111b
0000 1111b

->

37h = "7" = 55d

->

0000 0111b

->

07h = 7d (valor sete)

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

Cap7 Instrues lgicas, de deslocamento e de rotao

Mais exemplos de aplicao de operaes lgicas:


1) Limpando (zerando) um registrador:
XOR AX, AX
AX (antes)
AX (depois)

->
->

0111 0100 0100 0100b


0111 0100 0100 0100b

->

7444h

->

0000 0000 0000 0000b

->

0000h = 0

XOR_____________________________________

Obs: esta forma mais rpida de executar do que as outras opes


MOV AX,0000h

SUB AX,AX

2) Testando se o contedo de algum registrador zero:


OR CX,CX
CX (antes)
CX (depois)

->
->

0111 0100 0100 0100b


0111 0100 0100 0100b

->

7444h

->

0111 0100 0100 0100b

->

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

Cap7 Instrues lgicas, de deslocamento e de rotao

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

;inverte todos os bits de AX

NOT AL

;inverte todos os bits de AL

NOT BYTE1

;inverte todos os bits do contedo da posio de


;memria definida pelo nome BYTE1

Graficamente: suponha a instruo NOT WORD1


Antes

Depois

BYTE1
81h = 1000 0001b

BYTE1
7Eh = 0111 1110b

Pgina 6 de 22

Cap7 Instrues lgicas, de deslocamento e de rotao

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

;operao AND entre AX e BX, no h resultado, mas


;apenas alterao dos FLAGS ZF, SF e PF

TEST AL,01h

;operao AND entre AL e o valor imediato 01h

Pgina 7 de 22

Cap7 Instrues lgicas, de deslocamento e de rotao

Graficamente: suponha a instruo TEST AX,0001h


Antes

Depois

AX
4444h = 0100 0100 0100 0100b

AX
0100 0100 0100 0100b

ZF
0

ZF
1

Neste exemplo, a mscara 0001h serve para testar se o contedo de AX


PAR (todo nmero binrio PAR possui um zero no LSB)

O nmero 4444h PAR pois o seu LSB vale zero

4444h AND 0001h produz como resultado 0000h que faz ZF = 1

o resultado no armazenado em AX, somente ZF modificado por TEST

Exemplo: escreva um trecho de programa que salte para o rtulo PONTO2 se


o contedo de CL for negativo:
....
TEST CL,80h
;80h a mscara 1000 0000b
JNZ PONTO2
....
(o programa prossegue, pois o nmero positivo)
....
PONTO2: ....
(o programa opera aqui com o nmero negativo)
....

Pgina 8 de 22

Cap7 Instrues lgicas, de deslocamento e de rotao

7.2 Atividades prticas.


1) D a operao lgica e a mscara correspondente para cada item abaixo,
tal que:
a) Limpe (clear) os bits pares de AX, deixando os restantes sem
alterao;
b) Sete (set) o MSB de BL, permanecendo os restantes como esto;
c) Complemente o MSB de DX, deixando os restantes intocados;
d) Remova os quatro bits mais significativos de AL, permanecendo os
restantes inalterados;
e) Faa o complemento de 2 de BX sem utilizar a instruo NEG (talvez
seja necessrio um trecho de programa ao invs de uma nica
operao lgica).

2) Use a instruo TEST em cada item abaixo para:


a) Fazer ZF = 1 caso o contedo de AX seja zero;
b) Zerar ZF caso o o contedo de BL seja IMPAR;
c) Setar SF caso o contedo de DX seja um nmero negativo;
d) Setar ZF caso o contedo de DX seja zero ou um nmero positivo;
e) Setar PF caso BL contenha um nmero PAR de bits 1.

Pgina 9 de 22

Cap7 Instrues lgicas, de deslocamento e de rotao

7.3 Instrues de deslocamento:


Sxx destino, 1
Sxx destino, CL
Usada para deslocar para a esquerda ou para a direita:
- 1 bit
- tantos quantos CL indicar
um registrador
uma posio de memria
Sxx
SHL
SAL
SHR
SAR

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

;desloca os bits de AX para a esquerda 1 casa binria,


;sendo o LSB igual a zero

SAL BL,CL

;desloca os bits de BL para a esquerda tantas casas


;binrias quantas CL indicar, os bits menos
;significativos so zero (mesmo efeito de SHL)

SAR DH,1

;desloca os bits de DH para a direita 1 casa binria,


;sendo que o MSB mantem o sinal

Pgina 10 de 22

Cap7 Instrues lgicas, de deslocamento e de rotao

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

Cap7 Instrues lgicas, de deslocamento e de rotao

Exemplos:
1) Multiplique o contedo de AX por 8, supondo AX contendo 0005h = 5d:
AX (original)

0000 0000 0000 0101

= 5d

aps o 1o. deslocamento

0000 0000 0000 1010

= 10d

aps o 2o. deslocamento

0000 0000 0001 0100

= 20d

aps o 3o. deslocamento

0000 0000 0010 1000

= 40d

trecho de programa:

...
MOV
SHL
...

CL,3
AX,CL

;poderia ser SAL AX,CL

2) Divida o contedo de DH por 4, supondo DH contendo 12h = 18d:


DH (original)

0001 0010= 18d

aps o 1o. deslocamento

0000 1001= 9d

aps o 2o. deslocamento

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

Cap7 Instrues lgicas, de deslocamento e de rotao

7.4 Instrues de rotao:


Rxx destino, 1
Rxx destino, CL
Usada para rodar (deslocar em anel) para a esquerda ou para a direita:
- 1 bit
- tantos quantos CL indicar
um registrador
uma posio de memria
Rxx
ROL
ROR
RCL
RCR

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

;desloca os bits de AX para a esquerda 1 casa binria,


;sendo o MSB reinserido na posio LSB

ROR BL,CL

;desloca os bits de BL para a direita tantas casas


;binrias quantas CL indicar, os bits menos
;significativos so reinseridos um-a-um no MSB

RCR DH,1

;desloca os bits de DH para a direita 1 casa binria,


;sendo que o MSB recebe CF e o LSB salvo em CF

Pgina 13 de 22

Cap7 Instrues lgicas, de deslocamento e de rotao

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

Cap7 Instrues lgicas, de deslocamento e de rotao

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
...

;inicializa-se BL com zero


;inicializa-se contador de bits (AX tem 16 bits)
;roda-se AX 1 casa a esquerda e
;CF contem uma cpia do bit deslocado
;se CF = 1
;conta-se 1 em BL
;seno, processegue-se no lao
;at que CX = 0

2) Invertendo o padro de bits de AL:


Se AL (antes) = 1000 1100b, AL (depois) = 0011 0001b

TOPO:

...
XOR BL,BL
MOV CX,8
SHL AL,1
RCR BL,1
LOOP TOPO
MOV AL,BL
...

;inicializa-se BL com zero


;inicaliza-se contador de bits (AL tem 8 bits)
;desloca-se AL 1 casa para a esquerda
;CF contem o bit deslocado para fora
;roda-se BL para a direita atravs de CF
;enquanto CX no for zero, repete TOPO
;quando CX = 0, AL recebe o padro

Pgina 15 de 22

Cap7 Instrues lgicas, de deslocamento e de rotao

7.5 Entrada e sada de nmeros binros e hexadecimais:

Entrada de nmeros binrios:


- string de caracteres "0's" e "1's" fornecidos pelo teclado;
- CR o marcador de fim de string;
- BX assumido como registrador de armazenamento;
- mximo de 16 bits de entrada.

Algoritmo bsico em linguagem de alto nvel:


Limpa BX
Entra um caracter "0" ou "1"
WHILE caracter diferente de CR DO
Converte caracter para valor binrio
Desloca BX 1 casa para a esquerda
Insere o valor binrio lido no LSB de BX
Entra novo caracter
END_WHILE
Trecho de programa implementado em Linguagem Montadora:
...
MOV CX,16
;inicializa contador de dgitos
MOV AH,1h
;funo DOS para entrada pelo teclado
XOR BX,BX
;zera BX -> ter o resultado
INT 21h
;entra, caracter est no AL
;while
TOPO:
CMP AL,0Dh
; CR?
JE FIM
;se sim, termina o WHILE
AND AL,0Fh
;se no, elimina 30h do caracter
;(poderia ser SUB AL,30h)
SHL BX,1
;abre espao para o novo dgito
OR BL,AL
;insere o dgito no LSB de BL
INT 21h
;entra novo caracter
LOOP TOPO
;controla o mximo de 16 dgitos
;end_while
FIM:
...

Pgina 16 de 22

Cap7 Instrues lgicas, de deslocamento e de rotao

Sada de nmeros binrios:


- BX assumido como registrador de armazenamento;
- total de 16 bits de sada;
- string de caracteres "0's" e "1's" exibido no monitor de vdeo.

Algoritmo bsico em linguagem de alto nvel:


FOR 16 vezes DO
rotao de BX esquerda 1 casa binria (MSB vai para o CF)
IF CF = 1
THEN exibir no monitor caracter "1"
ELSE exibir no monitor caracter "0"
END_IF
END_FOR
Trecho de programa implementado em Linguagem Montadora:

;for 16 vezes do
PT1:
;if CF = 1
;then
;else

PT2:

;end_if
;end_for

...
MOV CX,16
MOV AH,02h

;inicializa contador de bits


;prepara para exibir no monitor

ROL BX,1

;desloca BX 1 casa esquerda

JNC PT2

;salta se CF = 0

MOV DL, 31h


INT 21h

;como CF = 1
;exibe na tela "1" = 31h

MOV DL, 30h


INT 21h

;como CF = 0
;exibe na tela "0" = 30h

LOOP PT1

;repete 16 vezes

...

Pgina 17 de 22

Cap7 Instrues lgicas, de deslocamento e de rotao

Entrada de nmeros hexadecimais:


- BX assumido como registrador de armazenamento;
- string de caracteres "0" a "9" ou de "A" a "F", digitado no teclado;
- mximo de 16 bits de entrada ou mximo de 4 dgitos hexa.

Algoritmo bsico em linguagem de alto nvel:


Inicializa BX
Entra um caracter hexa
WHILE caracter diferente de CR DO
Converte caracter para binrio
Desloca BX 4 casas para a esquerda
Insere valor binrio nos 4 bits inferiores de BX
Entra novo caracter
END_WHILE
Trecho de programa implementado em Linguagem Montadora:
...
XOR BX,BX
;inicializa BX com zero
MOV CL,4
;inicializa contador com 4
MOV AH,1h
;prepara entrada pelo teclado
INT 21h
;entra o primeiro caracter
;while
TOPO:
CMP AL,0Dh
; o CR ?
JE FIM
CMP AL, 39h
;caracter nmero ou letra?
JG LETRA
;caracter j est na faixa ASCII
AND AL,OFh
;nmero: retira 30h do ASCII
JMP DESLOC
LETRA: SUB AL,37h
;converte letra para binrio
DESLOC: SHL BX,CL
;desloca BX 4 casas esquerda
OR BL,AL
;insere valor nos bits 0 a 3 de BX
INT 21h
;entra novo caracter
JMP TOPO
;faz o lao at que haja CR
;end_while
FIM:
...

Pgina 18 de 22

Cap7 Instrues lgicas, de deslocamento e de rotao

Sada de nmeros hexadecimais:


- BX assumido como registrador de armazenamento;
- total de 16 bits de sada;
- string de caracteres HEXA exibido no monitor de vdeo.

Algoritmo bsico em linguagem de alto nvel:


FOR 4 vezes DO
Mover BH para DL
Deslocar DL 4 casas para a direita
IF DL < 10
THEN converte para caracter na faixa 0 a 9
ELSE converte para caracter na faixa A a F
END_IF
Exibio do caracter no monitor de vdeo
Rodar BX 4 casas esquerda
END_FOR

Pgina 19 de 22

Cap7 Instrues lgicas, de deslocamento e de rotao

Trecho de programa implementado em Linguagem Montadora:

;for 4 vezes do
TOPO:

...
MOV CH,4
MOV CL,4
MOV AH,2h

;BX j contem nmero binrio


;CH contador de caracteres hexa
;CL contador de delocamentos
;prepara exibio no monitor

MOV DL,BH

;captura em DL os oito bits mais


;significativos de BX
;resta agora em DL somente os 4
;bits mais significativos de BX

SHR DL,CL
;if DL , 10

CMP DL, 0Ah


JAE LETRA

;testa se letra ou nmero

ADD DL,30h
JMP PT1

; nmero: soma-se 30h

LETRA:

ADD DL,37h

;ao valor soma-se 37h -> ASCII

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

;faz o FOR 4 vezes

Pgina 20 de 22

Cap7 Instrues lgicas, de deslocamento e de rotao

7.6 Atividades prticas.


1) Suponha as condies iniciais AL = 11001011b e CF = 1. D o novo
contedo de AL aps cada uma das seguintes instrues, sempre com base
nas condies iniciais acima:
a) SHL AL,1
b) SHR AL,1
c) ROL AL,CL
;CL contendo 2
d) ROR AL,CL
;CL contendo 3
e) SAR AL,CL
;CL contendo 2
f) RCL AL,1
g) RCR AL,CL
;CL contendo 3
2) Escreva um programa que pea ao usurio para entrar um caracter ASCII,
na prxima linha exiba no monitor uma mensagem apresentando o valor
binrio deste cdigo e numa segunda linha exiba outra mensagem que
apresente o nmero de bits "1" existentes no cdigo ASCII.
3) Escreva um programa que pea ao usurio para entrar um caracter ASCII,
na prxima linha exiba no monitor o caracter lido e numa segunda linha exiba
outra mensagem que apresente o valor hexadecinal correspondente ao cdigo
ASCII. Repita este procedimento at que o usurio entre comum carriage
return CR. Exemplo:
Digite um caracter: Z
O codigo ASCII de Z em hexa vale: 5Ah
Digite um caracter: ...
4) Escreva um programa que pea ao usurio para entrar um nmero
hexadecimal de 4 dgitos ou menos, terminado com CR, e exiba na prxima
linha do monitor o mesmo nmero expandido em binrio. Na leitura, faa com
que o apenas letras maisculas de A a F sejam aceitas. Se houver um
caracter ilegal, o programa deve emitir uma mensagem instruindo o usurio a
tentar novamente.

Pgina 21 de 22

Cap7 Instrues lgicas, de deslocamento e de rotao

5) Escreva um programa que pea ao usurio para entrar um nmero binrio


de 16 dgitos ou menos, terminado com CR, e exiba na prxima linha do
monitor o mesmo nmero compactado em hexadecimal. Se houver um
caracter ilegal durante a entrada do nmero binrio, o programa deve emitir
uma mensagem instruindo o usurio a tentar novamente.
6) Escreva um programa que pea ao usurio para entrar dois nmeros
binrios, cad um com 8 dgitos ou menos, terminado com CR, e exiba na
prxima linha do monitor o valor binrio da soma destes nmeros. Se houver
um caracter ilegal durante a entrada dos nmeros binrios, o programa deve
emitir uma mensagem instruindo o usurio a tentar novamente. Considere
representao no sinalizada para os nmeros. Considere que o 9o. bit (vai
um), se houver, estar em CF e poder ser exibido, tal como no exemplo
abaixo:
Entre o primeiro nmero binrio (at 8 bits):
11001010
Entre o segundo nmero binrio (at 8 bits):
10011100
A soma binria vale: 101100110 -> resultado de 9 bits
7) Considerando o exemplo 2 da pgina 6.12, que divide o contedo de DH
por 4, suponha um nmero genrico sem sinal menor que 255 e escreva um
trecho de programa que faa a diviso inteira indicando o quociente e o resto.
Coloque o quociente em BH e o resto em BL, sem destruir o dividendo DH.
Exemplo:
DH (original)

0001 0010= 18d

aps a diviso por 4:


quociente
BH =

0000 0100= 4d

com resto

0000 0010= 2d

BL =

Pgina 22 de 22

Cap8 Pilha e subrotinas

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

;dimensiona o tamanho da pilha

SS -> aponta o incio do segmento de pilha (base)


SP -> aponta o topo da pilha (define o deslocamento do topo em
relao base)
A pilha cresce do topo para baixo.

Endereo para acesso pilha: SS:SP (no. de segmento:offset)

Movimentar dados para pilha:

PUSH fonte,
PUSHF

Movimentar dados da pilha:

POP destino,
POPF

As instrues de pilha no alteram os FLAGS

No possvel movimentar dados de 8 bits, nem valores imediatos

Pgina 1 de 10

Cap8 Pilha e subrotinas

8.2 Instrues para colocar dados na pilha:


PUSH fonte
PUSHF

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

Cap8 Pilha e subrotinas

8.3 Instrues para retirar dados na pilha:


POP destino
POPF
onde destino :
um registrador de 16 bits
uma palavra de memria ou varivel de 16 bits (de tipo DW)
A execuo de POP resulta nas seguintes aes:
o contedo das posies SS:SP (byte baixo) e SS:(SP + 1) (byte alto)
movido para o destino
o registrador SP (stack pointer) incrementado de 2
A execuo de POPF , que no possui operando, resulta:
o contedo das posies SS:SP (byte baixo) e SS:(SP + 1) (byte alto)
movido para o registrador de FLAGS
o registrador SP (stack pointer) decrementado de 2
Exemplo de operao:

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

Cap8 Pilha e subrotinas

Um exemplo de uso de pilha:


TITLE ENTRADA INVERTIDA
.MODEL SMALL
.STACK 100h
.CODE
MOV AH,2
;exibe o Prompt para o usuario
MOV DL,'?'
;caracter '?' para a tela
INT 21h
;exibe
XOR CX,CX
;inicializando contador de caracteres em zero
MOV AH,1
;prepara para ler um caracter do teclado
INT 21h
;caracter em AL
;while caracter nao e' <CR> do
INICIO: CMP AL,0DH ;e' o caracter <CR>?
JE PT1
;sim, entao saindo do loop
;salvando o caracter na pilha e incrementando o contador
PUSH AX
;AX vai para a pilha (interessa somente AL)
INC CX
;contador = contador + 1
;lendo um novo caracter
INT 21h
;novo caracter em AL
JMP INICIO
;retorna para o inicio do loop
;end_while
PT1:
MOV AH,2
;prepara para exibir
MOV DL,0DH ;<CR>
INT 21h
;exibindo
MOV DL,0AH ;<LF>
INT 21h
;exibindo: mudana de linha
JCXZ FIM
;saindo se nenhum caracter foi digitado
;for contador vezes do
TOPO:
POP DX
;retira o primeiro caracter da pilha
INT 21h
;exibindo este caracter
LOOP TOPO ;em loop at CX = 0
;end_for
FIM:
MOV AH,4CH ;preparando para sair para o DOS
INT 21H
END

Pgina 4 de 10

Cap8 Pilha e subrotinas

8.4 Terminologia para subrotinas (ou procedures)


Sintaxe para subrotinas:
PROC
tipo
nome
;
;corpo da subrotina - instrues
;
RET
;transfere o controle de volta para a rotina principal
ENDP
nome
Obs: tipos possveis

NEAR -> subrotina no mesmo segmento de cdigo


FAR -> em outro segmento de cdigo

Mecanismo de chamada e retorno:


PRINCIPAL PROC
...
CALL SUB1
;prxima instruo
...
PRINCIPAL ENDP
SUB1
PROC
;primeira instruo
...
RET
SUB1
ENDP
Comunicao de dados entre subrotinas:
em Linguagem Montadora, no h lista de parmetros;
se h poucos valores de entrada e sada -> usar registradores

Pgina 5 de 10

Cap8 Pilha e subrotinas

8.5 Chamada e retorno de subrotinas


Instruo de chamada:
CALL nome

IP, que contem o offset do endereo da prxima instruo da rotina


"chamante" (aps a instruo CALL), armazenado na pilha;
IP recebe o offset do endereo da primeira instruo da subrotina
chamada.

Instruo de retorno:
RET

faz com que o offset do endereo da prxima instruo da rotina


"chamante", que est na pilha, seja recarregado em IP.

Ambos CALL e RET no afetam FLAGS.

Pgina 6 de 10

Cap8 Pilha e subrotinas

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

Cap8 Pilha e subrotinas

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

Cap8 Pilha e subrotinas

8.6 Atividades prticas.


1) Suponha que AX = 1234h, BX = 5679h, CX = 9ABCh e SP = 0100h. D o
contedo de AX, BX, CX e SP aps a execuo do seguinte trecho de
programa:
...
PUSH AX
PUSH BX
XCHG AX,CX
POP CX
PUSH AX
POP BX
2) Escreva algumas linhas de programa para:
a) colocar o contedo do topo da pilha em AX, sem modificar o
contedo e a posio do topo da pilha;
b) colocar em CX a palavra que esteja abaixo daquela do topo da pilha
(voc poder usar AX como registrador auxiliar;
c) troque os contedos das duas palavras do topo da pilha (a do topo e
a logo abaixo desta - voc poder usar AX e BX como auxiliares).
3) O seguinte mtodo pode ser usado para gerar nmeros aleatrios na faixa
de 1 a 32767:
- inicie com qualquer nmero na faixa acima;
- desloque uma casa binria esquerda;
- substitua o bit 0 pelo XOR dos bits 14 e 15;
- limpe o bit 15.
Escreva as seguintes rotinas (procedures):
a) subrotina LEIA que permita ao usurio entrar um nmero binrio e
armazen-lo em AX (baseie-se no trecho para entrada binria da
pgina 6.16);

Pgina 9 de 10

Cap8 Pilha e subrotinas

b) subrotina ALEATORIO que recebe um nmero em AX e retorna um


nmero aleatrio tambm em AX, segundo o mtodo acima
apresentado;
c) subrotina ESCREVA que exibe AX em binrio no monitor (baseie-se
no trecho de sada binria da pgina 6.17);
d) escreva uma rotina PRINCIPAL que emita uma mensagem ao
usurio para entrar com o nmero binrio inicial de 16 bits, chame a
subrotina LEIA para ler tal nmero, chame as subrotinas ALEATORIO e
ESCREVA para calcular e exibir 100 nmeros aleatrios, que devem
ser apresentados na tela cada um com 16 bits seguidos, 4 por linha,
cada grupo separado por 4 espaos em branco.
4) Converta os trechos de programas apresentados no captulo 6 para
entrada e sada binria e hexadecimal em subrotinas. Faa as devidas
consideraes sobre onde esto os valores a serem passados do programa
principal para cada subrotina, e vice-versa (este mecanismo conhecido
como passagem de parmetros), produzindo os comentrios necessrios
logo no inicio das mesmas. Observe que a partir desta questo, voc ter seis
subrotinas muito tes para entradas e sadas de nmeros nas trs bases
numricas: binrio, hexa e decimal. No h necessidade de se reinventar a
roda a todo o momento; a partir de agora, qualquer rotina muito comum
pode ser posta no formato de subrotina e simplesmente chamada em
qualquer programa.
5) Escreva uma subrotina para entrar caracteres letras (maisculas ou
minsculas) a pertir do teclado, verificando se pertencem s respectivas faixas
de validade. Faa todas as consideraes que julgar necessrias.

Pgina 10 de 10

Cap9 Instrues de multiplicao e diviso

9. Instrues de multiplicao e diviso


9.1 Instrues de multiplicao
MUL fonte
IMUL fonte

MUL (multiply) -> usada com nmeros em representao no-sinalizada

IMUL (integer multiply) -> usada com nmeros sinalizados

Multiplicao com nmeros em formato byte:


- registradores de 8 bits e variveis de tipo DB
- segundo operando assumido em AL
- resultado (destino) pode atingir 16 bits e se encontra em AX
Multiplicao com nmeros em formato word:
- registradores de 16 bits e variveis de tipo DW
- segundo operando assumido em AX
- resultado pode atingir 32 bits (tamanho doubleword) e se encontra em
DX -> 16 bits mais significativos
(high word)
AX -> 16 bits menos significativos
(low word)
Para nmeros positivos (MSB = 0), MUL e IMUL do o mesmo resultado.
Flags afetados:
SF, ZF, AF, PF -> indefinidos
aps MUL, CF/OF (ambos)

= 0 , se a metade superior do resultado 0


= 1 , caso contrrio

aps IMUL, CF/OF (ambos)

= 0 , se a metade superior do resultado for


extenso do sinal da metade inferior
= 1 , caso contrrio

Pgina 1 de 13

Cap9 Instrues de multiplicao e diviso

Exemplos de casos de multiplio:


1) Suponha que AX contenha 0001h BX contenha FFFFh:
antes:
Instruo
MUL BX
IMUL BX

AX = 0001 h = 0000 0000 0000 0001b =


1
BX = FFFF h = 1111 1111 1111 1111b = 65535
Resultado
decimal
65535
-1

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

2) Suponha que AX contenha 0FFF h:


antes:
Instruo
MUL AX
IMUL AX

AX = 0FFF h = 0000 1111 1111 1111 h = 4095 ou + 4095


Resultado
decimal
16769025
16769025

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

3) Suponha que AL contenha 80h BL contenha FFh:


antes:
Instruo
MUL BL
IMUL BL

AL = 80 h =
BL = FF h =
Resultado
decimal
32640
128

1000 0000 b = 128 ou -128


1111 1111 b = 255 ou
-1
Resultado
hexadecimal
7F80 h
0080 h

Pgina 2 de 13

Cap9 Instrues de multiplicao e diviso

9.2 Instrues de diviso


DIV fonte
IDIV fonte
DIV (divide) -> usada com nmeros em representao no-sinalizada
IDIV (integer divide) -> usada com nmeros sinalizados
fonte deve ser considerado como divisor (no pode ser uma constante)
Diviso com nmeros em formato byte:
- o divisor assumido ser de 8 bits (1 byte)
- o dividendo assumido estar em AX (16 bits)
- aps a execuo: o quociente de 8 bits estar em AL
o resto de 8 bits estar em AH
Diviso com nmeros em formato word:
- o divisor assumido ser de 16 bits (1 word)
- o dividendo assumido ser de 32 bits:
DX -> 16 bits mais significativos do dividendo
AX -> 16 bits menos significativos do dividendo
- aps a execuo:

(high word)
(low word)

o quociente de 16 bits estar em AX


o resto de 16 bits estar em DX

Para nmeros positivos (MSB = 0), DIV e IDIV fornecem o mesmo


resultado.
Flags afetados: todos ficam indefinidos
Em diviso de nmeros em representao sinalizada, o resto possui o
mesmo sinal do dividendo.

Pgina 3 de 13

Cap9 Instrues de multiplicao e diviso

Exemplos de casos de diviso:


1) Suponha que DX e AX contenham 0000h e 0005h, e BX contenha FFFEh:
antes:
Instruo
DIV BX
IDIV BX

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

2) Suponha que AX contenha 0005 h e BL contenha FF h:


antes:
Instruo
DIV BL
IDIV BL

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

3) Suponha que AX contenha 00FB h e BL contenha FF h:


antes:
Instruo
DIV BL
IDIV BL

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
-

(*) como -251 no cabe em AL (8 bits) -> ocorre DIVIDE OVERFLOW


situao de erro catastrfico que faz com que o programa termine.

Pgina 4 de 13

Cap9 Instrues de multiplicao e diviso

9.3 Extenso do sinal do dividendo


a) Em operaes em formato word:
Caso o dividendo de uma diviso (composto de DX : AX) ocupe apenas AX,
DX deve ser preparado, pois sempre considerado:
- Em DIV -> DX deve ser zerado
- EM IDIV -> DX deve ter a extenso de sinal de AX
CWD
instruo sem operandos (zero operandos) que converte word para
doubleword e estende o sinal de AX para DX;
deve ser usada com IDIV
b) Em operaes em formato byte:
Caso o dividendo de uma diviso (composto por AX) ocupe apenas AL,
AH deve ser preparado, pois sempre considerado.
- Em DIV -> AH deve ser zerado
- EM IDIV -> AH deve ter a extenso de sinal de AL
CBW
instruo sem operandos (zero operandos) que converte byte para word e
estende o sinal de AL para AH;
deve ser usada com IDIV

Pgina 5 de 13

Cap9 Instrues de multiplicao e diviso

Exemplos de divises com ajuste de extenso:


1) Crie um trecho de programa que divida -1250 por 7.
...
MOV AX, -1250
CWD
MOV BX,7
IDIV BX
...

;AX recebe o dividendo


;estende o sinal de AX para DX
;BX recebe o divisor
;executa a diviso
;aps a execuo, AX recebe o
;quociente e DX recebe o resto

2) Crie um trecho de programa que divida a varivel sinalizada


XBYTE por -7.
...
MOV AL,XBYTE
;AL recebe o dividendo
CBW
;estende o sinal (eventual) de
;AL para AH
MOV BL, -7
;BL recebe o divisor
IDIV BL
;executa a diviso
;aps a execuo, AL recebe o
;quociente e AH recebe o resto
...

Obs: No h efeito de CBW e CWD sobre os FLAGS.

Pgina 6 de 13

Cap9 Instrues de multiplicao e diviso

9.4 E/S de nmeros decimais


Entrada de nmeros decimais:
- string de caracteres nmeros de 0 a 9, fornecidos pelo teclado;
- CR o marcador de fim de string;
- AX assumido como registrador de armazenamento;
- valores decimais permitidos na faixa de - 32768 a + 32767;
- sinal negativo deve ser apresentado.
Algoritmo bsico em linguagem de alto nvel:
total = 0
negativo = FALSO
ler um caracter
CASE caracter OF
- : negativo = VERDADEIRO e ler um caracter
+ : ler um caracter
END_CASE
REPEAT
converter caracter em valor binrio
total = 10 x total + valor binrio
ler um caracter
UNTIL caracter um carriage return (CR)
IF negativo = VERDADEIRO
THEN total = - (total)
END_IF
Obs: o loop do tipo CASE pode ser entendido como um IF mltiplo, que
testa simultaneamente os vrios "casos": se algum deles for verdadeiro,
executa as instrues relacionadas; se todos os "casos" forem falsos, no
executa nada e vai para o fim do CASE.

Pgina 7 de 13

Cap9 Instrues de multiplicao e diviso

Subrotina de entrada de nmeros decimais em Linguagem Montadora:


ENTDEC PROC
;le um numero decimal da faixa de -32768 a +32767
;variaveis de entrada: nehuma (entrada de digitos pelo teclado)
;variaveis de saida:
AX -> valor binario equivalente do numero decimal
PUSH BX
PUSH CX
PUSH DX
;salvando registradores que sero usados
XOR BX,BX
;BX acumula o total, valor inicial 0
XOR CX,CX
;CX indicador de sinal (negativo = 1), inicial = 0
;entrada de nmero: mensagem adequada j exibida para o usurio anteriormente
MOV AH,1h
INT 21h
;le caracter no AL
CMP AL, -
;sinal negativo?
JE MENOS
CMP AL,+
;sinal positivo?
JE MAIS
JMP NUM
;se nao sinal, ento v processar o caracter
MENOS: MOV CX,1
;negativo = verdadeiro
MAIS:
INT 21h
;le um outro caracter
NUM:
AND AX,000Fh
;junta AH a AL, converte caracter para binrio
PUSH AX
;salva AX (valor binrio) na pilha
MOV AX,10
;prepara constante 10
MUL BX
;AX = 10 x total, total est em BX
POP BX
;retira da pilha o valor salvo, vai para BX
ADD BX,AX
;total = total x 10 + valor binrio
MOV AH,1h
INT 21h
;le um caracter
CMP AL,0Dh
; o CR ?
JNE NUM
;se no, vai processar outro dgito em NUM
MOV AX,BX
;se CR, ento coloca o total calculado em AX
CMP CX,1
;o numero negativo?
JNE SAIDA
;no
NEG AX
;sim, faz-se seu complemento de 2
SAIDA:
POP DX
POP CX
POP BX
;restaura os contedos originais
RET
;retorna a rotina que chamou
ENTDEC ENDP
Pgina 8 de 13

Cap9 Instrues de multiplicao e diviso

Sada de nmeros decimais:


- AX assumido como registrador de armazenamento;
- valores decimais na faixa de - 32768 a + 32767;
- exibe sinal negativo, se o contedo de AX for negativo;
- string de caracteres nmeros de 0 a 9, exibidos no monitor de vdeo.
Algoritmo bsico em linguagem de alto nvel:
IF AX < 0
THEN

exibe um sinal de menos


substitui-se AX pelo seu complemento de 2

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

Idia bsica da tcnica de decomposio decimal do nmero em AX:


Pilha
24618 dividido por 10 = 2461 com resto 8 ->
0008h
2461
dividido por 10 = 246
0001h
com resto 1 ->
246
dividido por 10 = 24
0006h
com resto 6 ->
24
dividido por 10 = 2
0004h
com resto 4 ->
2
0002h
dividido por 10 = 0
com resto 2 ->
<- Topo

Pgina 9 de 13

Cap9 Instrues de multiplicao e diviso

Subrotina de sada de nmeros decimais em Linguagem Montadora:


SAIDEC PROC
;exibe o conteudo de AX como decimal inteiro com sinal
;variaveis de entrada: AX -> valor binario equivalente do nmero decimal
;variaveis de saida:
nehuma (exibio de dgitos direto no monitor de video)
PUSH AX
PUSH BX
PUSH CX
PUSH DX
;salva na pilha os registradores usados
OR AX,AX
;prepara comparao de sinal
JGE PT1
;se AX maior ou igual a 0, vai para PT1
PUSH AX
;como AX menor que 0, salva o nmero na pilha
MOV DL,' - ' ;prepara o caracter ' - ' para sair
MOV AH,2h
;prepara exibio
INT 21h
;exibe '- '
POP AX
;recupera o nmero
NEG AX
;troca o sinal de AX (AX = - AX)
;obtendo dgitos decimais e salvando-os temporariamente na pilha
PT1:
XOR CX,CX
;inicializa CX como contador de dgitos
MOV BX,10
;BX possui o divisor
PT2:
XOR DX,DX
;inicializa o byte alto do dividendo em 0; o restante
AX
DIV BX
;aps a execuo, AX = quociente; DX = resto
PUSH DX
;salva o primeiro dgito decimal na pilha (1o. resto)
INC CX
;contador = contador + 1
OR AX,AX
;quociente = 0 ? (teste de parada)
JNE PT2
;no, continuamos a repetir o lao
;exibindo os dgitos decimais (restos) no monitor, na ordem inversa
MOV AH,2h
;sim, termina o processo, prepara exibio dos restos
PT3:
POP DX
;recupera dgito da pilha colocando-o em DL (DH = 0)
ADD DL,30h
;converte valor binrio do dgito para caracter ASCII
INT 21h
;exibe caracter
LOOP PT3
;realiza o loop ate que CX = 0
POP DX
;restaura o contedo dos registros
POP CX
POP BX
POP AX
;restaura os contedos dos registradores
RET
;retorna rotina que chamou
SAIDEC ENDP
Pgina 10 de 13

Cap9 Instrues de multiplicao e diviso

Exemplo de um programa utilizando ENTDEC e SAIDEC


TITLE PROGRAMA DE E/S DECIMAL
.MODEL SMALL
.STACK 100h
.DATA
MSG1 DB 'Entre um numero decimal na faixa de -32768 a 32767:$'
MSG2 DB 0Dh, 0Ah, 'Confirmando a entrada efetuada, voce digitou:$'
.CODE
PRINCIPAL PROC
MOV AX,@DATA
MOV DS,AX
MOV AH,9h
LEA DX,MSG1
INT 21h
;entrada do nmero
CALL ENTDEC
;chama subrotina ENTDEC
PUSH AX
;salva temporariamente o nmero na pilha
;exibindo a segunda mensagem
MOV AH,9h
LEA DX,MSG2
INT 21h
;exibe a segunda mensagem
;exibindo o nmero lido
POP AX
;recupera o nmero na pilha
CALL SAIDEC
;chama subrotina SAIDEC
;saida para o DOS
MOV AH,4Ch
INT 21h
PRNCIPAL ENDP
INCLUDE: C:\<diretorio_de_trabalho>\ENTDEC.ASM
INCLUDE: C:\<diretorio_de_trabalho>\SAIDEC.ASM
END PRINCIPAL

Pgina 11 de 13

Cap9 Instrues de multiplicao e diviso

9.5 Atividades prticas.


1) D os contedos de DX, AX e CF/OF aps a execuo de cada uma das
seguintes instrues (operandos de 16 bits com resultado em 32 bits):
a)
MUL BX
;se AX = 0008h e BX = 0003h
b)

IMUL CX

;se AX = 0005h e CX = FFFFh

2) D os contedos de AX e CF/OF aps a execuo de cada uma das


seguintes instrues (operandos de 8 bits com resultado em 16 bits):
a)
MUL BL
;se AL = ABh e BL = 10h
b)

IMUL BYTE1

;se AL = 02h e BYTE1 = FBh

3) D os contedos de AX e DX aps a execuo de cada uma das seguintes


instrues (dividendo de 32 bits, divisor de 16 bits, resultando em quociente e
resto ambos de 16 bits):
a)
DIV BX
;se DX = 0000h, AX = 0007h e BX = 0002h
b)

IDIV BX

;se DX = FFFFh, AX = FFFCh e BX = 0003h

4) D os contedos de AL e AH aps a execuo de cada uma das seguintes


instrues (dividendo de 16 bits, divisor de 8 bits, resultando em quociente e
resto ambos de 8 bits):
a)
DIV BL
;se AX = 000Dh e BL = 03h
b)

IDIV BL

;se AX = FFFBh e BL = FEh

5) O que ocorre aps a execuo de:


a)
CWD
;se AX = 8ABCh
b)

CBW

;se AL = 5Fh

Pgina 12 de 13

Cap9 Instrues de multiplicao e diviso

6) Modifique a subrotina ENTDEC para que a mesma verifique se o dgito


decimal que entra pelo teclado est na faixa de 0 a 9, e se o nmero final
produziu ou no overflow.
Dica: No algoritmo apresentado, pode ocorrer overflow em dois momentos:
- quando AX = 10 x total
- quando total = 10 x total + valor binrio
7) Escreva um programa que leia uma quantidade de tempo, expressa em
segundos, menor ou igual a 65535, e apresente esta quantidade em horas,
minutos e segundos (formato HH:MM:SS). Apresente mensagens adequadas
e utilize as subrotinas ENTDEC e SAIDEC para realizar a entrada e sada de
dgitos decimais (ser necessrio adapt-las).
8) Escreva uma subrotina que calcule Xn, ensima potncia de X, onde as
variveis X e n esto respectivamente em AX e BX. O resultado passado de
volta para a rotina que chamou em dois registradores: DX (16 bits mais
significativos) e AX (16 bits menos significativos). Inclua um teste de overflow
caso o resultado no caiba em 32 bits.
9) Escreva um programa completo que pea ao usurio, mediante mensagens
adequadas, para entrar um nmero X, entrar um expoente n e apresentar a
ensima potncia de X. Utilize a subrotina desenvolvida no exerccio 8 para o
clculo de Xn. Utilize as subrotinas ENTDEC e SAIDEC para E/S de nmeros
decimais. Apresente uma mensagem adequada em caso de overflow.

Pgina 13 de 13