curso assembly

120
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

Upload: petersonmsc5

Post on 19-Jul-2016

59 views

Category:

Documents


5 download

DESCRIPTION

Curso de Assembly PDF

TRANSCRIPT

Page 1: Curso Assembly

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

Page 2: Curso Assembly

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

Page 3: Curso Assembly

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

Page 4: Curso Assembly

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

Page 5: Curso Assembly

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.

Page 6: Curso Assembly

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

Page 7: Curso Assembly

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

Page 8: Curso Assembly

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

Page 9: Curso Assembly

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.

Page 10: Curso Assembly

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

Page 11: Curso Assembly

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

Page 12: Curso Assembly

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.

Page 13: Curso Assembly

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

Page 14: Curso Assembly

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

Page 15: Curso Assembly

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

Page 16: Curso Assembly

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

Page 17: Curso Assembly

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

Page 18: Curso Assembly

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.

Page 19: Curso Assembly

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

Page 20: Curso Assembly

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

Page 21: Curso Assembly

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)

Page 22: Curso Assembly

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.

Page 23: Curso Assembly

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.

Page 24: Curso Assembly

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

Page 25: Curso Assembly

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.

Page 26: Curso Assembly

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

Page 27: Curso Assembly

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

Page 28: Curso Assembly

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

Page 29: Curso Assembly

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.

Page 30: Curso Assembly

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

Page 31: Curso Assembly

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 devariável, contendo de 1 a 31 caracteres, iniciando por uma letra e contendosomente letras, números e os caracteres ? . @ _ : $ % .

Obs: o Montador traduz os nomes por endereços de memória.

Exemplos: nomes válidos nomes inválidosLOOP1: DOIS BITS.TEST 2abc@caracter A42.25SOMA_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 diretivasMOV .MODELADD .STACKINC nome PROCJMP

Page 32: Curso Assembly

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óriaonde 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çõesacerca da diretiva.

Page 33: Curso Assembly

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 ainformaçã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)

Page 34: Curso Assembly

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 64223D1110101 é considerado decimal (ausência do B)-2184D (número decimal negativo)

- hexa: 64223h ou 64223H0FFFFh começa com um decimal e termina com h1B4Dh

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ável1B4D não termina com h ou H

•• Caracteres ASCII:

Caracteres isolados ou strings de caracteres devem estar escritos dentrode aspas simples ( ‘ ) ou duplas ( “ ).

Exemplos:“ A” ou ‘ A ’‘ola, como vai’“EXEMPLO”

Page 35: Curso Assembly

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 00hA DB 10hB DB 0150h ;ilegal, por que?BIT DB ? ;não inicializada

Page 36: Curso Assembly

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 0000hCONTA 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,30hWORD_ARRAYDW 1000h,123h,0h,0FFFFh

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

LETRAS DB ‘abC’ ;e´ equivalente aos caracteres ASCIILETRAS DB 61h,62h,43h ;depende se maiúscula ou minúscula

Page 37: Curso Assembly

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 sejamuito 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 LFCR EQU 0Dh ;caracter Carriage return como CRLINHA1 EQU ‘Digite seu nome completo’

MENSAGEM DB LINHA1,LF,CR

Observação:• Constantes não geram código de máquina.

Page 38: Curso Assembly

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 destinoOperando fonte Registrador de

dadosRegistrador de

segmentoPosição dememória

Reg. de dados sim sim simReg. de segmento sim não sim

Posição de memória sim sim nãoConstante 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

Page 39: Curso Assembly

Cap4 – Introdução à Linguagem Montadora do 8086

Página 10 de 30

Graficamente: suponha a instrução MOV AX,WORD1

Antes Depois

AX AX0006h 8FFFh

WORD1 WORD18FFFh 8FFFh

Obs: para a instrução MOV não é permitido operar de posição de memóriapara 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 AXMOV WORD1,AX ;depois, o conteúdo de AX é movido para a

;posição de memória WORD1

Page 40: Curso Assembly

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 destinoOperando fonte Registrador

de dadosPosição dememória

Reg. de dados sim simReg. 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 AL14h FFh E0h FFh

BH BL BH BLC2h E0h C2h 14h

Page 41: Curso Assembly

Cap4 – Introdução à Linguagem Montadora do 8086

Página 12 de 30

ADD destino,fonteSUB 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 destinoOperando fonte Registrador

de dadosPosição dememória

Reg. de dados sim simPosiçã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

Page 42: Curso Assembly

Cap4 – Introdução à Linguagem Montadora do 8086

Página 13 de 30

Graficamente: suponha a instrução ADD AX,DX

Antes Depois

AX AX0006h 0009h

DX DX0003h 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 ALADD 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 registradordestino em complemento de 2.

Page 43: Curso Assembly

Cap4 – Introdução à Linguagem Montadora do 8086

Página 14 de 30

INC destinoDEC destino

Usadas para adicionar 1 (incrementar) ou subtrair 1 (decrementar) ao/doconteú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 BYTE106h 07h

Page 44: Curso Assembly

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 BX0002h FFFEh

Page 45: Curso Assembly

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 é especificadopelo 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 muitosdados, o modelo apropriado é o SMALL.

• A diretiva .MODEL deve vir antes de qualquer definição de segmento.

Page 46: Curso Assembly

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:.DATAWORD1 DW A8hBYTE1 DB 5MENSAGEM 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

Page 47: Curso Assembly

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:

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

Page 48: Curso Assembly

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

Page 49: Curso Assembly

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 = 1hResultado: AL = código ASCII do caracter digitado no teclado

Função 2h: Exibição de caracter simples no monitor de vídeo

Acesso: AH = 2hDL = código ASCII do caracter a exibir

Resultado: exibição na tela do monitor

Page 50: Curso Assembly

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 caracterASCII 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 caracterASCII para o monitor de vídeo:

MOV AH,2h ;prepara para exibir caracter no monitorMOV 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ódigoASCII

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)

Page 51: Curso Assembly

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 = 9hDX = 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 fimda 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 doprograma recém iniciado (DS ainda aponta para algum segmento de dados doDOS);

b) deve-se colocar em DX o offset do endereço do string que queremos exibir

Page 52: Curso Assembly

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 dadosdefinido pela diretiva .DATA, que contem as variáveis e constantes.

Exemplo: para inicializar corretamente DS para o programa corrente

.DATA

...

