Buscar

245481676-Curso-Assembly

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 120 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 120 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 120 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Cap.1 – Introdução aos Microcomputadores Digitais 
Página 1 de 9 
1. Introdução aos Microcomputadores Digitais 
 
1.1 Organização de um computador digital 
 
Um computador digital pode ser descrito de uma forma simplificada segundo 
o diagrama de blocos: 
 
 
CLOCK
MEMÓRIA
PRINCIPAL
DE ENTRADA
E SAÍDA
UNIDADE CENTRAL DE PROCESSAMENTO - CPU
UNIDADE
DISPOSITIVOS
DE E/S
Barramento de dados
Barramento de endereços
Barramento de controle
REGS. DE
PROPÓSITO
GERAL
UNIDADE DE
ARITMÉTICA E LÓGICA
UNID. DE
CONTROLE
REGS.
ESPECIAIS
 
 
Cap.1 – Introdução aos Microcomputadores Digitais 
Página 2 de 9 
 
• Unidade Central de Processamento: - UCP ou CPU 
• Unidade de Controle - UC 
• Unidade de Aritmética e Lógica - UAL ou ULA 
• Registradores de Propósito Geral 
• Registradores Específicos 
• Reg. de Dados da Memória - RDM 
• Reg. de Endereços da Memória - REM 
• Contador de Programa (Program Counter) - PC 
• Registrador de Instruções - RI 
• Apontador de Pilha (Stack Pointer) - SP 
• Outros (conforme a CPU) 
 
• Memória Principal 
 
• Memória Secundária 
 
• Unidade de E/S 
• Interfaces 
• Canais de E/S 
• Processadores de E/S 
 
• Dispositivos de E/S 
 
 
 
Histórico: 
 
• Primeiros computadores eletrônicos surgiram na década de 30 
• IBM PC foi concebido em 1980 
 
Cap.1 – Introdução aos Microcomputadores Digitais 
Página 3 de 9 
1.2 Memória 
 
 
Memória: local do computador (hardware) onde se armazenam temporária ou 
definitivamente dados (números, caracteres e instruções) 
 
 
Posição de memória ou endereço: localidade física da memória onde se 
encontra o dado. 
 
 
Organização da memória: 
 
Endereço Conteúdo 
... ... 
4MB 10110101 
... ... 
1048576 01001010 
... ... 
1765 01001101 
... ... 
4 01010000 
3 11111111 
2 11101001 
1 11011010 
0 01100100 
 
Obs: no 8086, a memória é organizada em bytes (conjunto de 8 bits). 
 
Cap.1 – Introdução aos Microcomputadores Digitais 
Página 4 de 9 
1.3 A CPU e a execução de um programa 
 
MEMÓRIA
UNIDADE CENTRAL DE PROCESSAMENTO - CPU
Barramento de dados
Barramento de endereços
Barramento de controle
UNIDADE DE
ARITMÉTICA E LÓGICA
UNID. DE
CONTROLE
A B
C D
E F
... ...
RI
SP
RDM REM PC
 
 
 
Ciclo de busca e execução de uma instrução 
 
1a. etapa: Busca da instrução na memória (“FETCH”) 
 REM <-- PC 
 RDM <-- (REM) 
 
2a. etapa: Decodificação da instrução 
 RI <-- RDM 
 ocorre a decodificação do conteúdo de RI na UC 
 PC <-- PC + n 
 
3a. etapa: Busca dos operandos da instrução (se houver) 
 REM <-- endereço do operando (Ex: REM <-- REM + 1) 
 RDM <-- (REM) 
 
4a. etapa: Execução da instrução 
 
Cap.1 – Introdução aos Microcomputadores Digitais 
Página 5 de 9 
1.4 Linguagem de máquina e linguagem montadora 
 
 
Exemplo de um mesmo programa em linguagens de máquina e montadora: 
 
 
Instrução de máquina (binário) Operação 
 
10100001 00000000 00000000 Busca o conteúdo da palavra de 
memória 0 e o coloca no reg. AX 
00000101 00000100 00000000 Adiciona 4 ao reg. AX 
 
10100011 00000000 00000000 Armazena o conteúdo de AX na 
palavra de memória de endereço 0 
 
 
 
 
Instrução em linguagem montadora Comentários 
 
MOV AX,A ; busca o conteúdo da posição de 
; memória dada por A e o coloca no 
; reg. AX 
ADD AX,4h ; adiciona 4 a AX, resultado em AX 
; 
MOV A, AX ; armazena o conteúdo de AX na 
; posição de memória definida por A 
 
Observa-se que: 
 
• para cada instrução em linguagem montadora corresponde apenas uma 
instrução em linguagem de máquina; 
• uma instrução em linguagem de máquina pode corresponder a mais de um 
byte; 
• a programação em linguagem de máquina é tediosa e suscetível a erros. 
 
Cap.1 – Introdução aos Microcomputadores Digitais 
Página 6 de 9 
1.5 Atividade prática: Criando e rodando um programa 
 
 
A especificação do programa ECO DO TECLADO NA TELA: 
 
 - iniciar 
 - apresentar um prompt ao usuário 
 - ler um caracter do teclado 
 - exibir o caracter lido na próxima linha da tela do monitor 
 - terminar 
 
 
 
O fluxograma: 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Início 
Apresentar um prompt 
Ler um caracter do teclado 
Mudar de linha 
Exibir caracter lido 
Fim 
Cap.1 – Introdução aos Microcomputadores Digitais 
Página 7 de 9 
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 
 
Cap.1 – Introdução aos Microcomputadores Digitais 
Página 8 de 9 
Explicando as partes: 
 
a) O programa inicia sua operação ao ser lançado pelo DOS. 
 
b) O usuário é estimulado a interagir pela apresentação de um ‘?’: 
 
 MOV AH,2 ;funcao DOS para exibir caracter 
 MOV DL,'?' ;caracter '?' 
 INT 21h ;exibir 
 
c) Lendo o caracter teclado pelo usuário e salvando-o em num registrador: 
 
 MOV AH,1 ;funcao DOS para leitura de caracter 
 INT 21h ;caracter e' lido em AL 
 MOV BL,AL ;salvando-o em BL 
 
d) Movendo o cursor da tela para o início da próxima 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 
 
e) Recuperando o caracter lido e exibindo-o: 
 
 MOV DL,BL ;recuperando o caracter salvo 
 INT 21h ;exibir 
 
f) O programa termina devolvendo controle ao DOS: 
 
 MOV AH,4Ch ;funcao DOS para saida 
 INT 21h ;saindo 
Cap.1 – Introdução aos Microcomputadores Digitais 
Página 9 de 9 
Como obter o programa ECO.EXE executável. 
 
1. Edite o program ECO utilizando um editor de texto simples, com saída em 
texto ASCII. Sugestão: use o EDIT do DOS ou o Bloco de Notas 
(NOTEPAD) do Windows. Sugere-se que o arquivo (texto ASCII) tenha a 
extensão .ASM 
 
 
 C:\ > EDIT ECO.ASM <enter> 
 
 
2. Rode o programa Montador TASM (Borland). Como resultado, aparece em 
seu diretório de trabalho um arquivo ECO.OBJ 
 
 
 C:\ > TASM ECO. ASM <enter> 
 
 
3. Rode o programa Lincador TLINK. Como resultado, aparece em seu 
diretório 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 <- letra K digitada pelo usuário 
 K <- eco da letra K aparece na tela 
 C:\ > <- 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. 
Cap2 – Representação de Números e Caracteres. 
Página 1 de 9 
2. Representação de Numeros e Caracteres. 
 
2.1 Conceitos básicos 
 
Bit = BInary digiT = vale sempre 0 ou 1 
 elemento básico de informação 
 
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)Posição de bits: 
 
 
Para 1 byte: 7 6 5 4 3 2 1 0 
0 1 0 1 0 1 0 1 
 
 
Para 1 word: 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 são armazenados em bytes consecutivos em memórias de 8 bits. 
Byte baixo = byte inferior ou byte de menor ordem -> endereço N 
Byte alto = byte superior ou byte de maior ordem -> endereço N+1 
 
Cap2 – Representação de Números e Caracteres. 
Página 2 de 9 
2.2 Representação de números 
 
Números em base binária (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 fácil de representar!) 
 
 high byte = 0101 0111b = 57h 
 low byte = 0110 1110b = 6Eh 
 
 
Números 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 
 
Cap2 – Representação de Números e Caracteres. 
Página 3 de 9 
Números 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 
 
 
Conversão entre bases numéricas: 
 
Tipo de conversão Procedimento 
 
Decimal => Binário Divisões sucessivas por 2 até se obter zero no 
quociente; leitura dos dígitos binários de baixo 
para cima. 
Binário = > Decimal Soma de potências de 2 cujo expoente é a 
posição do bit e cujo coeficiente é o próprio bit. 
Hexadecimal => Binário Expandir cada dígito hexa em quatro dígitos 
binários segundo seu valor. 
Binário => Hexadecimal Compactar cada quatro dígitos binários em um 
único dígito hexa segundo seu valor. 
Decimal => Hexadecimal Divisões sucessivas por 16 até se obter zero no 
quociente; leitura dos dígitos de baixo para cima. 
Hexadecimal => Decimal Soma de potências de 16 cujo expoente é a 
posição do dígito e cujo coeficiente é o valor do 
próprio dígito hexa. 
 
Cap2 – Representação de Números e Caracteres. 
Página 4 de 9 
2.3 Representação sinalizada e não sinalizada de números inteiros: 
 
 
Exemplo 1: 01110001b 
 
valor não 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 não 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 <= número em complemento de 2 (C2) 
 
 01001110 <= número com todos os bits invertidos 
 + 1_ 
 01001111 <= valor do número (magnitude) 
 
 magnitude (7 bits) = 1.26 + 0.25 + 0.24 + 1.23 + 1.22 + 1.21 + 1.20 
 
 = 64 + 8 + 4 + 2 + 1 = 79d logo: - 79d 
Cap2 – Representação de Números e Caracteres. 
Página 5 de 9 
Exemplo 3: 70FFh = 0111000011111111b 
 
