Você está na página 1de 35

Cap3.

3. Introduo linguagem montadora do 8086

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

Declaraes (statements): instrues, que so convertidas em cdigo de mquina diretivas, que instruem o montador a realizar alguma tarefa especfica: - alocar espao de memria para variveis - criar uma sub-rotina (procedure ou procedimento)

Formato de uma declarao (linha de programa): [Nome] [Cod. oper.] [Operando(s)] [;Comentrio]

Exemplo: INICIO: MOV CX,5h ;inicializar contador

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

Cap3.2

O campo Nome:

Pode ser um rtulo de instruo, um nome de sub-rotina, um nome de varivel, contendo de 1 a 31 caracteres, iniciando por uma letra e contendo somente letras, nmeros e os caracteres ? . @ _ : $ % .

Obs: o Montador traduz os nomes por endereos de memria.

Exemplos:

nomes vlidos LOOP1: .TEST @caracter SOMA_TOTAL4 $100

nomes invlidos DOIS BITS 2abc A42.25 #33

Campo de cdigo de operao:

Contem o cdigo de operao simblico (mnemnico) No caso de diretivas, contem o cdigo de pseudo-instruo Exemplos: instrues MOV ADD INC JMP diretivas .MODEL .STACK nome PROC

Cap3.3

Campo de operandos:

Instrues podem conter 0, 1 ou 2 operandos no 8086.

Exemplos: NOP INC AX ADD A,2d ;sem operandos: instrui para fazer nada ;um operando: soma 1 ao contedo de AX ;dois operandos: soma 2 ao contedo da palavra ;de memria A

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

No caso de diretivas, o campo de operandos contem mais informaes acerca da diretiva.

Cap3.4

Campo de comentrio:

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

Uma boa prtica de programao comentar tudo e incluir a informao acerca da idia por trs da codificao (o algortmo).

Exemplos: MOV CX,0 ;movimenta 0 para CX (bvio!) MOV CX,0 ;CX conta no. de caracteres, inicialmente vale 0 ; ; (linhas em branco: separao) ; ;inicializao dos registradores (linha inteira de comentrio)

Cap3.5

3.2 Formato de dados, variveis e constantes Nmeros: Exemplos: - binrio: - decimal: 1110101b ou 1110101B

64223 ou 64223d ou 64223D 1110101 considerado decimal (ausncia do B) -2184D (nmero negativo) 64223h ou 64223H 0FFFFh comea com um decimal e termina com h 1B4Dh

- hexa:

Exemplos de nmeros ilegais: 1,234 FFFFh 1B4D Caracteres ASCII: Caracteres isolados ou strings de caracteres devem estar escritos dentro de aspas simples ( ) ou duplas ( ). Exemplos: A ou A ola, como vai EXEMPLO caracter estranho (vrgula) no comea por nmero de 0 a 9 difcil distinguir do nome de uma varivel no termina com h ou H

Cap3.6

Variveis:

Varivel um nome simblico para um dado atualizvel pelo programa. cada varivel possui um tipo e recebe um endereo de memria; usa-se pseudo-instrues para definir o tipo da varivel; o Montador atribui o endereo de memria.

Pseudoinstruo DB DW DD DQ DT

Entende-se por define byte (8 bits) define word (16 bits, 2 bytes consecutivos) define doubleword (2 palavras, 4 bytes consecutivos) define quadword (4 palavras, 8 bytes consecutivos) define ten bytes (10 bytes consecutivos)

- Definio de variveis de tipo byte: Nome DB valor_ inicial

Exemplos: Alfa A B BIT DB DB DB DB 0 10h 0150h ? ;equivale a 00h ;ilegal, por que? ;no inicializada

Cap3.7

- Definio de variveis de tipo word: Nome DW valor_inicial

Exemplos: WORD1 CONTA C WORD1 DW DW DW DW 0h 0150h ? 1234h ;equivale a 0000h ;OK!, por que? ;no inicializada ;byte baixo 34h, endereo WORD1 ;byte alto 12h endereo WORD1+1

- Array: sequncia de bytes ou words consecutivos na memria armazenar dados relacionados armazenar caracteres ASCII organizados (ex: texto)

Exemplos: BYTE_ARRAY DB WORD_ARRAY DW 10h,20h,30h 1000h,123h,0h,0FFFFh