.CODEMOV AX,@DATA ;coloca o número do segmento de dados em AXMOV DS,AX ;pois DS não pode receber @DATA diretamente

Obs: o programa Montador traduz o nome @DATA pelo número de segmentoonde 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çoda posição de memória fonte no registrador destino.

Exemplo:

.DATAMENSAGEM DB ‘Adoro OBCLM!$’....CODELEA 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 ondeinicia o string MENSAGEM

Page 53: Curso Assembly

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 linguagemsimbó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 eoperandos.

- 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ódigode máquina.

•• Processo de montagem:

- Conversão de códigos mnemônicos em seus equivalentes códigosbinários.

- Conversão de números decimais, hexadecimais e octais em seusequivalentes binários.

- Atribuição de endereços para as instruções do programa principal edas subrotinas.

- Atribuição de endereços na memória para as palavras de dados.

Page 54: Curso Assembly

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áriasinstruções em linguagem de montagem. Quando invocadas, sãotraduzidas pelo montador (expandidas) em mais de um código demáquina.

Page 55: Curso Assembly

Cap4 – Introdução à Linguagem Montadora do 8086

Página 26 de 30

O processo de montagem

Arquivo texto*.ASM

Editor

Montador(Assembler)

Arquivointermediáro

*.OBJ

Lincador(Linker)

Arquivoexecutável

*.EXE

Programafonte em

mnemônicos

Verificação dasintaxe dainstrução

Busca docódigo em

Ling. de Máq.

Programa emLinguagem de

Máquina

Page 56: Curso Assembly

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.DATAMENSAGEM DB 'ALO! Como voces estao indo?$'.CODEMAIN 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 ;saindoMAIN ENDP END MAIN

Page 57: Curso Assembly

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 tipoEntre com uma letra minuscula:

- ler um caracter do teclado (não é necessário testar se é letra)

- apresente uma segunda mensagem do tipoEm 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 0DHLF EQU 0AH

Sugestão 2: Como exibir um string de caracteres juntamente com umavariá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á ocaracter ‘$’, permitindo que a variável CHAR seja exibida em seguida.

Page 58: Curso Assembly

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.DATACR EQU 0DhLF EQU 0AhMENSAGEM1 DB 'Entre com uma letra minuscula: $'MENSAGEM2 DB CR,LF,'Em maiuscula ela fica: 'CHAR DB ?,'$'.CODEMAIN 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 ;saindoMAIN ENDP END MAIN

Page 59: Curso Assembly

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 decimaiscuja soma seja menor que 10 e (c) exibir sua soma na próxima linha.

Sugestão:

?27 <- em negrito, a entrada do usuárioA soma de 2 e 7 vale 9

2) Escreva um programa para (a) questionar o usuário sobre suas iniciais (trêspor exemplo), (b) ler as iniciais e (c) exibi-las de cima para baixo, em linhasseparadas 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 à mensagemO seu valor decimal vale: 12

4) Escreva um programa que leia três iniciais, exiba-as de forma centradadentro de uma moldura de asteriscos de 11 x 5 (horizontal x vertical) e por fimproduza 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 deseu nome.

Page 60: Curso Assembly

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 microprocessador apó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 bits6 FLAGS de estado3 FLAGS de controle7 bits não utilizados (sem função)

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0OF DF IF TF SF ZF AF PF CF

Flags de estadoNome 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 inferiorAuxiliary Carry AF Indicador de "vai-um" para operações em BCDZero Flag ZF Indicador de "zero" na última operaçãoSign Flag SF Indicador de resultado negativoOverflow Flag OF Indicador de erro de transbordamento

Obs: o emprego dos Flags de Controle será discutido juntamente comoperações com arrays e interrupções.

Page 61: Curso Assembly

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 auma certa faixa

Tipos 8 bits 16 bits

Não-sinalizado 0 a 255 0 a 65.535Sinalizado (C2) -128 a +127 - 32.768 a + 32.767

• Qualquer operação aritmética que tenha como resultado um número forada 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 = 0se diferentes, OF = 1 ..... e ocorreu o overflow !

Page 62: Curso Assembly

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. sinalizadaFFh 1111 1111b 255 -101h + 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. sinalizada7Fh 0111 1111b 127 + 1277Fh + 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.

Page 63: Curso Assembly

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 afetadosMOV nenhumXCHG nenhumLEA nenhumADD/SUB todosINC/DEC todos, exceto CF que não é afetadoNEG 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 bFFFFh + 1111 1111 1111 1111 bFFFEh 1 1111 1111 1111 1110 b

Como resultado: CF = 1 AF = 1 ZF = 0PF = 0 SF = 1 OF = 0

INC AL ;onde AL contem FFh

FFh 1111 1111 b 01h + 1 b100h 1 0000 0000 b ... Como é implementado o INC AL ?

Como resultado: CF = não afetado AF = 1 ZF = 1PF = 1 SF = 0 OF = 0

Page 64: Curso Assembly

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

Page 65: Curso Assembly

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 destinoOperando fonte Registrador de

dadosPosição dememória

Reg. de dados sim SimPosiçã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’

Page 66: Curso Assembly

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.

Page 67: Curso Assembly

Cap6 – Instruções de controle de fluxo.

Página 4 de 12

Tipos de saltos condicionais

Símbolo Descrição Condições

Saltos sinalizadosJG ouJNLE

salto se maior do que OUsalto se não menor do que ou igual a

ZF = 0 ESF = OF

JGE ouJNL

salto se maior do que ou igual a OUsalto se não menor do que

SF = OF

JL ouJNGE

salto se menor do que OUsalto se não maior do que ou igual a

SF ≠ OF

JLE ouJNG

salto se menor do que ou igual a OUsalto se não maior do que

ZF = 1 OUSF ≠ OF

Saltos não-sinalizadosJA ouJNBE

salto se acima de OUsalto se não abaixo de ou igual a

CF = 0 EZF = 0

JAE ouJNB

salto se acima de ou igual a OUsalto se não abaixo de

CF = 0

JB ouJNAE

salto se abaixo de OUsalto se não acima de ou igual a

CF = 1

JBE ouJNA

salto se abaixo de ou igual a OUsalto se não acima de

CF = 1 OUZF = 1

Saltos de Flag simplesJE ouJZ

salto se igual OUsalto se igual a zero

ZF = 1

JNE ouJNZ

salto se não igual OUsalto se não igual a zero

ZF = 0