valor não sinalizado = 0.215 + 1.214 + ... + 1.22 + 1.21 + 1.20 
 
 
valor sinalizado bit de sinal = 0 => " + " (positivo) 
 
 = valor igual ao não sinalizado 
 
 
 
Exemplo 4: C777h = 1100011101110111b 
 
valor não sinalizado = 1.215 + 1.214 + ... + 1.22 + 1.21 + 1.20 
 
 bit de sinal = 1 => " - " (negativo) 
 
valor sinalizado = a ser calculado considerando o número em C2 
 
 
 
Alguns números em hexadecimal, em representação sinalizada: 
 
0FFFh positivo, 2 bytes 
EF0h positivo, 3 dígitos hexa, 2 bytes, byte alto 0Eh, byte baixo F0h 
1h positivo, 1 byte, 01h 
80h positivo, se 2 bytes => 0000000010000000b 
 negativo, se 1 byte => 10000000b 
8000h negativo, byte alto 80h, byte baixo 00h 
C321h negativo 
FFFFh negativo 
 
Cap2 – Representação de Números e Caracteres. 
Página 6 de 9 
2.4 Representação de caracteres ASCII: 
 
 
• Letras e pontuação não são representáveis diretamente em computadores 
e circuitos lógicos. 
 
• Utiliza-se alguns códigos binários de de 6, 7 ou 8 bits, que atribuem a cada 
combinação binária um caracter alfa-numérico. 
 
• código 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 
 
 
 
 
Cap2 – Representação de Números e Caracteres. 
Página 7 de 9 
2.5 Exemplo de um programa processando números 
 
A especificação do programa SOMA: 
 
 - iniciar 
 - ler a variável A da memória 
 - ler a variável B da memória 
 - somar A + B 
 - converter o resultado para caracter ASCII 
 - exibir o caracter no monitor 
 - terminar 
 
O fluxograma: 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Início 
Ler a variável A 
Ler a variável B 
Somar A + B 
Exibir caracter no monitor 
Fim 
Converter o resultado para 
caracter ASCII 
Cap2 – Representação de Números e Caracteres. 
Página 8 de 9 
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 (não 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 
 
Cap2 – Representação de Números e Caracteres. 
Página 9 de 9 
2.6 Atividades práticas: 
 
Rode o programa utilizando o TASM e o TLINK. 
 
Verifique o que ocorrerá se os valores definidos inicialmente nas variáveis A 
e B forem alterados para: 
 
a) –2 e 5 
b) 2 e – 5 
 
Troque a instrução ADD AX,B por SUB AX,B e use as variáveis: 
 
c) –2 e 5 
d) 2 e – 5 
 
Procure explicar os resultados obtidos com o auxílio da teoria de números 
sinalizados e com a tabela de caracteres ASCII. 
 
Tente agora especificar os valores iniciais de A e B em: 
 
a) Binário 
b) Hexadecimal 
 
Faça finalmente –2 e 5 expressos em binário e em hexadecimal. Use 
complemento de 2 para representar o número negativo. 
 
Se você desejar “formatar” a resposta que o programa exibe no monitor, 
procure incluir mudanças de linha e alguns “tabs” para mover o cursor na tela. 
 
 
Cap3 – Organização do Microprocessador 8086 
Página 1 de 11 
3. Organização do microprocessador 8086 
 
3.1 A família Intel 86 (ou 80X86) 
 
 
Processador Co-proc. Ano de 
introdução 
No. 
de bits 
No. de 
transistores 
Velocidade 
(MHz) 
4004 - 1971 4 2.205 - 
8008 - 1972 8 3.300 - 
8080 - 1974 8 4.500 - 
8085 - 1978 8 6.200 - 
8086 8087 1978 16 29.000 4,77 a 10 
8088 8087 1979 8 (16) 29.000 4,77 a 10 
186 8087 1982 16 100.000 8 a 16 
188 8087 1982 8 (16) 100.000 8 a 16 
286 2871982 16 134.000 8 a 12,5 
386 (368 DX) 387 1985 32 375.000 16 a 40 
386 SX 387 SX 1988 16 (32) 375.000 16, 20 
486 (486 DX) - 1989 32 1.200.000 25, 33, 50 
486 SX 487 SX 1991 32 1.200.000 20, 25 
486 DX2 - 1992 32 ? 66 
486 DX4 - 1993 32 ? 99 
Pentium - 1993 32/64 3.100.000 60, 66, 90 
Pentium 
Celeron 
- 
Pentium Pro - 
Pentium 2 - Pesquise e ... 
Pentium 3 - Complete ! 1 GHz ? 
Pentium 4 
 
• O primeiro IBM PC foi construído com o 8088 (versão de 8 bits do 8086). 
 
• Todo software produzido para a família 80x86 mantem compatibilidade 
com os futuros microprocessadores. 
 
Cap3 – Organização do Microprocessador 8086 
Página 2 de 11 
3.2 Arquitetura do microprocessador 8086 
 
 
 
 
 
 
 
 
 
(referir ao livro-texto, figura 1.6, página 8) 
 
 
 
 
 
 
 
 
 
 
 
 
 
Configuração interna do 8086 
 
 
• barramento de endereços é comum com o de dados: 20 bits 
• endereços: 20 bits, 220 = 1.048.576 combinações = 1 MByte (1 MB) 
• dados: utiliza somente 16 bits do barramento comum 
• barramento de controle: 16 bits independentes do barramento comum 
 
Cap3 – Organização do Microprocessador 8086 
Página 3 de 11 
O 8086 divide-se internamente em duas unidades. 
 
 
Execution Unit (EU) - unidade de execução: 
 
• UAL - realiza operações aritméticas de +, -, X, / e operações lógicas AND, 
OR, NOT, XOR; 
 
• contem registradores para armazenamento temporário durante as 
operações, que são endereçados por nome. 
 
 
 
BUS Interface Unit (BIU) - unidade de interface de barramento: 
 
• faz a comunicação de dados entre a EU e o meio externo (memória, E/S); 
 
• controla a transmissão de sinais de endereços, dados e controle; 
 
• controla a sequência de busca e execução de instruções; 
 
• mecanismo de pre-fetch: busca até 6 instruções futuras deixando-as na 
fila de instruções (instruction queue) -> aumento de velocidade. 
 
 
 
Registradores: elementos de memória muito rápida dentro da CPU. 
 
• de dados, ou de propósito geral 
• de endereços (segmentos, apontadores e índices) 
• sinalizadores de estado e controle (FLAGS) 
 
Cap3 – Organização do Microprocessador 8086 
Página 4 de 11 
3.2.1 Registradores de dados: 
 
AX, BX, CX e DX 
 
• são todos registradores de 16 bits 
• utilizados nas operações aritméticas e lógicas 
• podem ser usados como registradores de 16 ou 8 bits 
 
 AH e AL 8 registradores de 8 bits cada 
 BH e BL 
 CH e CL "H" -> byte alto ou superior 
 DH e DL "L" -> byte baixo ou inferior 
 
 
AX (acumulador) -> utilizado como acumulador em operações aritméticas e 
 lógicas; em instruções de E/S, ajuste decimal, conversão, etc 
 
 
BX (base) -> usado como registrador de BASE para referenciar posições 
 de memória; 
 BX armazena o endereço BASE de uma tabela ou vetor de 
 dados, a partir do qual outras posições são obtidas 
 adicionando-se um valor de deslocamento (offset). 
 
 
CX (contador) -> utilizado em operações 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 operações de multiplicação para armazenar 
 parte de um produto de 32 bits, ou em operações de divisão, 
 para armazenar o resto; 
 utilizado em operações de E/S para especificar o endereço de 
 uma porta de E/S. 
Cap3 – Organização do Microprocessador 8086 
Página 5 de 11 
3.2.2 Registradores de segmento: 
 
CS, DS, SS e ES 
 
• são todos registradores de 16 bits 
• o endereçamento no 8086 é diferenciado para: 
 - código de programa (instruções) 
 - dados 
 - pilhas 
 
• segmento: é um bloco de memória de 64 KBytes, endereçável. 
 
• durante a execução de um programa no 8086, há 4 segmentos ativos: 
 
 segmento de código: endereçado por CS 
 segmento de dados: " DS 
 segmento de pilha: " SS (stack segment) 
 segmento extra: " ES 
 
 
 
 
3.2.3 Registrador apontador de instrução: 
 
 
IP (instruction pointer) 
 
• utilizado em conjunto com CS para localizar a posição, dentro do 
segmento de código corrente, da próxima instrução a ser 
executada; 
 
• IP é automaticamente incrementado em função do número de 
bytes da instrução executada. 
 
Cap3 – Organização do Microprocessador 8086 
Página 6 de 11 
3.2.4 Registradores apontador de pilha e de índice: 
 
Armazenam valores de deslocamento de endereços (offset), a 
fim de acessar regiões da memória muito utilizadas: 
• pilha, 
• blocos de dados, 
• arrays e strings. 
 
Podem ser utilizados em operações aritméticas e lógicas, 
possibilitando que os valores de deslocamento sejam resultados 
de computações anteriores. 
 
 
• SP (stack pointer - apontador de pilha) é utilizado em conjunto com SS, 
para acessar a área de pilha na memória; 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 endereçamento indireto, em conjunto com DS. 
 
 
• DI (destination index - índice destino) similar ao SI, atuando em conjunto 
com ES. 
 
 
Obs: SI e DI facilitam a movimentação de dados sequenciados entre 
posições fonte (indicado por SI) e posições destino (indicado por DI). 
Cap3 – Organização do Microprocessador 8086 
Página 7 de 11 
3.2.5 Registrador de sinalizadores (FLAGS): 
 
 
• indica o estado do microprocessador durante a execução de cada 
instrução; 
 
• conjunto de bits individuais, cada qual indicando alguma propriedade; 
 
• subdividem-se em: FLAGS da estado (status) e FLAGS de controle. 
 
• organização: 
1 registrador de 16 bits 
6 FLAGS de estado 
3 FLAGS de controle 
7 bits não utilizados (sem função) 
 
 
 
 
 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 
 OF DF IF TF SF ZF AF PF CF 
 
 
 