Um array pode conter um string de caracteres, sendo definido como: LETRAS DB LETRAS DB abC 61h,62h,43h ;e equivalente aos caracteres ASCII ;depende se maiscula ou minscula

Cap3.8

- Combinao de caracteres e nmeros numa mesma definio:

MENSAGEM

DB

Alo!, 0Ah,0Dh,$

O caracter '$' marca o fim de um string de caracteres e no exibido.

Constantes:

Constante um nome simblico para um dado de valor constante, que seja muito utilizado num programa. Para atribuir um nome a uma constante, utiliza-se a pseudo-instruo EQU (equates -> igual a) e a sintaxe: Nome EQU valor_da_constante

Exemplos: LF CR LINHA1 MENSAGEM EQU EQU EQU DB 0Ah ;caracter Line Feed como LF 0Dh ;caracter Carriage return como CR Digite seu nome completo LINHA1,LF,CR

Obs: Constantes no geram cdigo de mquina.

Cap3.9

3.3 A estrutura do programa - algumas instrues iniciais

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

Operando fonte Reg. de dados Reg. de segmento Posio de memria Constante

Posio de memria sim sim no sim

Exemplos de instrues vlidas: MOV AX,WORD1 ;movimenta o contedo da posio de memria WORD1 ;para o registrador AX ;transfere o caracter ASCII A para AH ;idem anterior: 41h corresponde ao caracter A ;move o contedo do byte baixo de BX ;o byte alto de AX ;transfere uma cpia do contedo de CS para AX

MOV AH,A MOV AH,41h MOV AH,BL

MOV AX,CS

Cap3.10

Graficamente: suponha a instruo MOV AX,WORD1

Antes AX 0006h WORD1 8FFFh

Depois AX 8FFFh WORD1 8FFFh

Obs: para a instruo MOV no permitido operar de posio de memria para posio de memria diretamente, por motivos tcnicos do 8086.

Por exemplo: MOV WORD1,WORD2 ;instruo invlida ;esta restrio contornada como segue ; ; ; ;primeiro o contedo de WORD2 vai para AX ;depois, o contedo de AX movido para a ;posio de memria WORD1

MOV AX,WORD2 MOV WORD1,AX

Cap3.11

XCHG destino,fonte

Usada para trocar dados (nos dois sentidos) entre: registrador e registrador registrador e uma posio de memria no permitido trocas diretas entre posies de memria Combinaes legais de operandos: Operando destino Registrador Posio de de dados memria sim sim no no sim no

Operando fonte Reg. de dados Reg. de segmento Posio de memria Exemplos de instrues vlidas: XCHG AX,WORD1

;troca o contedo da posio de memria WORD1 ;com o do registrador AX ;troca o contedo do byte baixo de BX com o ;do byte alto de AX

XCHG AH,BL

Graficamente: suponha a instruo XCHG AH,BL Antes AH 14h BH C2h AL FFh BL E0h AH E0h BH C2h Depois AL FFh BL 14h

Cap3.12

ADD destino,fonte SUB destino,fonte

Usadas para adicionar (ou subtrair) dados entre: registrador e registrador registrador e uma posio de memria adicionar (ou subtrair) um nmero diretamente a (de) um registrador ou posio de memria

Combinaes legais de operandos: Operando destino Registrador Posio de de dados memria sim sim sim no sim sim

Operando fonte Reg. de dados Posio de memria Constante

Exemplos de instrues vlidas: ADD AX,BX ADD BX,AX ADD AX,WORD1 ;soma o contedo de BX com AX, resultado em AX ;soma o contedo de AX com BX, resultado em BX ;soma o contedo da posio de memria WORD1 ;ao do registrador AX, resultado em AX ;subtrai o contedo do registrador AX do contedo da ;posio de memria WORD2, resultado em WORD2 ;subtrai a quantidade 5 decimal do contedo de BL

SUB WORD2,AX

SUB BL,5

Cap3.13

Graficamente: suponha a instruo ADD AX,DX

Antes AX 0006h DX 0003h

Depois AX 0009h DX 0003h

Obs 1: ADD BYTE1,BYTE2

MOV AL,BYTE2 ADD BYTE1,AL

;instruo invlida ;esta restrio contornada como segue ; ; ; ;primeiro o contedo de BYTE2 vai para AL ;depois, o contedo de AL somado ao da ;posio de memria BYTE1, resultado final ;em BYTE1