JC salto se há VAI-UM (carry) CF = 1JNC salto se não há VAI-UM (not carry) CF = 0JO salto se há overflow OF = 1JNO salto se não há overflow OF = 0JS salto se o sinal é negativo SF = 1JNS salto se o sinal é não-negativo (+) SF = 0JP ou JPE salto se a paridade é PAR (even) PF = 1JNP ou JPO salto se a paridade é IMPAR (odd) PF = 0

Page 68: Curso Assembly

Cap6 – Instruções de controle de fluxo.

Página 5 de 12

6.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,BXJA 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,BXJG PT2 ;o salto ocorre porque 7FFFh (+) > 8000h (-)......

PT2: MOV ... ;continuação do programa

Exemplo: Supondo que AX e BX contenham números sinalizados, escrevaum trecho de programa que coloque o maior deles em CX.

...MOV CX,AX ;AX já é pressuposto ser o maior delesCMP AX,BXJNL ABAIXO ;poderia ser também JGE ABAIXOMOV CX,BX ;caso BX seja de fato o maior deles

ABAIXO: ... ;continuação do programa...

Page 69: Curso Assembly

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 decó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 dasinstruçõ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 CXJNZ ABAIXOJMP CONTINUA

ABAIXO: JMP TOPOCONTINUA: MOV ... ;programa continua

...

Page 70: Curso Assembly

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

Page 71: Curso Assembly

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 letrasmaiú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 formaa 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ígitohexadecimal, exiba na próxima linha o seu valor decimal e pergunte aousuário se deseja continuar a utilizar o programa: se for digitado S (sim), oprograma se repete desde o começo; se for digitado outro caracter, oprograma termina. Teste se o dígito hexa está na faixa de valores correta. Senã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 maisdo que três tentativas, o programa exibe uma mensagem adequada e termina.

5) Crie um programa que implemente uma multiplicação por meio de somassucessivas. Faça as considerações que achar necessárias.

6) Crie um programa que implemente uma divisão por meio de subtraçõessucessivas, exibindo o quociente e o resto com mensagens adequadas. Façaas considerações que achar necessárias.

Page 72: Curso Assembly

Cap6 – Instruções de controle de fluxo.

Página 9 de 12

ApêndiceAlgumas 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; exibaaquele que seja o primeiro em ordem alfabética.

Em linguagem de alto nível:

IF AL (menor ou igual a) BLTHEN (exibir AL)ELSE (exibir BL)

END_IF

Em linguagem montadora:....

;if AL menor ou igual a BLMOV AH,2hCMP AL,BLJA TROCA

;thenMOV DL,ALINT 21hJMP FIM

;elseTROCA: MOV DL, BL

INT 21h;end_if

FIM: .....

Page 73: Curso Assembly

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 vezesMOV CX,80dMOV AH,2hMOV DL,” * ”

;doTOPO: INT 21h

LOOP TOPO;end_for

...

Exercício: modifique o programa que exibe todos os caracteres ASCII (página1 deste capítulo), utilizando apenas a instrução LOOP.

Page 74: Curso Assembly

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é queo 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 contadorMOV AH,1hINT 21h ;lê o primeiro caracter em AL

;whileLOOP: CMP AL,0Dh ;é o caracter CR?

JE FIM ;salto quando caracter é igual a CRMOV (algum lugar), AL ;salvando o caracter lidoINC DX ;conta número de caracteresINT 21h ;lê o próximo caracter em ALJMP LOOP ;fecha o laço WHILE

;end_whileFIM:

Page 75: Curso Assembly

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é queo 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çãoMOV AH,1h

;repeatLOOP: INT 21h ;lê um caracter em AL

MOV (algum lugar),AL ;salvando o caracter lidoINC DX ;conta número de caracteresCMP 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.

Page 76: Curso Assembly

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) ounuma palavra (16 bits).

• Linguagens de alto nível (exceto C) não permitem manipular diretamentebits.

• 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 a0 0 0 0 0 0 10 1 0 1 1 1 01 0 0 1 11 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.

Page 77: Curso Assembly

Cap7 – Instruções lógicas, de deslocamento e de rotação

Página 2 de 22

7.1 Instruções lógicasAND destino,fonte OR destino,fonteXOR 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 destinoOperando fonte Registrador

de dadosPosição dememória

Reg. de dados sim simPosiçã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 é afetadoCF 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 e BX,;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

Page 78: Curso Assembly

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 BLAAh = 1010 1010b 0Ah = 0000 1010b

AL AL0Fh = 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 = 1bit(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 deoperações lógicas.

• AND pode ser utilizado para zerar (clear ou reset) bits específicos: bastater 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 naposiçã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.

Page 79: Curso Assembly

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 -> 7444h8001h -> 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" = 55d0Fh -> 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.

Page 80: Curso Assembly

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.

Page 81: Curso Assembly

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 BYTE181h = 1000 0001b 7Eh = 0111 1110b

Page 82: Curso Assembly

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 destinoOperando fonte Registrador

de dadosPosição dememória

Reg. de dados sim simPosiçã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 é afetadoCF 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

Page 83: Curso Assembly

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 AX4444h = 0100 0100 0100 0100b 0100 0100 0100 0100b

ZF ZF0 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 seo conteúdo de CL for negativo:

....TEST CL,80h ;80h é a máscara 1000 0000bJNZ PONTO2....(o programa prossegue, pois o número é positivo)....

PONTO2: ....(o programa opera aqui com o número negativo)....

Page 84: Curso Assembly

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 semalteraçã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 osrestantes inalterados;

e) Faça o complemento de 2 de BX sem utilizar a instrução NEG (talvezseja necessário um trecho de programa ao invés de uma únicaoperaçã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.

Page 85: Curso Assembly

Cap7 – Instruções lógicas, de deslocamento e de rotação

Página 10 de 22

7.3 Instruções de deslocamento:

Sxx destino, 1Sxx 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 SignificadoSHL Shift Left - deslocamento para a esquerdaSAL Shift Arithmetic Left - deslocamento aritmético para a esquerdaSHR Shift Right - deslocamento para a direitaSAR Shift Arithmetic Right - deslocamento aritmético para a direita

• Flags afetados:SF, ZF, PF refletem o resultado da última rotaçãoAF não é afetadoCF contem o último bit deslocado para foraOF = 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

Page 86: Curso Assembly

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)