Para maiores detalhes, veja o Cap. 5. 
Cap3 – Organização do Microprocessador 8086 
Página 8 de 11 
3.2.6 Os registradores do 8086 (visão geral): 
 
 
Registradores de dados 
 
AH AL AX 
BH BL BX 
CH CL CX 
DH DL 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 são de 16 bits 
• AH -> byte alto de AX; AL byte baixo de AX; ambos de 8 bits 
Cap3 – Organização do Microprocessador 8086 
Página 9 de 11 
Apêndice 
 
Gerenciamento de memória por segmentação 
 
 
• O 8086 possui 20 bits para acessar posições de memória física 
• 220 = 1.048.576 bytes (1 Mbyte) posições endereçáveis 
• Exemplos de endereços: 
 
0000 0000 0000 0000 0000b -> 00000h 
0000 0000 0000 0000 0001b -> 00001h 
0000 0000 0000 0000 0010b -> 00002h -> 5 dígitos hexa 
0000 0000 0000 0000 0011b -> 00003h 
.... 
1111 1111 1111 1111 1111b -> FFFFFh 
 
 
• O 8086 opera internamente com 16 bits 
• Problema: Como gerar endereços com 20 bits? 
• Solução: Utilizar a idéia de segmentação de memória! 
 
 
 
Segmento de memória: 
 
• bloco de 64 Kbytes de posições de memória consecutivas 
 
• 216 = 65.536 bytes (64 Kbytes) 
 
• Segmento de memória é identificado por um número de segmento 
 
• Uma posição de memória é especificada pelo número de segmento e 
por um deslocamento (offset) em relação ao início do segmento 
 
 
Cap3 – Organização do Microprocessador 8086 
Página 10 de 11 
Formato de endereço lógico -> segmento:offset 
 
 
Exemplo de endereçamento 
 
 
Dado o endereço lógico: 8350:0420h 
 
reconhece-se: segmento no. 8350h 
 deslocamento 0420h 
 
 
o endereço físico vale: 
 
 83500h -> desloca-se 1 casa hexa (4 casas binárias) 
 + 0420h -> soma-se o deslocamento 
 83920h -> endereço físico resultante (20 bits) 
 
 
Graficamente: 
 
 8 3 5 0 | 0 8 3 5 0 CS (base) <- endereço lógico 
19 4 3 0 15 0+ 0 4 2 0 0 4 2 0 IP (offset) 
 15 0 15 0 
 
 8 3 9 2 0 <- endereço físico 
19 0 
 
 para a memória 
 
 
 
Cap3 – Organização do Microprocessador 8086 
Página 11 de 11 
 
Tipos de referência à memória Identificador 
de segmento 
Identificador 
alternativo 
Offset 
Busca de instrução CS - IP 
Operação com pilha SS - SP, BP 
Variável (dado) DS CS, SS, ES * 
Fonte para instrução com string DS CS, SS, ES SI 
Destino para instrução com string ES - DI 
 
 
• O identificador de segmento (base) aponta para uma região da memória; 
 
• O offset aponta para um local dentro deste segmento; 
 
• O offset é aquele que aparece nos programas como o endereço dos 
dados, rótulos e endereços de instruções; 
 
• O identificador de segmento aparece somente quando um novo segmento 
precisa ser especificado; 
 
• Segmentação é um esquema muito útil para gerar códigos relocáveis; 
 
• A maioria das variáveis está localizada no segmento de dados; podem 
também estar localizadas em outros segmentos; 
 
 
• Endereços lógicos diferentes podem representar o mesmo endereço físico; 
 
ex: base 028Ch 
 offset 0003h endereço físico -> 028C3h 
 
 base 0287h 
 offset 0053h endereço físico -> 028C3h. 
Cap4 – Introdução à Linguagem Montadora do 8086
Página 1 de 30
4. Introdução à linguagem montadora do 8086
4.1 A sintaxe assembly do 8086
A linguagem montadora não é sensível à letra maiúscula ou minúscula
Para facilitar a compreensão do texto do programa, sugere-se:
• uso de letra maiúscula para código
• uso de letra minúscula para comentários
Declarações (statements):
• instruções, que são convertidas em código de máquina
• diretivas, que instruem o montador a realizar alguma tarefa específica:
- alocar espaço de memória para variáveis
- criar uma sub-rotina (procedure ou procedimento)
Formato de uma declaração (linha de programa):
[Nome] [Cod. oper.] [Operando(s)] [;Comentário]
Exemplo:
INICIO: MOV CX,5h ;inicializar contador
A separação entre os campos deve ser do tipo <espaço> ou <tab>.
Cap4 – Introdução à Linguagem Montadora do 8086
Página 2 de 30
•• O campo Nome:
Pode ser um rótulo de instrução, um nome de sub-rotina, um nome de
variável, contendo de 1 a 31 caracteres, iniciando por uma letra e contendo
somente letras, números e os caracteres ? . @ _ : $ % .
Obs: o Montador traduz os nomes por endereços de memória.
Exemplos: nomes válidos nomes inválidos
LOOP1: DOIS BITS
.TEST 2abc
@caracter A42.25
SOMA_TOTAL4 #33
$100
•• Campo de código de operação:
Contem o código de operação simbólico (mnemônico)
No caso de diretivas, contem o código de pseudo-instrução
Exemplos: instruções diretivas
MOV .MODEL
ADD .STACK
INC nome PROC
JMP
Cap4 – Introdução à Linguagem Montadora do 8086
Página 3 de 30
• • Campo de operandos:
Instruções podem conter 0, 1 ou 2 operandos no 8086.
Exemplos:
NOP ;sem operandos: instrui para fazer nada
INC AX ;um operando: soma 1 ao conteúdo de AX
ADD A,2d ;dois operandos: soma 2 ao conteúdo da palavra
;de memória A
No caso de instruções de dois operandos:
• o primeiro, operando destino: registrador ou posição de memória
onde o resultado é armazenado; o conteúdo inicial é modificado;
• o segundo, operando fonte: não modificado pela instrução;
• os operandos são separados por uma vírgula.
No caso de diretivas, o campo de operandos contem mais informações
acerca da diretiva.
Cap4 – Introdução à Linguagem Montadora do 8086
Página 4 de 30
•• Campo de comentário:
- um ponto-e-vírgula ( ; ) marca o início deste campo;
- o Montador ignora tudo após o este marcador;
- comentários são opcionais.
Uma boa prática de programação é comentar tudo e incluir a
informação acerca da idéia por trás da codificação (o algorítmo).
Exemplos:
MOV CX,0 ;movimenta 0 para CX (óbvio!)
MOV CX,0 ;CX conta no. de caracteres, inicialmente vale 0
;
; (linhas em branco: separação)
;
;inicialização dos registradores (linha inteira de comentário)
Cap4 – Introdução à Linguagem Montadora do 8086
Página 5 de 30
4.2 Formato de dados, variáveis e constantes
•• Números:
Exemplos:
- binário: 1110101b ou 1110101B
- decimal: 64223 ou 64223d ou 64223D
1110101 é considerado decimal (ausência do B)
-2184D (número decimal negativo)
- hexa: 64223h ou 64223H
0FFFFh começa com um decimal e termina com h
1B4Dh
Exemplos de números ilegais:
1,234 caracter estranho (vírgula)
FFFFh não começa por número de 0 a 9
difícil distinguir do nome de uma variável
1B4D não 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”
Cap4 – Introdução à Linguagem Montadora do 8086
Página 6 de 30
•• Variáveis:
Variável é um nome simbólico para um dado atualizável pelo programa.
• cada variável possui um tipo e recebe um endereço de memória;
• usa-se pseudo-instruções para definir o tipo da variável;
• o Montador atribui o endereço de memória.
Pseudo-
instrução
Entende-se por
DB define byte (8 bits)
DW define word (16 bits, 2 bytes consecutivos)
DD define doubleword (2 palavras, 4 bytes consecutivos)
DQ define quadword (4 palavras, 8 bytes consecutivos)
DT define ten bytes (10 bytes consecutivos)
- Definição de variáveis de tipo byte:
Nome DB valor_ inicial
Exemplos:
Alfa DB 0 ;equivale a 00h
A DB 10h
B DB 0150h ;ilegal, por que?
BIT DB ? ;não inicializada
Cap4 – Introdução à Linguagem Montadora do 8086
Página 7 de 30
- Definição de variáveis de tipo word:
Nome DW valor_inicial
Exemplos:
WORD1 DW 0h ;equivale a 0000h
CONTA DW 0150h ;OK!, por que?
C DW ? ;não inicializada
WORD1 DW 1234h ;byte baixo 34h, endereço WORD1
;byte alto 12h endereço WORD1+1
- Array: sequência de bytes ou words consecutivos na memória
• armazenar dados relacionados
• armazenar caracteres ASCII organizados (ex: texto)
Exemplos:
BYTE_ARRAY DB 10h,20h,30h
WORD_ARRAYDW 1000h,123h,0h,0FFFFh
Um array pode conter um string de caracteres, sendo definido como:
LETRAS DB ‘abC’ ;e´ equivalente aos caracteres ASCII
LETRAS DB 61h,62h,43h ;depende se maiúscula ou minúscula
Cap4 – Introdução à Linguagem Montadora do 8086
Página 8 de 30
- Combinação de caracteres e números numa mesma definição:
MENSAGEM DB ‘Alo!’, 0Ah,0Dh,’$’
O caracter '$' marca o fim de um string de caracteres e não é exibido.
•• Constantes:
Constante é um nome simbólico para um dado de valor constante, que seja
muito utilizado num programa.
Para atribuir um nome a uma constante, utiliza-se a pseudo-instrução EQU
(equates -> igual a) e a sintaxe:
Nome EQU valor_da_constante
Exemplos:
LF EQU 0Ah ;caracter Line Feed como LF
CR EQU 0Dh ;caracter Carriage return como CR
LINHA1 EQU ‘Digite seu nome completo’
MENSAGEM DB LINHA1,LF,CR
Observação:
• Constantes não geram código de máquina.
Cap4 – Introdução à Linguagem Montadora do 8086
Página 9 de 30
4.3 Algumas instruções iniciais
MOV destino,fonte
Usada para transferir dados entre:
• registrador e registrador
• registrador e uma posição de memória
• mover um número diretamente para um registrador ou posição de memória
Combinações legais de operandos:
Operando destino
Operando fonte Registrador de
dados
Registrador de
segmento
Posição de
memória
Reg. de dados sim sim sim
Reg. de segmento sim não sim
Posição de memória sim sim não
Constante sim não sim
Exemplos de instruções válidas:
MOV AX,WORD1 ;movimenta o conteúdo da posição de memória 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 conteúdo do byte baixo de BX para
;o byte alto de AX
MOV AX,CS ;transfere uma cópia do conteúdo de CS para AX
Cap4 – Introdução à Linguagem Montadora do 8086
Página 10 de 30
Graficamente: suponha a instrução MOV AX,WORD1
Antes Depois
AX AX
0006h 8FFFh
WORD1 WORD1
8FFFh8FFFh
Obs: para a instrução MOV não é permitido operar de posição de memória
para posição de memória diretamente, por motivos técnicos do 8086.
Por exemplo:
MOV WORD1,WORD2 ;instrução inválida
;esta restrição é contornada como segue
;
;
;
MOV AX,WORD2 ;primeiro o conteúdo de WORD2 vai para AX
MOV WORD1,AX ;depois, o conteúdo de AX é movido para a
;posição de memória WORD1
Cap4 – Introdução à Linguagem Montadora do 8086
Página 11 de 30
XCHG destino,fonte
Usada para trocar dados (nos dois sentidos) entre:
• registrador e registrador
• registrador e uma posição de memória
• não é permitido trocas diretas entre posições de memória
Combinações legais de operandos:
Operando destino
Operando fonte Registrador
de dados
Posição de
memória
Reg. de dados sim sim
Reg. de segmento não não
Posição de memória sim não
Exemplos de instruções válidas:
XCHG AX,WORD1 ;troca o conteúdo da posição de memória WORD1
;com o do registrador AX
XCHG AH,BL ;troca o conteúdo do byte baixo de BX com o
;do byte alto de AX
Graficamente: suponha a instrução XCHG AH,BL
Antes Depois
AH AL AH AL
14h FFh E0h FFh
BH BL BH BL
C2h E0h C2h 14h
Cap4 – Introdução à Linguagem Montadora do 8086
Página 12 de 30
ADD destino,fonte
SUB destino,fonte
Usadas para adicionar (ou subtrair) dados entre:
• registrador e registrador
• registrador e uma posição de memória
• adicionar (ou subtrair) um número diretamente a (de) um registrador ou
posição de memória
Combinações legais de operandos:
Operando destino
Operando fonte Registrador
de dados
Posição de
memória
Reg. de dados sim sim
Posição de memória sim não
Constante sim sim
Exemplos de instruções válidas:
ADD AX,BX ;soma o conteúdo de BX com AX, resultado em AX
ADD BX,AX ;soma o conteúdo de AX com BX, resultado em BX
ADD AX,WORD1 ;soma o conteúdo da posição de memória WORD1
;ao do registrador AX, resultado em AX
SUB WORD2,AX ;subtrai o conteúdo do registrador AX do conteúdo da 
;posição de memória WORD2, resultado em WORD2
SUB BL,5 ;subtrai a quantidade 5 decimal do conteúdo de BL
Cap4 – Introdução à Linguagem Montadora do 8086
Página 13 de 30
Graficamente: suponha a instrução ADD AX,DX
Antes Depois
AX AX
0006h 0009h
DX DX
0003h 0003h
Obs 1:
ADD BYTE1,BYTE2 ;instrução inválida
;esta restrição é contornada como segue
;
;
;
MOV AL,BYTE2 ;primeiro o conteúdo de BYTE2 vai para AL
ADD BYTE1,AL ;depois, o conteúdo de AL é somado ao da
;posição de memória BYTE1, resultado final
;em BYTE1
Obs 2: o resultado de SUB, se for negativo, estará armazenado no registrador
destino em complemento de 2.
Cap4 – Introdução à Linguagem Montadora do 8086
Página 14 de 30
INC destino
DEC destino
Usadas para adicionar 1 (incrementar) ou subtrair 1 (decrementar) ao/do
conteúdo de:
• um registrador
• uma posição de memória
Exemplos:
INC CX ;incrementa o conteúdo de CX
INC WORD1 ;incrementa o conteúdo da posição de memória WORD1
DEC BYTE2 ;decrementa o conteúdo da posição de memória BYTE2
DEC CL ;decrementa o conteúdo de CL (byte baixo de CX)
Graficamente: suponha a instrução INC BYTE1
Antes Depois
BYTE1 BYTE1
06h 07h
Cap4 – Introdução à Linguagem Montadora do 8086
Página 15 de 30
NEG destino
Usada para substituir o conteúdo destino pelo seu complemento de 2,
operando sobre:
• um registrador
• uma posição de memória
Exemplos:
NEG BX ;gera o complemento de 2 do conteúdo de BX
NEG WORD1 ;idem, no conteúdo da posição de memória WORD1
Graficamente: suponha a instrução NEG BX
Antes Depois
BX BX
0002h FFFEh
Cap4 – Introdução à Linguagem Montadora do 8086
Página 16 de 30
4.4 estrutura de um programa em Linguagem Montadora
•• Modelos de memória
O tamanho que os segmentos de código e de dados devem ter é especificado
pelo modelo de memória por meio da diretiva .MODEL.
Sintaxe: .MODEL modelo_de_memória
Modelo Descrição
SMALL Código em 1 segmento;
Dados em 1 segmento
MEDIUM Código em mais de 1 segmento;
Dados em 1 segmento
COMPACT Código em 1 segmento;
Dados em mais de 1 segmento
LARGE Código em mais de 1 segmento;
Dados em mais de 1 segmento;
Nenhum array maior que 64 Kbytes
HUGE Código 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 código) ou muitos
dados, o modelo apropriado é o SMALL.
• A diretiva .MODEL deve vir antes de qualquer definição de segmento.
Cap4 – Introdução à Linguagem Montadora do 8086
Página 17 de 30
•• Segmento de dados
- Contem a definição e declaração das variáveis.
- Pode-se também fazer a atribuição de símbolos para constantes.
Sintaxe: .DATA
Exemplo:
.DATA
WORD1 DW A8h
BYTE1 DB 5
MENSAGEM DB ‘Isto e uma mensagem’
LF EQU 0Ah
•• Segmento de pilha (stack segment)
- Reserva um bloco de posições de memória consecutivas para
 armazenar a pilha