Obs 2: o resultado de SUB, se for negativo, estar armazenado no registrador destino em complemento de 2.

Cap3.14

INC destino DEC destino

Usadas para adicionar 1 (incrementar) ou subtrair 1 (decrementar) ao/do contedo de: um registrador uma posio de memria

Exemplos: INC CX INC WORD1 DEC BYTE2 DEC CL ;incrementa o contedo de CX ;incrementa o contedo da posio de memria WORD1 ;decrementa o contedo da posio de memria BYTE2 ;decrementa o contedo de CL (byte baixo de CX)

Graficamente: suponha a instruo INC BYTE1

Antes BYTE1 06h

Depois BYTE1 07h

Cap3.15

NEG destino

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

Exemplos: NEG BX NEG WORD1 ;gera o complemento de 2 do contedo de BX ;idem, no contedo da posio de memria WORD1

Graficamente: suponha a instruo NEG BX

Antes BX 0002h

Depois BX FFFEh

Cap3.16

Traduo de expresses matemticas em Linguagem de Alto Nvel para Linguagem Montadora

Exemplo1: traduo:

B=A MOV AX,A MOV B,AX

(equivalente a B recebe A) ;transfere o contedo da posio de memria ;A para AX e ;transfere AX para a posio de memria B

Exemplo 2: traduo

A=5-A NEG A ADD A,5 ;gera o complemento de 2 da posio de ;memria A e ;realiza (-A) + 5, que equivale a 5 - A

Exemplo 3: traduo

A = B - 2A MOV AX,B SUB AX,A SUB AX,A MOV A,AX ;AX contem a varivel B ;AX contem B - A ;AX contem B - 2A ;movimenta o resultado para A

Cap3.17

A estrutura de um programa em Linguagem Montadora

Modelos de memria O tamanho que os segmentos de cdigo e de dados devem ter especificado pelo modelo de memria por meio da diretiva .MODEL.

Sintaxe:

.MODEL modelo_de_memria

Modelo SMALL

Descrio

Cdigo em 1 segmento; Dados em 1 segmento MEDIUM Cdigo em mais de 1 segmento; Dados em 1 segmento COMPACT Cdigo em 1 segmento; Dados em mais de 1 segmento LARGE Cdigo em mais de 1 segmento; Dados em mais de 1 segmento; Nenhum array maior que 64 Kbytes HUGE Cdigo em mais de 1 segmento; Dados em mais de 1 segmento; Arrays maiores que 64 Kbytes Obs:

Ao menos que haja muitas linhas de programa (muito cdigo) ou muitos dados, o modelo apropriado o SMALL. A diretiva .MODEL deve vir antes de qualquer definio de segmento.

Cap3.18

Segmento de dados - Contem a definio e declarao das variveis. - Pode-se tambm fazer a atribuio de smbolos para constantes.

Sintaxe: Exemplo:

.DATA

.DATA WORD1 BYTE1 MENSAGEM LF

DW DB DB EQU

A8h 5 Isto e uma mensagem 0Ah

Segmento de pilha (stack segment) - Reserva um bloco de posies de memria consecutivas para armazenar a pilha - Deve ter espao suficiente para suportar a pilha no seu mximo tamanho

Sintaxe: Exemplo: .STACK 100h

.STACK

tamanho

;reserva 100h bytes para a rea de pilha, um ;tamanho razovel para a maioria das aplicaes

Cap3.19

Segmento de cdigo - Contem propriamente as instrues do programa - Dentro do segmento de cdigo, as instrues so organizadas em procedures ou procedimentos.

Sintaxe: Exemplo:

.CODE

.CODE nome PROC ; ;corpo da procedure -> instrues ; nome ENDP ; ;outras procedures seguem abaixo, se existirem

onde:

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

Cap3.20

Exemplo de uma estrutura de programa assembly completa:

TITLE nome_do_programa .MODEL SMALL .STACK 100h .DATA ; ;definio dos dados: variveis e constantes ; .CODE EXEMPLO PROC ; ;seqncia de instrues ; EXEMPLO ENDP ; ;segue outras procedures ; END EXEMPLO

Obs: na primeira linha tem-se a diretiva TITLE seguida do nome do programa; na ltima linha tem-se a diretiva END, seguida do nome da procedure principal; se no houver definio de procedure, usa-se apenas END.