Page 87: Curso Assembly

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,3SHL 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 = 1

Obs: pelo fato do número 9 ser impar, sua divisão por dois foi arredondadapara o inteiro imediatamente inferior.

trecho de programa:...MOV CL, 02SAR DH,CL...

Page 88: Curso Assembly

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, 1Rxx 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 SignificadoROL Rotate Left - rodar para a esquerdaROR Rotate Right - rodar para a direitaRCL Rotate Carry Left - rodar para a esquerda através do flag CFRCR Rotate Carry Right - rodar para a direita através do flag CF

• Flags afetados:SF, ZF, PF refletem o resultado da última rotaçãoAF não é afetadoCF contem o último bit deslocado para foraOF = 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

Page 89: Curso Assembly

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)

Page 90: Curso Assembly

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 zeroMOV 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 = 1INC 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 zeroMOV 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 CFLOOP TOPO ;enquanto CX não for zero, repete TOPOMOV AL,BL ;quando CX = 0, AL recebe o padrão...

Page 91: Curso Assembly

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 BXEntra um caracter "0" ou "1"WHILE caracter diferente de CR DO

Converte caracter para valor binárioDesloca BX 1 casa para a esquerdaInsere o valor binário lido no LSB de BXEntra novo caracter

END_WHILE

Trecho de programa implementado em Linguagem Montadora:...MOV CX,16 ;inicializa contador de dígitosMOV AH,1h ;função DOS para entrada pelo tecladoXOR BX,BX ;zera BX -> terá o resultadoINT 21h ;entra, caracter está no AL

;whileTOPO: CMP AL,0Dh ;é CR?

JE FIM ;se sim, termina o WHILEAND AL,0Fh ;se não, elimina 30h do caracter

;(poderia ser SUB AL,30h)SHL BX,1 ;abre espaço para o novo dígitoOR BL,AL ;insere o dígito no LSB de BLINT 21h ;entra novo caracterLOOP TOPO ;controla o máximo de 16 dígitos

;end_whileFIM: ...

Page 92: Curso Assembly

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 DOrotaçã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_IFEND_FOR

Trecho de programa implementado em Linguagem Montadora:

...MOV CX,16 ;inicializa contador de bitsMOV AH,02h ;prepara para exibir no monitor

;for 16 vezes doPT1: ROL BX,1 ;desloca BX 1 casa à esquerda

;if CF = 1JNC PT2 ;salta se CF = 0

;thenMOV DL, 31h ;como CF = 1INT 21h ;exibe na tela "1" = 31h

;elsePT2: MOV DL, 30h ;como CF = 0

INT 21h ;exibe na tela "0" = 30h;end_if

LOOP PT1 ;repete 16 vezes;end_for

...

Page 93: Curso Assembly

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 BXEntra um caracter hexaWHILE caracter diferente de CR DO

Converte caracter para binárioDesloca BX 4 casas para a esquerdaInsere valor binário nos 4 bits inferiores de BXEntra novo caracter

END_WHILE

Trecho de programa implementado em Linguagem Montadora:...XOR BX,BX ;inicializa BX com zeroMOV CL,4 ;inicializa contador com 4MOV AH,1h ;prepara entrada pelo tecladoINT 21h ;entra o primeiro caracter

;whileTOPO: CMP AL,0Dh ;é o CR ?

JE FIMCMP AL, 39h ;caracter número ou letra?JG LETRA ;caracter já está na faixa ASCIIAND AL,OFh ;número: retira 30h do ASCIIJMP DESLOC

LETRA: SUB AL,37h ;converte letra para binárioDESLOC: SHL BX,CL ;desloca BX 4 casas à esquerda

OR BL,AL ;insere valor nos bits 0 a 3 de BXINT 21h ;entra novo caracterJMP TOPO ;faz o laço até que haja CR

;end_whileFIM: ...

Page 94: Curso Assembly

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 DOMover BH para DLDeslocar DL 4 casas para a direitaIF DL < 10

THEN converte para caracter na faixa 0 a 9ELSE converte para caracter na faixa A a F

END_IFExibição do caracter no monitor de vídeoRodar BX 4 casas à esquerda

END_FOR

Page 95: Curso Assembly

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árioMOV CH,4 ;CH contador de caracteres hexaMOV CL,4 ;CL contador de delocamentosMOV AH,2h ;prepara exibição no monitor

;for 4 vezes doTOPO: MOV DL,BH ;captura em DL os oito bits mais

;significativos de BXSHR 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úmeroJAE LETRA

;thenADD DL,30h ;é número: soma-se 30hJMP PT1

;elseLETRA: ADD DL,37h ;ao valor soma-se 37h -> ASCII

;end_ifPT1: INT 21h ;exibe

ROL BX,CL ;roda BX 4 casas para a direitaDEC CHJNZ TOPO ;faz o FOR 4 vezes

;end_for... ;programa continua

Page 96: Curso Assembly

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 novoconteúdo de AL após cada uma das seguintes instruções, sempre com basenas condições iniciais acima:

a) SHL AL,1b) SHR AL,1c) ROL AL,CL ;CL contendo 2d) ROR AL,CL ;CL contendo 3e) SAR AL,CL ;CL contendo 2f) RCL AL,1g) 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 valorbinário deste código e numa segunda linha exiba outra mensagem queapresente 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 exibaoutra mensagem que apresente o valor hexadecinal correspondente ao códigoASCII. Repita este procedimento até que o usuário entre comum carriagereturn CR. Exemplo:

Digite um caracter: ZO codigo ASCII de Z em hexa vale: 5AhDigite um caracter: ...

4) Escreva um programa que peça ao usuário para entrar um númerohexadecimal de 4 dígitos ou menos, terminado com CR, e exiba na próximalinha do monitor o mesmo número expandido em binário. Na leitura, faça comque o apenas letras maiúsculas de A a F sejam aceitas. Se houver umcaracter ilegal, o programa deve emitir uma mensagem instruindo o usuário atentar novamente.

Page 97: Curso Assembly

Cap7 – Instruções lógicas, de deslocamento e de rotação

Página 22 de 22

5) Escreva um programa que peça ao usuário para entrar um número bináriode 16 dígitos ou menos, terminado com CR, e exiba na próxima linha domonitor o mesmo número compactado em hexadecimal. Se houver umcaracter ilegal durante a entrada do número binário, o programa deve emitiruma mensagem instruindo o usuário a tentar novamente.