- Deve ter espaço suficiente para suportar a pilha no seu máximo
 tamanho
Sintaxe: .STACK tamanho
Exemplo:
.STACK 100h ;reserva 100h bytes para a área de pilha, um
;tamanho razoável para a maioria das aplicações
Cap4 – Introdução à Linguagem Montadora do 8086
Página 18 de 30
•• Segmento de código
- Contem propriamente as instruções do programa
- Dentro do segmento de código, as instruções são organizadas em
 procedures ou procedimentos.
Sintaxe: .CODE
Exemplo:
.CODE
nome PROC
;
;corpo da procedure -> instruções
;
nome ENDP
;
;outras procedures seguem abaixo, se existirem
onde:
•• nome -> identificação da procedure
•• PROC e ENDP -> pseudo-instruções usadas para delimitar a procedure
• para um programa simples, não há necessidade de se definir a procedure.
Cap4 – Introdução à Linguagem Montadora do 8086
Página 19 de 30
• Exemplo de uma estrutura de programa assembly completo:
TITLE nome_do_programa
.MODEL SMALL
.STACK100h
.DATA
;
;definição dos dados: variáveis e constantes
;
.CODE
EXEMPLO PROC
;
;seqüência de instruções
;
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 não houver definição de procedure, usa-se apenas END.
Cap4 – Introdução à Linguagem Montadora do 8086
Página 20 de 30
4.5 Instruções de entrada e saída
IN e OUT -> instruções Assembly para acessar portas de E/S para periféricos
Não são utilizadas na maioria das aplicações:
(1) os endereços das portas de E/S variam conforme o modelo do PC
(2) é mais fácil utilizar o BIOS ou o DOS para funções de E/S
Para acessar as rotinas de E/S do BIOS ou DOS utiliza-se a instrução:
INT número_de_interrupção
Obs: o programa em curso é interrompido, passando o controle para o DOS,
que realiza a operação de E/S e retorna o controle para o programa.
Exemplo:
INT 21h ;acessa um grande número de funções de E/S do DOS
Algumas funções DOS de E/S:
Função 1h: Entrada de um caracter simples pelo teclado
Acesso: AH = 1h
Resultado: AL = código ASCII do caracter digitado no teclado
Função 2h: Exibição de caracter simples no monitor de vídeo
Acesso: AH = 2h
DL = código ASCII do caracter a exibir
Resultado: exibição na tela do monitor
Cap4 – Introdução à Linguagem Montadora do 8086
Página 21 de 30
Exemplos:
a) Trecho padrão de programa para providenciar a entrada de um caracter
ASCII pelo teclado:
MOV AH,1h ;prepara para entrar caracter pelo teclado
;o processador espera até que o usuário
;digite o caracter desejado
INT 21h ;após a digitação, caracter ASCII em AL
;se um caracter não-ASCII for digitado, AL = 0h
Obs: o caracter teclado também aparece no monitor, por causa do DOS.
b) Trecho padrão de programa para providenciar a saída de um caracter
ASCII para o monitor de vídeo:
MOV AH,2h ;prepara para exibir caracter no monitor
MOV DL,’?’ ;o caracter é ‘?’
INT 21h ;exibe (monitor apresenta ‘?’)
;após a exibição, o cursor da tela avança para a
;próxima posição da linha (se já for atingido o fim
;da linha, vai para o início da próxima linha)
Obs: também se pode exibir caracteres ASCII de controle:Código
ASCII
Símbolo Função
07h BEL Bell (som de bip)
08h BS Back Space (espaço para trás)
09h HT Tab (tabulação)
0Ah LF Line Feed (mover para uma nova linha)
0Dh CR Carriage Return (ir para o inicio da linha)
Cap4 – Introdução à Linguagem Montadora do 8086
Página 22 de 30
Mais funções DOS de E/S:
Função 4Ch: Termina o processo corrente e transfere controle para o DOS
Acesso: AH = 4Ch
Resultado: saída para o DOS
Função 9h: Exibição de string de caracteres no monitor de vídeo
Acesso: AH = 9h
DX = offset do endereço onde começa o string
Resultado: string exibido
Obs: o string de caracteres deve terminar com o caracter ‘$’, que marca o fim
da sequência e não é exibido.
Para exibição de um string de caracteres há dois problemas:
a) DS inicialmente não está apontando para o segmento de dados do
programa recém iniciado (DS ainda aponta para algum segmento de dados do
DOS);
b) deve-se colocar em DX o offset do endereço do string que queremos exibir
Cap4 – Introdução à Linguagem Montadora do 8086
Página 23 de 30
Como apontar DS para o segmento de dados do programa?
@DATA -> palavra reservada para obter o número do segmento de dados
definido pela diretiva .DATA, que contem as variáveis e constantes.
Exemplo: para inicializar corretamente DS para o programa corrente
.DATA
...
.CODE
MOV AX,@DATA ;coloca o número do segmento de dados em AX
MOV DS,AX ;pois DS não pode receber @DATA diretamente
Obs: o programa Montador traduz o nome @DATA pelo número de segmento
onde se encontram os dados definidos pela diretiva .DATA.
Como colocar em DX o offset do endereço de um string a exibir?
LEA destino,fonte
Significa Load Effective Address -> coloca uma cópia do offset do endereço
da posição de memória fonte no registrador destino.
Exemplo:
.DATA
MENSAGEM DB ‘Adoro OBCLM!$’
...
.CODE
LEA DX,MENSAGEM ;DX carregado com o offset de MENSAGEM
Obs: após esta operação, DX conterá o offset da posição de memória onde
inicia o string MENSAGEM
Cap4 – Introdução à Linguagem Montadora do 8086
Página 24 de 30
4.6 Introdução aos montadores (assemblers)
•• Função:
Gerar a linguagem de máquina de um programa escrito em uma linguagem
simbólica (linguagem de montagem, onde os símbolos são os mnemônicos).
•• Características desejáveis:
- Permitir representações simbólicas de rótulos, códigos de instrução e
operandos.
- Aceitar comentários, para facilitar a documentação.
- Aceitar representação de números em várias bases numéricas.
- Aceitar pseudo-instruções, que definem localizações (rótulos),
reservam memória, equacionam símbolos, etc., mas não geram código
de máquina.
•• Processo de montagem:
- Conversão de códigos mnemônicos em seus equivalentes códigos
binários.
- Conversão de números decimais, hexadecimais e octais em seus
equivalentes binários.
- Atribuição de endereços para as instruções do programa principal e
das subrotinas.
- Atribuição de endereços na memória para as palavras de dados.
Cap4 – Introdução à Linguagem Montadora do 8086
Página 25 de 30
•• Diretivas (ou Diretrizes) ou pseudo-instruções:
Códigos especiais para o montador, que não geram código de máquina,
sendo geralmente instruções para:
- Definição de formato de dados
- Definição de espaços de memória (dados, pilha)
- Criação de subrotinas
- Determinação do tipo do processador e co-processador
•• Macro instruções:
São instruções simbólicas definidas pelo usuário, que englobam várias
instruções em linguagem de montagem. Quando invocadas, são
traduzidas pelo montador (expandidas) em mais de um código de
máquina.
Cap4 – Introdução à Linguagem Montadora do 8086
Página 26 de 30
O processo de montagem
Arquivo texto
*.ASM
Editor
Montador
(Assembler)
Arquivo
intermediáro
*.OBJ
Lincador
(Linker)
Arquivo
executável
*.EXE
Programa
fonte em
mnemônicos
Verificação da
sintaxe da
instrução
Busca do
código em
Ling. de Máq.
Programa em
Linguagem de
Máquina
Cap4 – Introdução à Linguagem Montadora do 8086
Página 27 de 30
4.7 Exemplos.
a) Programa para imprimir um string de caracteres.
TITLE PROGRAMA PARA EXIBICAO DE 'STRING' NO MONITOR
.MODEL SMALL
.STACK 100h
.DATA
MENSAGEM DB 'ALO! Como voces estao indo?$'
.CODE
MAIN PROC
;
;inicializando o registrador DS
;
 MOV AX,@DATA
 MOV DS,AX ;segmento de dados inicializado