Cap3.21

3.4 Instrues de entrada e sada

IN e OUT -> instrues Assembly para acessar portas de E/S para perifricos No so utilizadas na maioria das aplicaes: (1) os endereos das portas de E/S variam conforme o modelo do PC (2) mais fcil utilizar o BIOS ou o DOS para funes de E/S Para acessar as rotinas de E/S do BIOS ou DOS utiliza-se a instruo:

INT nmero_de_interrupo

Obs: o programa em curso interrompido, passando o controle para o DOS, que realiza a operao de E/S e retorna o controle para o programa. Exemplo: INT 21h ;acessa um grande nmero de funes de E/S do DOS

Algumas funes DOS de E/S: Funo 1h: Entrada de um caracter simples pelo teclado Acesso: AH = 1h Resultado: AL = cdigo ASCII do caracter digitado no teclado

Funo 2h: Exibio de caracter simples no monitor de vdeo Acesso: AH = 2h DL = cdigo ASCII do caracter a exibir

Cap3.22

Resultado: exibio na tela do monitor

Cap3.23

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

MOV

AH,1h

INT

21h

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

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

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

MOV MOV INT

AH,2h DL,? 21h

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

Obs: tambm se pode exibir caracteres ASCII de controle: Cdigo ASCII 07h 08h 09h 0Ah 0Dh Smbolo BEL BS HT LF CR Funo Bell (som de bip) Back Space (espao para trs) Tab (tabulao) Line Feed (mover para uma nova linha) Carriage Return (ir para o inicio da linha)

Cap3.24

3.5 Criando e rodando um programa

Especificao do programa ECO DO TECLADO NA TELA: - ler um caracter do teclado - exibir o caracter lido na prxima linha da tela do monitor - retornar ao DOS Escrevendo as partes: a) O programa estimula o usurio a interagir apresentando um ?: MOV AH,2 MOV DL,'?' INT 21H ;funcao DOS para exibir caracter ;caracter '?' ;exibir

b) Lendo o caracter teclado pelo usurio e salvando-o em num registrador: MOV AH,1 INT 21H MOV BL,AL ;funcao DOS para leitura de caracter ;caracter e' lido em AL ;salvando-o em BL

c) Movendo o cursor da tela para o incio da prxima linha: MOV AH,2 MOV DL,0DH INT 21H MOV DL,0AH INT 21H ;funcao DOS para exibir caracter ;caracter ASCII <CR> - return ;executando ;caracter ASCII <LF> - line feed ;executando

d) Recuperando o caracter lido e exibindo-o: MOV DL,BL INT 21H ;recuperando o caracter salvo ;exibir

Cap3.25

O programa ECO completo:

TITLE PGM4_1: 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 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

Cap3.26

Cap3.27

Como obter o programa ECO.EXE executvel.

1. Edite o program ECO utilizando um editor de texto simples, com sada em texto ASCII. Sugesto: use o EDIT do DOS. O arquivo (texto ASCII) deve ter a extenso . ASM

C:\ > EDIT ECO.ASM <enter>

2. Rode o programa Montador TASM (Borland). Como resultado, aparece em seu diretrio de trabalho um arquivo ECO.OBJ

C:\ > TASM ECO. ASM <enter>

3. Rode o programa Lincador TLINK. Como resultado, aparece em seu diretrio de trabalho um arquivo ECO.EXE.

C:\ > TLINK ECO.OBJ <enter>

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

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

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

Cap3.28

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

Cap3.29

Mais funes DOS de E/S:

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

Resultado: sada para o DOS

Funo 9h: Exibio de string de caracteres no monitor de vdeo Acesso: AH = 9h DX = offset do endereo onde comea o string

Resultado: string exibido

Obs: o string de caracteres deve terminar com o caracter $, que marca o fim da sequncia e no exibido.

Para exibio de um string de caracteres h dois problemas:

a) DS inicialmente no est apontando para o segmento de dados do programa recm iniciado (DS ainda aponta para algum segmento de dados do DOS);

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

Cap3.30

Como apontar DS para o segmento de dados do programa?

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

AX,@DATA DS,AX

;coloca o nmero do segmento de dados em AX ;pois DS no pode receber @DATA diretamente