6) Escreva um programa que peça ao usuário para entrar dois númerosbinários, cad um com 8 dígitos ou menos, terminado com CR, e exiba napróxima linha do monitor o valor binário da soma destes números. Se houverum caracter ilegal durante a entrada dos números binários, o programa deveemitir uma mensagem instruindo o usuário a tentar novamente. Considererepresentação não sinalizada para os números. Considere que o 9o. bit (vaium), se houver, estará em CF e poderá ser exibido, tal como no exemploabaixo:

Entre o primeiro número binário (até 8 bits): 11001010Entre o segundo número binário (até 8 bits): 10011100A soma binária vale: 101100110 -> resultado de 9 bits

7) Considerando o exemplo 2 da página 6.12, que divide o conteúdo de DHpor 4, suponha um número genérico sem sinal menor que 255 e escreva umtrecho de programa que faça a divisão 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

após a divisão por 4:quociente BH = 0000 0100= 4d

com resto BL = 0000 0010= 2d

Page 98: Curso Assembly

Cap8 – Pilha e subrotinas

Página 1 de 10

8. A pilha e subrotinas

8.1 Organização da Pilha (stack)

Stack:• estrutura de dados de uma dimensão organizada em algum trecho

(segmento) da Memória;• o primeiro item adicionado é o último a ser removido (first-in, last-out);• a posição da pilha mais recentemente acrescida é o topo da pilha.

Declaração do segmento de pilha:

.STACK 100h ;dimensiona o tamanho da pilha

SS -> aponta o início do segmento de pilha (base)SP -> aponta o topo da pilha (define o deslocamento do topo em

relação à base)

A pilha cresce do topo para baixo.

• Endereço para acesso à pilha: SS:SP (no. de segmento:offset)

• Movimentar dados para pilha: PUSH fonte,PUSHF

• Movimentar dados da pilha: POP destino,POPF

• As instruções de pilha não alteram os FLAGS

• Não é possível movimentar dados de 8 bits, nem valores imediatos

Page 99: Curso Assembly

Cap8 – Pilha e subrotinas

Página 2 de 10

8.2 Instruções para colocar dados na pilha:

PUSH fontePUSHF

onde fonte é:• um registrador de 16 bits• uma palavra de memória ou variável de 16 bits (de tipo DW)

A execução de PUSH resulta nas seguintes ações:• o registrador SP (stack pointer) é decrementado de 2• uma cópia do conteúdo da fonte é armazenado na pilha de forma que

- a posição SS:SP -> armazena o byte baixo da fonte- a posição SS:(SP + 1) -> armazena o byte alto

• o conteúdo da fonte não é alterado

A execução de PUSHF , que não possui operando, resulta:• o registrador SP (stack pointer) é decrementado de 2• uma cópia do conteúdo do registrador de FLAGS é armazenado na pilha

Exemplo de operação: ...PUSH AX ;instrução 1PUSHF ;instrução 2

Offset Antes Depois de 1 Depois de 2

0100h ? <- SP ? ?00FFh ? 12h 12h AX00FEh ? 34h <- SP 34h 1234h00FDh ? ? 56h00FCh ? ? 78h <- SP00FBh ? ? ? FLAGS00FAh ? ? ? 5678h00F9h ? ? ?

...(Base)

Page 100: Curso Assembly

Cap8 – Pilha e subrotinas

Página 3 de 10

8.3 Instruções para retirar dados na pilha:

POP destinoPOPF

onde destino é:• um registrador de 16 bits• uma palavra de memória ou variável de 16 bits (de tipo DW)

A execução de POP resulta nas seguintes ações:• o conteúdo das posições SS:SP (byte baixo) e SS:(SP + 1) (byte alto) é

movido para o destino• o registrador SP (stack pointer) é incrementado de 2

A execução de POPF , que não possui operando, resulta:• o conteúdo das posições 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 operação: ...POPF ;instrução 1POP AX ;instrução 2

Offset Antes Depois de 1 Depois de 2 AXantes

0100h ? ? ? <- SP F0D3h00FFh 12h 12h 12h depois00FEh 34h 34h <- SP 34h 1234h00FDh 56h 56h 56h00FCh 78h <- SP 78h 78h FLAGS00FBh ? ? ? antes00FAh ? ? ? 006Ah00F9h ? ? ? depois

... 5678h(Base)

Page 101: Curso Assembly

Cap8 – Pilha e subrotinas

Página 4 de 10

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> doINICIO: 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_whilePT1: MOV AH,2 ;prepara para exibir MOV DL,0DH ;<CR> INT 21h ;exibindo MOV DL,0AH ;<LF> INT 21h ;exibindo: mudança de linha JCXZ FIM ;saindo se nenhum caracter foi digitado;for contador vezes doTOPO: POP DX ;retira o primeiro caracter da pilha INT 21h ;exibindo este caracter LOOP TOPO ;em loop até CX = 0;end_forFIM: MOV AH,4CH ;preparando para sair para o DOS INT 21H END

Page 102: Curso Assembly

Cap8 – Pilha e subrotinas

Página 5 de 10

8.4 Terminologia para subrotinas (ou procedures)

Sintaxe para subrotinas:

nome PROC tipo;;corpo da subrotina - instruções;

RET ;transfere o controle de volta para a rotina principalnome ENDP

Obs: tipos possíveis NEAR -> subrotina no mesmo segmento de códigoFAR -> em outro segmento de código

Mecanismo de chamada e retorno:

PRINCIPAL PROC ... CALL SUB1;próxima instrução ... PRINCIPAL ENDP

SUB1 PROC;primeira instrução ... RETSUB1 ENDP

Comunicação de dados entre subrotinas:• em Linguagem Montadora, não há lista de parâmetros;• se há poucos valores de entrada e saída -> usar registradores

Page 103: Curso Assembly

Cap8 – Pilha e subrotinas

Página 6 de 10

8.5 Chamada e retorno de subrotinas

Instrução de chamada:

CALL nome

• IP, que contem o offset do endereço da próxima instrução da rotina"chamante" (após a instrução CALL), é armazenado na pilha;

• IP recebe o offset do endereço da primeira instrução da subrotinachamada.

Instrução de retorno:

RET

• faz com que o offset do endereço da próxima instrução da rotina"chamante", que está na pilha, seja recarregado em IP.

Ambos CALL e RET não afetam FLAGS.