;
;obtendo o offset da posição de memória de MENSAGEM
;
 LEA DX,MENSAGEM ;offset do endereço 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
Cap4 – Introdução à Linguagem Montadora do 8086
Página 28 de 30
b) Programa de conversão de letra minúscula para maiúscula.
Especificação do programa:
- apresente ao usuário uma mensagem do tipo
Entre com uma letra minuscula:
- ler um caracter do teclado (não é necessário testar se é letra)
- apresente uma segunda mensagem do tipo
Em maiuscula ela fica:
- apresente em seguida a letra convertida
- retornar ao DOS
Sugestão 1: Caracteres ASCII Carriage Return e Line Feed como variáveis.
CR EQU 0DH
LF EQU 0AH
Sugestão 2: Como exibir um string de caracteres juntamente com uma
variável?
MENSAGEM2 DB CR,LF,'Em maiuscula ela fica: '
CHAR DB ?,'$'
Obs: quando for exibida a MENSAGEM2, INT 21h continua ativa pois não há o
caracter ‘$’, permitindo que a variável CHAR seja exibida em seguida.
Cap4 – Introdução à Linguagem Montadora do 8086
Página 29 de 30
Uma possível solução:
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
Cap4 – Introdução à Linguagem Montadora do 8086
Página 30 de 30
4.8 Atividades práticas.
1) Escreva um programa para (a) exibir um ‘?’, (b) ler dois dígitos decimais
cuja soma seja menor que 10 e (c) exibir sua soma na próxima linha.
Sugestão:
?27 <- em negrito, a entrada do usuário
A soma de 2 e 7 vale 9
2) Escreva um programa para (a) questionar o usuário sobre suas iniciais (três
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 dígito hexadecimal de A a F (maiúsculo)
e exibi-lo em decimal na próxima linha. Utilize mensagens convenientes.
Sugestão:
Entre um digito hexa: C <- em negrito, a resposta à mensagem
O seu valor decimal vale: 12
4) Escreva um programa que leia três 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.
Sugestão: 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 função de
seu nome.
Cap5 – O registrador de sinalizadores (FLAGS)
Página 1 de 4
5. O registrador de sinalizadores (FLAGS)
5.1 Flags de Status e Flags de Controle
• indica o estado do microprocessadorapós a execução de cada instrução;
• conjunto de bits individuais, cada qual indicando alguma propriedade;
• subdividem-se em: Flags de Estado (status) e Flags de Controle.
• organização:
1 registrador de 16 bits
6 FLAGS de estado
3 FLAGS de controle
7 bits não utilizados (sem função)
 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF AF PF CF
Flags de estado
Nome Símbolo Função/característica
Carry Flag CF Indicador de "vai-um"
Parity Flag PF Indicador de número PAR de 1's no byte inferior
Auxiliary Carry AF Indicador de "vai-um" para operações em BCD
Zero Flag ZF Indicador de "zero" na última operação
Sign Flag SF Indicador de resultado negativo
Overflow Flag OF Indicador de erro de transbordamento
Obs: o emprego dos Flags de Controle será discutido juntamente com
operações com arrays e interrupções.
Cap5 – O registrador de sinalizadores (FLAGS)
Página 2 de 4
5.2 Overflow (erro de transbordamento)
Overflow -> ocorre porque a representação dos números está limitada a
uma certa faixa
Tipos 8 bits 16 bits
Não-sinalizado 0 a 255 0 a 65.535
Sinalizado (C2) -128 a +127 - 32.768 a + 32.767
• Qualquer operação aritmética que tenha como resultado um número fora
da faixa de representação, 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 número
 MSB (most significant bit) ..... o número “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 !
Cap5 – O registrador de sinalizadores (FLAGS)
Página 3 de 4
Exemplos de operações com 8 bits:
ADD AL,BL ;AL contem FFh e BL contem 01h
repres. não-sinalizada repres. sinalizada
FFh 1111 1111b 255 -1
01h + 0000 0001b + 1 +1
 1 0000 0000b -> 256 (fora da faixa) 0 (OK)
Logo após a execução da instrução:
CF = 1 , indicado em negrito;
OF = 0 , pois no MSB o "vem-um" é igual ao "vai-um" (ambos 1).
ADD AL,BL ;ambos AL e BL contém 7Fh
repres. não-sinalizada repres. sinalizada
7Fh 0111 1111b 127 + 127
7Fh + 0111 1111b + 127 + 127
 0 1111 1110b -> 254 (OK) 254 (fora)
Logo após a execução da instrução:
CF = 0 , indicado em negrito;
OF = 1 , pois no MSB o "vem-um" é diferente do "vai-um".
Portanto:
•• representação não-sinalizada -> Flag CF indica overflow;
•• representação sinalizada -> Flag OF indica overflow.
Cap5 – O registrador de sinalizadores (FLAGS)
Página 4 de 4
5.3 Como as instruções afetam os Flags
Algumas instruções, imediatamente após a sua execução:
• afetam todos os Flags;
• afetam apenas alguns;
• não afetam nenhum.
Instrução Flags afetados
MOV nenhum
XCHG nenhum
LEA nenhum
ADD/SUB todos
INC/DEC todos, exceto CF que não é afetado
NEG todos, CF=1 se o resultado não for zero
Exemplos:
ADD AX,BX ;onde ambos AX e BX valem FFFFh
FFFFh 1111 1111 1111 1111 b
FFFFh + 1111 1111 1111 1111 b
FFFEh 1 1111 1111 1111 1110 b
Como resultado: CF = 1 AF = 1 ZF = 0
PF = 0 SF = 1 OF = 0
INC AL ;onde AL contem FFh
 FFh 1111 1111 b
 01h + 1 b