Obs: o programa Montador traduz o nome @DATA pelo nmero de segmento onde se encontram os dados definidos pela diretiva .DATA.

Como colocar em DX o offset do endereo de um string a exibir?

LEA destino,fonte Significa Load Effective Address -> coloca uma cpia do offset do endereo da posio de memria fonte no registrador destino. Exemplo: .DATA MENSAGEM DB Adoro ISB!$ ... .CODE LEA DX,MENSAGEM ;DX carregado com o offset de MENSAGEM

Cap3.31

Obs: aps esta operao, DX conter o offset da posio de memria onde inicia o string MENSAGEM Programa para imprimir um string de caracteres:

TITLE PROGRAMA PARA IMPRESSAO DE 'STRING' .MODEL SMALL .STACK 100H .DATA MENSAGEM DB 'ALO! Como voces estao indo!$' .CODE MAIN PROC ; ;inicializando o registrador DS ; MOV AX,@DATA MOV DS,AX ;segmento de dados inicializado ; ;obtendo o offset da posio de memria de MENSAGEM ; LEA DX,MENSAGEM ;offset do endereo vai para DX ; ;exibindo a MENSAGEM ; MOV AH,9 ;funcao DOS para exibir 'string' INT 21H ;exibindo ; ;retorno ao DOS ; MOV AH,4CH ;funcao DOS para saida INT 21H ;saindo MAIN ENDP END MAIN

Cap3.32

Exerccio: Programa de converso de letra minscula para maiscula.

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

Sugesto 1: Caracteres ASCII Carriage Return e Line Feed como variveis. CR LF EQU EQU 0DH 0AH

Sugesto 2: Como exibir um string de caracteres juntamente com uma varivel? MENSAGEM2 CHAR DB DB CR,LF,'Em maiuscula ela fica: ' ?,'$'

Obs: quando for exibida a MENSAGEM2, INT 21h continua ativa pois no h o caracter $, permitindo que a varivel CHAR seja exibida em seguida.

Cap3.33

Cap3.34

Uma possvel soluo: TITLE PROGRAMA PARA CONVERSAO DE LETRA MINUSC./MAIUSC. .MODEL SMALL .STACK 100H .DATA CR EQU 0DH LF EQU 0AH MENSAGEM1 DB 'Entre com uma letra minuscula: $' MENSAGEM2 DB CR,LF,'Em maiuscula ela fica: ' CHAR DB ?,'$' .CODE MAIN PROC ;inicializando o registrador DS MOV AX,@DATA MOV DS,AX ;DS inicializado ;exibindo a MENSAGEM1 LEA DX,MENSAGEM1 ;offset do endereco de MENSAGEM1 em DX MOV AH,9 ;funcao DOS para exibir 'string' INT 21H ;exibindo ;entrada do caracter e conversao para maiuscula MOV AH,1 ;funcao DOS para leitura de caracter INT 21H ;entrada SUB AL,20H ;conversao ASCII de minuscula/maiuscula MOV CHAR,AL ;salvando caracter na variavel CHAR ;exibindo a MENSAGEM2 e o caracter convertido LEA DX,MENSAGEM2 ;offset do endereco de MENSAGEM1 em DX MOV AH,9 ;funcao DOS para exibir 'string' INT 21H ;exibindo ;retorno ao DOS MOV AH,4CH ;funcao DOS para saida INT 21H ;saindo MAIN ENDP END MAIN

Cap3.35

Exerccios sugeridos:

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

2) Escreva um programa para (a) questionar o usurio sobre suas iniciais (trs por exemplo), (b) ler as iniciais e (c) exibi-las de cima para baixo, em linhas separadas e na margem esquerda da tela.

3) Escreva um programa para ler um dgito hexadecimal de A a F (maisculo) e exibi-lo em decimal na prxima linha. Utilize mensagens convenientes. Sugesto: Entre um digito hexa: C O seu valor decimal vale: 12 <- em negrito, a resposta mensagem

4) Escreva um programa que leia trs iniciais, exiba-as de forma centrada dentro de uma moldura de asteriscos de 11 x 5 (horizontal x vertical) e por fim produza um bip no computador. Sugesto: declare a moldura de asteriscos e as iniciais como um string.

Obs: adapte os programas 2 e 4 para ler 2, 4, 5 ou mais iniciais em funo de seu nome.