Page 104: Curso Assembly

Cap8 – Pilha e subrotinas

Página 7 de 10

Mecanismo de chamada:

Offset Seg. de Código Antes DepoisMAIN PROC... IP IP... 1012h 1200hCALL SUB1

1012h ;próxima instrução Pilha PilhaSP -> ? ? 0100h

? 12h 00FFhSUB1 PROC ? SP-> 10h 00FEh

1200h ;primeira instrução ? ? 00FDh... ? ? 00FCh... ? ? 00FBh

1300h RET ? ? 00FAh

Mecanismo de retorno:

Offset Seg. de Código Antes DepoisMAIN PROC... IP IP... 1300h 1012hCALL SUB1

1012h ;próxima instrução Pilha Pilha? SP-> ? 0100h

12h 12h 00FFhSUB1 PROC SP -> 10h 10h 00FEh

1200h ;primeira instrução ? ? 00FDh... ? ? 00FCh... ? ? 00FBh

1300h RET ? ? 00FAh

Page 105: Curso Assembly

Cap8 – Pilha e subrotinas

Página 8 de 10

Um exemplo de subrotina:

TITLE MULTIPLICACAO POR SOMA E DESLOCAMENTO.MODEL SMALL.STACK 100h.CODEPRINCIPAL PROC

... ;supondo a entrada de dados CALL MULTIPLICA

... ;supondo a exibição do resultado MOV AH,4Ch INT 21hPRINCIPAL ENDPMULTIPLICA 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' imparTOPO: TEST BX,1 ;B e' impar?

JZ PT1 ;nao, B e' par (LSB = 0);then

ADD DX,AX ;sim, entao produto = produto + A;end_ifPT1: 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 chamadaMULTIPLICA ENDP END PRINCIPAL

Page 106: Curso Assembly

Cap8 – Pilha e subrotinas

Página 9 de 10

8.6 Atividades práticas.

1) Suponha que AX = 1234h, BX = 5679h, CX = 9ABCh e SP = 0100h. Dê oconteúdo de AX, BX, CX e SP após a execução do seguinte trecho deprograma: ...

PUSH AXPUSH BXXCHG AX,CXPOP CXPUSH AXPOP BX

2) Escreva algumas linhas de programa para:a) colocar o conteúdo do topo da pilha em AX, sem modificar oconteúdo e a posição 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 conteúdos das duas palavras do topo da pilha (a do topo ea logo abaixo desta - você poderá usar AX e BX como auxiliares).

3) O seguinte método pode ser usado para gerar números aleatórios na faixade 1 a 32767:

- inicie com qualquer número na faixa acima;- desloque uma casa binária à 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 usuário entrar um número binário earmazená-lo em AX (baseie-se no trecho para entrada binária dapágina 6.16);

Page 107: Curso Assembly

Cap8 – Pilha e subrotinas

Página 10 de 10

b) subrotina ALEATORIO que recebe um número em AX e retorna umnúmero aleatório também em AX, segundo o método acimaapresentado;

c) subrotina ESCREVA que exibe AX em binário no monitor (baseie-seno trecho de saída binária da página 6.17);

d) escreva uma rotina PRINCIPAL que emita uma mensagem aousuário para entrar com o número binário inicial de 16 bits, chame asubrotina LEIA para ler tal número, chame as subrotinas ALEATORIO eESCREVA para calcular e exibir 100 números aleatórios, que devemser apresentados na tela cada um com 16 bits seguidos, 4 por linha,cada grupo separado por 4 espaços em branco.

4) Converta os “trechos de programas” apresentados no capítulo 6 paraentrada e saída binária e hexadecimal em subrotinas. Faça as devidasconsiderações sobre onde estão os valores a serem passados do programaprincipal para cada subrotina, e vice-versa (este mecanismo é conhecidocomo passagem de parâmetros), produzindo os comentários necessárioslogo no inicio das mesmas. Observe que a partir desta questão, você terá seissubrotinas muito útes para entradas e saídas de números nas três basesnuméricas: binário, hexa e decimal. Não há necessidade de se reinventar aroda a todo o momento; a partir de agora, qualquer rotina muito comumpode ser posta no formato de subrotina e simplesmente chamada emqualquer programa.

5) Escreva uma subrotina para entrar caracteres letras (maiúsculas ouminúsculas) a pertir do teclado, verificando se pertencem às respectivas faixasde validade. Faça todas as considerações que julgar necessárias.

Page 108: Curso Assembly

Cap9 – Instruções de multiplicação e divisão

Página 1 de 13

9. Instruções de multiplicação e divisão

9.1 Instruções de multiplicação

MUL fonteIMUL fonte

· MUL (multiply) -> usada com números em representação não-sinalizada

· IMUL (integer multiply) -> usada com números sinalizados

· Multiplicação com números em formato byte:- registradores de 8 bits e variáveis de tipo DB- segundo operando é assumido em AL- resultado (destino) pode atingir 16 bits e se encontra em AX

· Multiplicação com números em formato word:- registradores de 16 bits e variáveis 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 números positivos (MSB = 0), MUL e IMUL dão o mesmo resultado.

· Flags afetados:

SF, ZF, AF, PF -> indefinidos

após MUL, CF/OF (ambos) = 0 , se a metade superior do resultado é 0= 1 , caso contrário

após IMUL, CF/OF (ambos) = 0 , se a metade superior do resultado forextensão do sinal da metade inferior

= 1 , caso contrário

Page 109: Curso Assembly

Cap9 – Instruções de multiplicação e divisão

Página 2 de 13

Exemplos de casos de multiplição:

1) Suponha que AX contenha 0001h BX contenha FFFFh:

antes: AX = 0001 h = 0000 0000 0000 0001b = 1 ou +1BX = FFFF h = 1111 1111 1111 1111b = 65535 ou -1

Instrução Resultadodecimal

Resultadohexadecimal

DX AX CF/OF

MUL BX 65535 0000 FFFF h 0000 h FFFF h 0IMUL BX -1 FFFF FFFF h FFFF h FFFF h 0

2) Suponha que AX contenha 0FFF h:

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

Instrução Resultadodecimal

Resultadohexadecimal

DX AX CF/OF

MUL AX 16769025 00FF E001 h 00FF h E001 h 1IMUL AX 16769025 00FF E001 h 00FF h E001 h 1

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

antes: AL = 80 h = 1000 0000 b = 128 ou -128BL = FF h = 1111 1111 b = 255 ou -1