100h 1 0000 0000 b ... Como é implementado o INC AL ?
Como resultado: CF = não afetado AF = 1 ZF = 1
PF = 1 SF = 0 OF = 0
Cap6 – Instruções de controle de fluxo.
Página 1 de 12
6. Instruções de controle de fluxo
Instruções de laço (loop) e de salto (jump) permitem que:
• o programa "tome" certas decisões, alterando seu curso;
• certas partes de um programa sejam repetidas um número controlado de
vezes;
• permite implementar a “inteligência” de qualquer algorítmo.
Exemplo preliminar: exibição 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
Cap6 – Instruções de controle de fluxo.
Página 2 de 12
6.1 A instrução de comparação
CMP destino,fonte
CMP (Compare) compara os conteúdos destino e fonte, que podem ser:
• registrador e registrador
• registrador e uma posição de memória
• um número diretamente como operando fonte
Combinações legais de operandos:
Operando destino
Operando fonte Registrador de
dados
Posição de
memória
Reg. de dados sim Sim
Posição de memória sim Não
Constante sim Sim
CMP calcula a subtração: (destino) - (fonte)
Todos os Flags de Estado são afetados e o resultado não é armazenado.
Exemplos de instruções válidas:
CMP DX,BX ;compara os conteúdos de DX e BX
CMP AX,WORD1 ;compara o conteúdo do registrador AX com o da
;posição de memória WORD1
CMP AH,’A’ ;compara o conteúdo de AH com o caracter ASCII ‘A’
Cap6 – Instruções de controle de fluxo.
Página 3 de 12
6.2 Saltos condicionais
JXXX rótulo_de_destino
• XXX é uma condição dependente de algum dos Flags de Estado
• Se a condição XXX é verdadeira:
- a próxima instrução a ser executada é aquela definida pelo
 rótulo_de_destino;
- a CPU ajusta o registrador IP para apontar para a posição de memória
 dada por rótulo_de_destino.
• Se a condição XXX é falsa:
- a próxima instrução é aquela que imediatamente segue o salto.
• Faixa de endereçamento do rótulo_de_destino:
- deve preceder JXXX não mais do que 126 bytes;
- deve suceder JXXX não mais do que 127 bytes.
• Há três classes de saltos condicionais:
- saltos sinalizados: dependem de um resultado na forma de um
 número sinalizado;
- saltos não-sinalizados: dependem de um resultado na forma de um
 número não-sinalizado;
- saltos de Flag simples: que dependem do status de algum dos Flags.
• A instrução JXXX não altera nenhum Flag.
Cap6 – Instruções de controle de fluxo.
Página 4 de 12
Tipos de saltos condicionais
Símbolo Descrição Condições
Saltos sinalizados
JG ou
JNLE
salto se maior do que OU
salto se não menor do que ou igual a
ZF = 0 E
SF = OF
JGE ou
JNL
salto se maior do que ou igual a OU
salto se não menor do que
SF = OF
JL ou
JNGE
salto se menor do que OU
salto se não maior do que ou igual a
SF ≠ OF
JLE ou
JNG
salto se menor do que ou igual a OU
salto se não maior do que
ZF = 1 OU
SF ≠ OF
Saltos não-sinalizados
JA ou
JNBE
salto se acima de OU
salto se não abaixo de ou igual a
CF = 0 E
ZF = 0
JAE ou
JNB
salto se acima de ou igual a OU
salto se não abaixo de
CF = 0
JB ou
JNAE
salto se abaixo de OU
salto se não acima de ou igual a
CF = 1
JBE ou
JNA
salto se abaixo de ou igual a OU
salto se não acima de
CF = 1 OU
ZF = 1
Saltos de Flag simples
JE ou
JZ
salto se igual OU
salto se igual a zero
ZF = 1
JNE ou
JNZ
salto se não igual OU
salto se não igual a zero
ZF = 0
JC salto se há VAI-UM (carry) CF = 1
JNC salto se não há VAI-UM (not carry) CF = 0
JO salto se há overflow OF = 1
JNO salto se não há overflow OF = 0
JS salto se o sinal é negativo SF = 1
JNS salto se o sinal é não-negativo (+) SF = 0
JP ou JPE salto se a paridade é PAR (even) PF = 1
JNP ou JPO salto se a paridade é IMPAR (odd) PF = 0
Cap6 – Instruções de controle de fluxo.
Página 5 de 126.3 Diferença entre Saltos sinalizados e não-sinalizados
a) Trecho de programa que supõe quantidades não-sinalizadas:
;supondo que AX contem 7FFFh e BX contem 8000h
...
CMP AX,BX
JA PT2 ;o salto não ocorre porque 7FFFh < 8000h
...
...
PT2: MOV ... ;continuação do programa
b) Trecho de programa que supõe quantidades sinalizadas:
;supondo que AX contem 7FFFh e BX contem 8000h
...
CMP AX,BX
JG PT2 ;o salto ocorre porque 7FFFh (+) > 8000h (-)
...
...
PT2: MOV ... ;continuação do programa
Exemplo: Supondo que AX e BX contenham números sinalizados, escreva
um trecho de programa que coloque o maior deles em CX.
...
MOV CX,AX ;AX já é pressuposto ser o maior deles
CMP AX,BX
JNL ABAIXO ;poderia ser também JGE ABAIXO
MOV CX,BX ;caso BX seja de fato o maior deles
ABAIXO: ... ;continuação do programa
...
Cap6 – Instruções de controle de fluxo.
Página 6 de 12
6.4 Salto incondicional
JMP rótulo_de_destino
•• Rótulo_de_destino é uma posição no programa, no mesmo segmento de
código onde JMP aparece
• Não há restrição de faixa de endereçamento como em JXXX
• JMP pode ajudar a solucionar o problema de faixa de endereçamento das
instruções JXXX
Exemplo: trecho utilizando JMP e JXXX
TOPO: ...
;mais do que 126 bytes de instruções: limitação para JXXX
...
;corpo de algum laço
;
DEC CX
JNZ ABAIXO
JMP CONTINUA
ABAIXO: JMP TOPO
CONTINUA: MOV ... ;programa continua
...
Cap6 – Instruções de controle de fluxo.
Página 7 de 12
6.5 Uma instrução de laço especial - LOOP.
LOOP rótulo_de_destino
• Tem como contador implícito o registrador CX, que deve ser inicializado
antes do laço.
• Salta para rótulo_de_destino enquanto o conteúdo de CX não for zero.
• Quando CX = 0, a próxima instrução após LOOP será executada.
• CX é decrementado automaticamente quando LOOP é executada.
• Nenhum FLAG é afetado.
Exemplo de instruções válidas:
LOOP PT1
LOOP TOPO
LOOP RETORNO
Obs: são equivalentes as seqüências
MOV CX, (valor_inicial) MOV CX, (valor_inicial)
TOPO: ... TOPO: ...
... ...
LOOP TOPO DEC CX
JNZ TOPO
Cap6 – Instruções de controle de fluxo.
Página 8 de 12
6.6 Atividades práticas.
1) Escreva um programa que apresente uma '?', leia em seguida duas letras
maiúsculas e exiba-as na próxima linha, em ordem alfabética.
2) Modifique o programa de exibição de caracteres ASCII (página 1), de forma
a exibir 16 caracteres por linha separados por espaços em branco.
3) Escreva um programa que peça ao usuário para teclar um dígito
hexadecimal, exiba na próxima linha o seu valor decimal e pergunte ao
usuário se deseja continuar a utilizar o programa: se for digitado S (sim), o
programa se repete desde o começo; se for digitado outro caracter, o
programa termina. Teste se o dígito hexa está na faixa de valores correta. Se
não estiver, exiba uma mensagem para o usuário tentar de novo.
4) Crie um trecho de código modificando o programa do exercício (3) acima,
tal que se o usuário falhar em entrar com um dígito hexa na faixa correta mais
do que três tentativas, o programa exibe uma mensagem adequada e termina.
5) Crie um programa que implemente uma multiplicação por meio de somas
sucessivas. Faça as considerações que achar necessárias.
6) Crie um programa que implemente uma divisão por meio de subtrações
sucessivas, exibindo o quociente e o resto com mensagens adequadas. Faça
as considerações que achar necessárias.
Cap6 – Instruções de controle de fluxo.
Página 9 de 12
Apêndice
Algumas estruturas de linguagens de alto nível
1) Estrutura IF - THEN - ELSE
Em linguagem de alto nível:
IF (condição)
THEN (seqüência 1)
ELSE (seqüência 2)
END_IF
Exemplo: Suponha que AL e BL contenham dois caracteres ASCII; exiba
aquele que seja o primeiro em ordem alfabética.
Em linguagem de alto nível:
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: .....
Cap6 – Instruções de controle de fluxo.
Página 10 de 12
2) FOR loop
Em linguagem de alto nível:
FOR (número_de_vezes) DO
(seqüência de instruções)
END_FOR
Exemplo: Exiba uma seqüência de 80 asteriscos no monitor de vídeo.
Em linguagem de alto nível:
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
...
Exercício: modifique o programa que exibe todos os caracteres ASCII (página
1 deste capítulo), utilizando apenas a instrução LOOP.
Cap6 – Instruções de controle de fluxo.
Página 11 de 12
3) WHILE loop
Em linguagem de alto nível:
WHILE (condição_verdadeira) DO
(seqüência de instruções)
END_WHILE
Exemplo: Ler caracteres ASCII do teclado, contando sua quantidade, até que
o caracter Carriage Return (CR) apareça.
Em linguagem de alto nível:
WHILE (caracter diferente de CR) DO
(ler caracter do teclado e armazená-lo)
(contador = contador +1)
END_WHILE
Em linguagem montadora:
...
MOV DX,0h ;inicialização do contador
MOV AH,1h
INT 21h ;lê o primeiro caracter em AL
;while
LOOP: CMP AL,0Dh ;é o caracter CR?
JE FIM ;salto quando caracter é igual a CR
MOV (algum lugar), AL ;salvando o caracter lido
INC DX ;conta número de caracteres
INT 21h ;lê o próximo caracter em AL
JMP LOOP ;fecha o laço WHILE
;end_while
FIM:
Cap6 – Instruções de controle de fluxo.
Página 12 de 12
4) REPEAT loop
Em linguagem de alto nível:
REPEAT
(seqüência de instruções)
UNTIL (condição_verdadeira)
Exemplo: Ler caracteres ASCII do teclado, contando sua quantidade, até que
o caracter Carriage Return (CR) apareça.
Em linguagem de alto nível:
REPEAT
(ler caracter do teclado e armazená-lo)
(contador = contador + 1)
UNTIL (caracter igual a CR)
Em linguagem montadora:
...
MOV DX,0h ;inicialização
MOV AH,1h
;repeat
LOOP: INT 21h ;lê um caracter em AL
MOV (algum lugar),AL ;salvando o caracter lido
INC DX ;conta número de caracteres
CMP AL,0Dh ;é o caracter CR?
JNE LOOP ;salto enquanto caracter não é CR
;until
...
Obs: O laço é realizado ao menos uma vez; o caracter CR é armazenado.
Cap7 – Instruções lógicas, de deslocamento e de rotação
Página 1 de 22
7. Instruções lógicas, de deslocamento e de rotação
• São instruções que permitem mudar o padrão de bits num byte (8 bits) ou
numa palavra (16 bits).
• Linguagens de alto nível (exceto C) não permitem manipular diretamente
bits.
• Instruções lógicas AND, OR, XOR e NOT são usadas para:
- resetar (reset) ou limpar (clear) um bit: 1 -> 0
- setar (set) um bit: 0 -> 1
- examinar bits
- realizar máscaras para manipular bits em determinadas posições
Operadores lógicos:
a b a AND b a OR b a XOR b a NOT a
0 0 0 0 0 0 1
0 1 0 1 1 1 0
1 0 0 1 1
1 1 1 1 0
Obs: em bytes ou palavras, os operadores lógicos são aplicados bit a bit.
• Instruções de deslocamento (shift):
- deslocar para a esquerda 1 casa bimária => multiplicar por dois
- deslocar para a direita 1 casa binária => dividir por dois
- os bits deslocados para fora são perdidos
• Instruções de rotação (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.
Cap7 – Instruções lógicas, de deslocamento e de rotação
Página 2 de 22
7.1 Instruções lógicas
AND destino,fonte
 OR destino,fonte
XOR destino,fonte
Usadas para aplicar os operadores lógicos correspondentes bit a bit entre:
• registrador e registrador
• registrador e uma posição de memória
• o operando fonte pode ser também uma constante
Combinações legais de operandos:
Operando destino
Operando fonte Registrador
de dados
Posição de
memória
Reg. de dados sim sim
Posição de memória sim não
Constante sim sim
• Flags afetados:
SF, ZF, PF refletem o resultado (armazenado no operando destino)
AF não é afetado
CF e OF ficam em zero, ou seja, são resetados
Exemplos de instruções válidas:
XOR AX,BX ;operador XOR aplicado aos conteúdos de AX eBX,
;resultado em AX
AND CH,01h ;operador AND aplicado ao conteúdo de CH, tendo
;como fonte o valor imediato 01h = 0000 0001b
OR WORD1,BX ;operador OR entre conteúdos da posição de memória
;WORD1 e de BX, resultado armazenado em WORD1
Cap7 – Instruções lógicas, de deslocamento e de rotação
Página 3 de 22
Graficamente: suponha a instrução AND BL,AL
Antes Depois
BL BL
AAh = 1010 1010b 0Ah = 0000 1010b
AL AL
0Fh = 0000 1111b 0Fh = 0000 1111b
Obs: Propriedades dos operadores lógicos aplicados bit a bit:
bit(x) AND 0 = 0 bit(x) AND 1 = bit(x)
bit(x) OR 0 = bit(x) bit(x) OR 1 = 1
bit(x) XOR 0 = bit(x) bit(x) XOR 1 = complemento do bit(x)
Criação de máscaras: padrão de "0" e "1" para manipular bits por meio de
operações lógicas.
• AND pode ser utilizado para zerar (clear ou reset) bits específicos: basta
ter um 0 na posição que se deseja este efeito.
• OR pode ser utilizado para setar (set) bits específicos: deve-se ter um 1 na
posição em que se deseja este efeito.
• XOR pode ser utilizado para complementar (inverter) bits específicos:
deve-se ter um 1 na posição em que se deseja este efeito.
Cap7 – Instruções lógicas, de deslocamento e de rotação
Página 4 de 22
Exemplos de máscaras:
1) Setar os bits MSB e LSB do registrador AX, dado AX = 7444h:
OR AX,8001h
AX (antes) -> 0111 0100 0100 0100b -> 7444h
8001h -> 1000 0000 0000 0001b
 OR______________________________________