Instrução Resultadodecimal

Resultadohexadecimal

AH AL CF/OF

MUL BL 32640 7F80 h 7F h 80 h 1IMUL BL 128 0080 h 00 h 80 h 1

Page 110: Curso Assembly

Cap9 – Instruções de multiplicação e divisão

Página 3 de 13

9.2 Instruções de divisão

DIV fonteIDIV fonte

· DIV (divide) -> usada com números em representação não-sinalizada

· IDIV (integer divide) -> usada com números sinalizados

· fonte deve ser considerado como divisor (não pode ser uma constante)

Divisão com números em formato byte:- o divisor é assumido ser de 8 bits (1 byte)- o dividendo é assumido estar em AX (16 bits)- após a execução: o quociente de 8 bits estará em AL

o resto de 8 bits estará em AH

Divisão com números 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 (high word)AX -> 16 bits menos significativos do dividendo (low word)

- após a execução: o quociente de 16 bits estará em AXo resto de 16 bits estará em DX

· Para números positivos (MSB = 0), DIV e IDIV fornecem o mesmoresultado.

· Flags afetados: todos ficam indefinidos

· Em divisão de números em representação sinalizada, o resto possui omesmo sinal do dividendo.

Page 111: Curso Assembly

Cap9 – Instruções de multiplicação e divisão

Página 4 de 13

Exemplos de casos de divisão:

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

antes: DX : AX = 0000 0005 h = 5 ou + 5BX = FFFE h = 65534 ou - 2

Instrução Quocientedecimal

Resto decimal AX DX

DIV BX 0 5 0000 h 0005 hIDIV BX -2 1 FFFE h 0001 h

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

antes: AX = 0005 h = 5 ou + 5BL = FF h = 256 ou - 1

Instrução Quocientedecimal

Resto decimal AL AH

DIV BL 0 5 00 h 05 hIDIV BL - 5 0 FB h 00 h

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

antes: AX = 00FB h = 251 ou + 251BL = FF h = 256 ou - 1

Instrução Quocientedecimal

Resto decimal AL AH

DIV BL 0 251 00 h FB hIDIV BL -251 * - - -

(*) como -251 não cabe em AL (8 bits) -> ocorre DIVIDE OVERFLOWsituação de erro catastrófico que faz com que o programa termine.

Page 112: Curso Assembly

Cap9 – Instruções de multiplicação e divisão

Página 5 de 13

9.3 Extensão do sinal do dividendo

a) Em operações em formato word:

Caso o dividendo de uma divisão (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 extensão de sinal de AX

CWD

· instrução sem operandos (zero operandos) que converte word paradoubleword e estende o sinal de AX para DX;

· deve ser usada com IDIV

b) Em operações em formato byte:

Caso o dividendo de uma divisão (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 extensão de sinal de AL

CBW

· instrução sem operandos (zero operandos) que converte byte para word eestende o sinal de AL para AH;

· deve ser usada com IDIV

Page 113: Curso Assembly

Cap9 – Instruções de multiplicação e divisão

Página 6 de 13

Exemplos de divisões com ajuste de extensão:

1) Crie um trecho de programa que divida -1250 por 7.

...MOV AX, -1250 ;AX recebe o dividendoCWD ;estende o sinal de AX para DXMOV BX,7 ;BX recebe o divisorIDIV BX ;executa a divisão

;após a execução, AX recebe o;quociente e DX recebe o resto

...

2) Crie um trecho de programa que divida a variável sinalizadaXBYTE por -7.

...MOV AL,XBYTE ;AL recebe o dividendoCBW ;estende o sinal (eventual) de

;AL para AHMOV BL, -7 ;BL recebe o divisorIDIV BL ;executa a divisão

;após a execução, AL recebe o;quociente e AH recebe o resto

...

Obs: Não há efeito de CBW e CWD sobre os FLAGS.

Page 114: Curso Assembly

Cap9 – Instruções de multiplicação e divisão

Página 7 de 13

9.4 E/S de números decimais

· Entrada de números decimais:

- string de caracteres números 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 básico em linguagem de alto nível:

total = 0negativo = FALSOler um caracterCASE caracter OF

‘ - ‘ : negativo = VERDADEIRO e ler um caracter‘ + ‘ : ler um caracter

END_CASEREPEAT

converter caracter em valor bináriototal = 10 x total + valor binárioler 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 múltiplo, quetesta simultaneamente os vários "casos": se algum deles for verdadeiro,executa as instruções relacionadas; se todos os "casos" forem falsos, nãoexecuta nada e vai para o fim do CASE.

Page 115: Curso Assembly

Cap9 – Instruções de multiplicação e divisão

Página 8 de 13

Subrotina de entrada de números 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 BXPUSH CXPUSH DX ;salvando registradores que serão usadosXOR BX,BX ;BX acumula o total, valor inicial 0XOR CX,CX ;CX indicador de sinal (negativo = 1), inicial = 0

;entrada de número: mensagem adequada já exibida para o usuário anteriormenteMOV AH,1hINT 21h ;le caracter no ALCMP AL, ‘-’ ;sinal negativo?JE MENOSCMP AL,’+’ ;sinal positivo?JE MAISJMP NUM ;se nao é sinal, então vá processar o caracter

MENOS: MOV CX,1 ;negativo = verdadeiroMAIS: INT 21h ;le um outro caracterNUM: AND AX,000Fh ;junta AH a AL, converte caracter para binário

PUSH AX ;salva AX (valor binário) na pilhaMOV AX,10 ;prepara constante 10MUL BX ;AX = 10 x total, total está em BXPOP BX ;retira da pilha o valor salvo, vai para BXADD BX,AX ;total = total x 10 + valor binárioMOV AH,1hINT 21h ;le um caracterCMP AL,0Dh ;é o CR ?JNE NUM ;se não, vai processar outro dígito em NUMMOV AX,BX ;se é CR, então coloca o total calculado em AXCMP CX,1 ;o numero é negativo?JNE SAIDA ;nãoNEG AX ;sim, faz-se seu complemento de 2

SAIDA: POP DXPOP CXPOP BX ;restaura os conteúdos originaisRET ;retorna a rotina que chamou

ENTDEC ENDP

Page 116: Curso Assembly

Cap9 – Instruções de multiplicação e divisão

Página 9 de 13

· Saída de números decimais:

- AX é assumido como registrador de armazenamento;- valores decimais na faixa de - 32768 a + 32767;- exibe sinal negativo, se o conteúdo de AX for negativo;- string de caracteres números de 0 a 9, exibidos no monitor de vídeo.

Algoritmo básico em linguagem de alto nível:

IF AX < 0THEN exibe um sinal de menos

substitui-se AX pelo seu complemento de 2END_IFcontador = 0REPEAT

dividir quociente por 10colocar o resto na pilhacontador = contador + 1

UNTIL quociente = 0FOR contador vezes DO

retirar um resto (número) da pilhaconverter para caracter ASCIIexibir o caracter no monitor

END_FOR

Idéia básica da técnica de decomposição decimal do número em AX:Pilha

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

Page 117: Curso Assembly

Cap9 – Instruções de multiplicação e divisão

Página 10 de 13

Subrotina de saída de números decimais em Linguagem Montadora:

SAIDEC PROC;exibe o conteudo de AX como decimal inteiro com sinal;variaveis de entrada: AX -> valor binario equivalente do número decimal;variaveis de saida: nehuma (exibição de dígitos direto no monitor de video)

PUSH AX PUSH BX

PUSH CX PUSH DX ;salva na pilha os registradores usados OR AX,AX ;prepara comparação de sinal JGE PT1 ;se AX maior ou igual a 0, vai para PT1 PUSH AX ;como AX menor que 0, salva o número na pilha MOV DL,' - ' ;prepara o caracter ' - ' para sair MOV AH,2h ;prepara exibição INT 21h ;exibe ' - ' POP AX ;recupera o número NEG AX ;troca o sinal de AX (AX = - AX);obtendo dígitos decimais e salvando-os temporariamente na pilhaPT1: XOR CX,CX ;inicializa CX como contador de dígitos MOV BX,10 ;BX possui o divisorPT2: XOR DX,DX ;inicializa o byte alto do dividendo em 0; o restante éAX DIV BX ;após a execução, AX = quociente; DX = resto PUSH DX ;salva o primeiro dígito decimal na pilha (1o. resto) INC CX ;contador = contador + 1 OR AX,AX ;quociente = 0 ? (teste de parada) JNE PT2 ;não, continuamos a repetir o laço;exibindo os dígitos decimais (restos) no monitor, na ordem inversa MOV AH,2h ;sim, termina o processo, prepara exibição dos restosPT3: POP DX ;recupera dígito da pilha colocando-o em DL (DH = 0) ADD DL,30h ;converte valor binário do dígito para caracter ASCII INT 21h ;exibe caracter LOOP PT3 ;realiza o loop ate que CX = 0 POP DX ;restaura o conteúdo dos registros POP CX POP BX POP AX ;restaura os conteúdos dos registradores RET ;retorna à rotina que chamouSAIDEC ENDP

Page 118: Curso Assembly

Cap9 – Instruções de multiplicação e divisão

Página 11 de 13

Exemplo de um programa utilizando ENTDEC e SAIDEC

TITLE PROGRAMA DE E/S DECIMAL.MODEL SMALL.STACK 100h.DATAMSG1 DB 'Entre um numero decimal na faixa de -32768 a 32767:$'MSG2 DB 0Dh, 0Ah, 'Confirmando a entrada efetuada, voce digitou:$'.CODEPRINCIPAL PROC

MOV AX,@DATAMOV DS,AXMOV AH,9hLEA DX,MSG1INT 21h

;entrada do númeroCALL ENTDEC ;chama subrotina ENTDECPUSH AX ;salva temporariamente o número na pilha

;exibindo a segunda mensagemMOV AH,9hLEA DX,MSG2INT 21h ;exibe a segunda mensagem

;exibindo o número lidoPOP AX ;recupera o número na pilhaCALL SAIDEC ;chama subrotina SAIDEC

;saida para o DOSMOV AH,4ChINT 21h

PRNCIPAL ENDPINCLUDE: C:\<diretorio_de_trabalho>\ENTDEC.ASMINCLUDE: C:\<diretorio_de_trabalho>\SAIDEC.ASM

END PRINCIPAL

Page 119: Curso Assembly

Cap9 – Instruções de multiplicação e divisão

Página 12 de 13

9.5 Atividades práticas.

1) Dê os conteúdos de DX, AX e CF/OF após a execução de cada uma dasseguintes instruções (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 conteúdos de AX e CF/OF após a execução de cada uma dasseguintes instruções (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 conteúdos de AX e DX após a execução de cada uma das seguintesinstruções (dividendo de 32 bits, divisor de 16 bits, resultando em quociente eresto 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 conteúdos de AL e AH após a execução de cada uma das seguintesinstruções (dividendo de 16 bits, divisor de 8 bits, resultando em quociente eresto 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 após a execução de:a) CWD ;se AX = 8ABCh

b) CBW ;se AL = 5Fh

Page 120: Curso Assembly

Cap9 – Instruções de multiplicação e divisão

Página 13 de 13

6) Modifique a subrotina ENTDEC para que a mesma verifique se o dígitodecimal que entra pelo teclado está na faixa de 0 a 9, e se o número finalproduziu ou não overflow.

Dica: No algoritmo apresentado, pode ocorrer overflow em dois momentos:- quando AX = 10 x total- quando total = 10 x total + valor binário

7) Escreva um programa que leia uma quantidade de tempo, expressa emsegundos, menor ou igual a 65535, e apresente esta quantidade em horas,minutos e segundos (formato HH:MM:SS). Apresente mensagens adequadase utilize as subrotinas ENTDEC e SAIDEC para realizar a entrada e saída dedígitos decimais (será necessário adaptá-las).

8) Escreva uma subrotina que calcule Xn, enésima potência de X, onde asvariáveis X e n estão respectivamente em AX e BX. O resultado é passado devolta para a rotina que chamou em dois registradores: DX (16 bits maissignificativos) e AX (16 bits menos significativos). Inclua um teste de overflowcaso o resultado não caiba em 32 bits.

9) Escreva um programa completo que peça ao usuário, mediante mensagensadequadas, para entrar um número X, entrar um expoente n e apresentar aenésima potência de X. Utilize a subrotina desenvolvida no exercício 8 para ocálculo de Xn. Utilize as subrotinas ENTDEC e SAIDEC para E/S de númerosdecimais. Apresente uma mensagem adequada em caso de overflow.