AX (depois) -> 1111 0100 0100 0101b -> F445h
2) Convertendo o código ASCII de um dígito numérico em seu valor binário:
AND AL,0Fh (em substituição a: SUB AL,30h)
AL (antes) -> 0011 0111b -> 37h = "7" = 55d
0Fh -> 0000 1111b
 AND_______________________
AL (depois) -> 0000 0111b -> 07h = 7d (valor sete)
Obs: nesta conversão, tem-se apenas que zerar (resetar) os 4 últimos bits.
3) Convertendo letra minúscula em maiúscula, supondo o caracter em AL:
AND AL,0DFh
AL (antes) -> 0110 0001b -> 61 h = "a"
DFh -> 1101 1111b
 AND_______________________
AL (depois) -> 0100 0001b -> 41h = "A"
Obs: para esta conversão, tem-se apenas que zerar (resetar) o bit 5 de AL.
Cap7 – Instruções lógicas, de deslocamento e de rotação
Página 5 de 22
Mais exemplos de aplicação de operações lógicas:
1) Limpando (zerando) um registrador:
XOR AX, AX
AX (antes) -> 0111 0100 0100 0100b -> 7444h
-> 0111 0100 0100 0100b
 XOR_____________________________________
AX (depois) -> 0000 0000 0000 0000b -> 0000h = 0
Obs: esta forma é mais rápida de executar do que as outras opções
MOV AX,0000h e SUB AX,AX
2) Testando se o conteúdo de algum registrador é zero:
OR CX,CX
CX (antes) -> 0111 0100 0100 0100b -> 7444h
-> 0111 0100 0100 0100b
 OR______________________________________
CX (depois) -> 0111 0100 0100 0100b -> 7444h (não é 0)
Obs:
• esta operação deixa o registrador CX inalterado
• modifica o FLAG ZF somente quando o conteúdo de CX é realmente zero
• esta forma é mais rápida de executar do que CMP CX,0000h.
Cap7 – Instruções lógicas, de deslocamento e de rotação
Página 6 de 22
NOT destino
Usada para aplicar o operador lógico NOT em todos os bits de:
• um registrador
• uma posição de memória
• o resultado é a complementação (inversão) de todos os bits
• Flags afetados: nenhum
Exemplos de instruções válidas:
NOT AX ;inverte todos os bits de AX
NOT AL ;inverte todos os bits de AL
NOT BYTE1 ;inverte todos os bits do conteúdo da posição de
;memória definida pelo nome BYTE1
Graficamente: suponha a instrução NOT WORD1
Antes Depois
BYTE1 BYTE1
81h = 1000 0001b 7Eh = 0111 1110b
Cap7 – Instruções lógicas, de deslocamento e de rotação
Página 7 de 22
TEST destino,fonte
Usada para aplicar o operador lógico AND entre:
• registrador e registrador
• registrador e uma posição de memória
• o operando fonte pode ser também uma constante
sem afetar o operando destino (não armazena o resultado do AND).
Combinações legais de operandos:
Operando destino
Operando fonte Registrador
de dados
Posição de
memória
Reg. de dados sim sim
Posição de memória sim não
Constante sim sim
• Flags afetados:
SF, ZF, PF refletem o resultado (armazenado no operando destino)
AF não é afetado
CF e OF ficam em zero
Exemplos de instruções válidas:
TEST AX,BX ;operação AND entre AX e BX, não há resultado, mas
;apenas alteração dos FLAGS ZF, SF e PF
TEST AL,01h ;operação AND entre AL e o valor imediato 01h
Cap7 – Instruções lógicas, de deslocamento e de rotação
Página 8 de 22
Graficamente: suponha a instrução TEST AX,0001h
Antes Depois
AX AX
4444h = 0100 0100 0100 0100b 0100 0100 0100 0100b
ZF ZF
0 1
Neste exemplo, a máscara 0001h serve para testar se o conteúdo de AX é
PAR (todo número binário PAR possui um zero no LSB)
• O número 4444h é PAR pois o seu LSB vale zero
• 4444h AND 0001h produz como resultado 0000h que faz ZF = 1
• o resultado não é armazenado em AX, somente ZF é modificado por TEST
Exemplo: escreva um trecho de programa que salte para o rótulo PONTO2 se
o conteúdo de CL for negativo:
....
TEST CL,80h ;80h é a máscara 1000 0000b
JNZ PONTO2
....
(o programa prossegue, pois o número é positivo)
....
PONTO2: ....
(o programa opera aqui com o número negativo)
....
Cap7 – Instruções lógicas, de deslocamento e de rotação
Página 9 de 22
7.2 Atividades práticas.
1) Dê a operação lógica e a máscara correspondente para cada item abaixo,
tal que:
a) Limpe (clear) os bits pares de AX, deixando os restantes sem
alteração;
b) Sete (set) o MSB de BL, permanecendo os restantes como estão;
c) Complemente o MSB de DX, deixando os restantes intocados;
d) Remova os quatro bits mais significativos de AL, permanecendo os
restantes inalterados;
e) Faça o complemento de 2 de BX sem utilizar a instrução NEG (talvez
seja necessário um trecho de programa ao invés de uma única
operação lógica).
2) Use a instrução TEST em cada item abaixo para:
a) Fazer ZF = 1 caso o conteúdo de AX seja zero;
b) Zerar ZF caso o o conteúdo de BL seja IMPAR;
c) Setar SF caso o conteúdo de DX seja um número negativo;
d) Setar ZF caso o conteúdo de DX seja zero ou um número positivo;
e) Setar PF caso BL contenha um número PAR de bits 1.
Cap7 – Instruções lógicas, de deslocamento e de rotação
Página 10 de 22
7.3 Instruções 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 posição de memória
Sxx Significado
SHL Shift Left - deslocamento para a esquerda
SAL Shift Arithmetic Left - deslocamento aritmético para a esquerda
SHR Shift Right - deslocamento para a direita
SAR Shift Arithmetic Right - deslocamento aritmético para a direita
• Flags afetados:
SF, ZF, PF refletem o resultado da última rotação
AF não é afetado
CF contem o último bit deslocado para fora
OF = 1 se ocorrer troca de sinal após o último deslocamento
Exemplos de instruções válidas:
SHL AX,1 ;desloca os bits de AX para a esquerda 1 casa binária,
;sendo o LSB igual a zero
SAL BL,CL ;desloca os bits de BL para a esquerda tantas casas
;binárias quantas CL indicar, os bits menos
;significativos são zero (mesmo efeito de SHL)
SAR DH,1 ;desloca os bits de DH para a direita 1 casa binária,
;sendo que o MSB mantem o sinal
Cap7 – Instruções lógicas, de deslocamento e de rotação
Página 11 de 22
Mecânica de deslocamento
(ver figura 7.2 na página 123, figura 7.3 na página 124 e 7.4 na página 125 do livro-texto)
Cap7 – Instruções lógicas, de deslocamento e de rotação
Página 12 de 22
Exemplos:
1) Multiplique o conteúdo de AX por 8, supondo AX contendo 0005h = 5d:
AX (original) 0000 0000 0000 0101 = 5d
após o 1o. deslocamento 0000 0000 0000 1010 = 10d
após o 2o. deslocamento 0000 0000 0001 0100 = 20d
após o 3o. deslocamento 0000 0000 0010 1000 = 40d
trecho de programa:
...
MOV CL,3
SHL AX,CL ;poderia ser SAL AX,CL
...
2) Divida o conteúdo de DH por 4, supondo DH contendo 12h = 18d:
DH (original) 0001 0010= 18d
após o 1o. deslocamento 0000 1001= 9d
após o 2o. deslocamento 0000 0100= 4d CF = 1Obs: pelo fato do número 9 ser impar, sua divisão por dois foi arredondada
para o inteiro imediatamente inferior.
trecho de programa:
...
MOV CL, 02
SAR DH,CL
...
Cap7 – Instruções lógicas, de deslocamento e de rotação
Página 13 de 22
7.4 Instruções de rotação:
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 posição de memória
Rxx Significado
ROL Rotate Left - rodar para a esquerda
ROR Rotate Right - rodar para a direita
RCL Rotate Carry Left - rodar para a esquerda através do flag CF
RCR Rotate Carry Right - rodar para a direita através do flag CF
• Flags afetados:
SF, ZF, PF refletem o resultado da última rotação
AF não é afetado
CF contem o último bit deslocado para fora
OF = 1 se ocorrer troca de sinal após a última rotação
Exemplos de instruções válidas:
ROL AX,1 ;desloca os bits de AX para a esquerda 1 casa binária,
;sendo o MSB é reinserido na posição LSB
ROR BL,CL ;desloca os bits de BL para a direita tantas casas
;binárias quantas CL indicar, os bits menos
;significativos são reinseridos um-a-um no MSB
RCR DH,1 ;desloca os bits de DH para a direita 1 casa binária,
;sendo que o MSB recebe CF e o LSB é salvo em CF
Cap7 – Instruções lógicas, de deslocamento e de rotação
Página 14 de 22
Mecânica de rotação
(ver figura 7.5 na página 126, figura 7.6 na página 127, 7.7 na página 128 e figura 7.8 na página 129 do livro-texto)
Cap7 – Instruções lógicas, de deslocamento e de rotação
Página 15 de 22
Exemplos:
1) Conte o número de bits "1's" presentes em AX, sem destruí-lo:
Utilizando:
- CX como contador de bits
- BL como contador de "1's"
...
XOR BL,BL ;inicializa-se BL com zero
MOV CX,16 ;inicializa-se contador de bits (AX tem 16 bits)
TOPO: ROL AX, 1 ;roda-se AX 1 casa a esquerda e
;CF contem uma cópia do bit deslocado
JNC PT1 ;se CF = 1
INC BL ;conta-se 1 em BL
PT1: LOOP TOPO ;senão, processegue-se no laço
... ;até que CX = 0
2) Invertendo o padrão de bits de AL:
Se AL (antes) = 1000 1100b, AL (depois) = 0011 0001b
...
XOR BL,BL ;inicializa-se BL com zero
MOV CX,8 ;inicaliza-se contador de bits (AL tem 8 bits)
TOPO: SHL AL,1 ;desloca-se AL 1 casa para a esquerda
;CF contem o bit deslocado para fora
RCR BL,1 ;roda-se BL para a direita através de CF
LOOP TOPO ;enquanto CX não for zero, repete TOPO
MOV AL,BL ;quando CX = 0, AL recebe o padrão
...
Cap7 – Instruções lógicas, de deslocamento e de rotação
Página 16 de 22
7.5 Entrada e saída de números bináros e hexadecimais:
•• Entrada de números binários:
- string de caracteres "0's" e "1's" fornecidos pelo teclado;
- CR é o marcador de fim de string;
- BX é assumido como registrador de armazenamento;
- máximo de 16 bits de entrada.
Algoritmo básico em linguagem de alto nível:
Limpa BX
Entra um caracter "0" ou "1"
WHILE caracter diferente de CR DO
Converte caracter para valor binário
Desloca BX 1 casa para a esquerda
Insere o valor binário lido no LSB de BX
Entra novo caracter
END_WHILE
Trecho de programa implementado em Linguagem Montadora:
...
MOV CX,16 ;inicializa contador de dígitos
MOV AH,1h ;função 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 não, elimina 30h do caracter
;(poderia ser SUB AL,30h)
SHL BX,1 ;abre espaço para o novo dígito
OR BL,AL ;insere o dígito no LSB de BL
INT 21h ;entra novo caracter
LOOP TOPO ;controla o máximo de 16 dígitos
;end_while
FIM: ...
Cap7 – Instruções lógicas, de deslocamento e de rotação
Página 17 de 22
•• Saída de números binários:
- BX é assumido como registrador de armazenamento;
- total de 16 bits de saída;
- string de caracteres "0's" e "1's" é exibido no monitor de vídeo.
Algoritmo básico em linguagem de alto nível:
FOR 16 vezes DO
rotação de BX à esquerda 1 casa binária (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:
...
MOV CX,16 ;inicializa contador de bits
MOV AH,02h ;prepara para exibir no monitor
;for 16 vezes do
PT1: ROL BX,1 ;desloca BX 1 casa à esquerda
;if CF = 1
JNC PT2 ;salta se CF = 0
;then
MOV DL, 31h ;como CF = 1
INT 21h ;exibe na tela "1" = 31h
;else
PT2: MOV DL, 30h ;como CF = 0
INT 21h ;exibe na tela "0" = 30h
;end_if
LOOP PT1 ;repete 16 vezes
;end_for
...
Cap7 – Instruções lógicas, de deslocamento e de rotação
Página 18 de 22
•• Entrada de números hexadecimais:
- BX é assumido como registrador de armazenamento;
- string de caracteres "0" a "9" ou de "A" a "F", digitado no teclado;
- máximo de 16 bits de entrada ou máximo de 4 dígitos hexa.
Algoritmo básico em linguagem de alto nível:
Inicializa BX
Entra um caracter hexa
WHILE caracter diferente de CR DO
Converte caracter para binário
Desloca BX 4 casas para a esquerda
Insere valor binário 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 número ou letra?
JG LETRA ;caracter já está na faixa ASCII
AND AL,OFh ;número: retira 30h do ASCII
JMP DESLOC
LETRA: SUB AL,37h ;converte letra para binário
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 laço até que haja CR
;end_while
FIM: ...
Cap7 – Instruções lógicas, de deslocamento e de rotação
Página 19 de 22
•• Saída de números hexadecimais:
- BX é assumido como registrador de armazenamento;
- total de 16 bits de saída;
- string de caracteres HEXA é exibido no monitor de vídeo.
Algoritmo básico em linguagem de alto nível:
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
Exibição do caracter no monitor de vídeo
Rodar BX 4 casas à esquerda
END_FOR
Cap7 – Instruções lógicas, de deslocamento e de rotação
Página 20 de 22
Trecho de programa implementado em Linguagem Montadora:
... ;BX já contem número binário
MOV CH,4 ;CH contador de caracteres hexa
MOV CL,4 ;CL contador de delocamentos
MOV AH,2h ;prepara exibição no monitor
;for 4 vezes do
TOPO: MOV DL,BH ;captura em DL os oito bits mais
;significativos de BX
SHR DL,CL ;resta agora em DL somente os 4
;bits mais significativos de BX
;if DL , 10
CMP DL, 0Ah ;testa se é letra ou número
JAE LETRA
;then
ADD DL,30h ;é número: soma-se 30h
JMP PT1
;else
LETRA: ADD DL,37h ;ao valor soma-se 37h -> ASCII
;end_if
PT1: INT 21h ;exibe
ROL BX,CL ;roda BX 4 casas para a direita
DEC CH
JNZ TOPO ;faz o FOR 4 vezes
;end_for
... ;programa continua
Cap7 – Instruções lógicas, de deslocamento e de rotação
Página 21 de 22
7.6 Atividades práticas.
1) Suponha as condições iniciais AL = 11001011b e CF = 1. Dê o novo
conteúdo de AL após cada uma das seguintes instruções, sempre com base
nas condições 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 peça ao usuário para entrar um caracter ASCII,
na próxima linha exiba no monitor uma mensagem apresentando o valor
binário deste código e numa segunda linha exiba outra mensagem que
apresente o número de bits "1" existentes no código ASCII.
3) Escreva um programa que peça ao usuário para entrar um caracter ASCII,
na próxima linha exiba no monitor o caracter lido e numa segunda linha exiba
outra mensagem que apresente o valor hexadecinal correspondente ao código
ASCII. Repita este procedimento até que o usuário entre comum carriage
return CR. Exemplo:
Digite um caracter: Z
O codigo ASCII de Z

Outros materiais