Beruflich Dokumente
Kultur Dokumente
T U T O R I A L
---------------
D E
---
L I N G U A G E M
-----------------
A S S E M B L Y
---------------
Contedo:
1.Introduo
2.Conceitos Bsicos
3.Programao Assembly
4.Instrues Assembly
5.Interrupes e gerncia de arquivos
6.Macros e procedimentos
7.Exemplos de programas
8.Bibliografia
*****************************************************************************
CAPTULO 1: INTRODUO
Contedo:
1.1.O que h de novo neste material
1.2.Apresentao
1.3.Por que aprender Assembly?
1.4.Ns precisamos da sua opinio
--------------- // --------------1.1.O que h de novo neste material:
Aps um ano da realizao da primeira verso do tutorial, e atravs das
Opinies recebidas por e-mail, resolvemos ter por disposio todos estes
comentrios e sugestes. Esperamos que atravs deste novo material Assembly,
as pessoas que se mostrarem interessadas possam aprender mais sobre o seu
IBM PC. Esta nova edio do tutorial inclui:
Uma seo completa sobre como usar o programa debug.
Mais exemplos de programas.
Um motor de pesquisa, para qualquer tpico ou item relacionado a esta
nova verso.
Considervel reorganizao e reviso do material Assembly.
Em cada seo, h um link para o Dicionrio On-line de Computao de
Dennis Howe.
1.2.Apresentao:
Este tutorial destina-se aquelas pessoas que nunca tiveram contato com a
Linguagem Assembly.
O tutorial est completamente focado em computadores com processadores 80x86
da famlia Intel, e considerando que a base da linguagem o funcionamento
dos recursos internos do processador, os exemplos descritos no so
compatveis com qualquer outra arquitetura.
*****************************************************************************
CAPTULO 2: CONCEITOS BSICOS
Contedo:
2.1.Descrio bsica de um sistema computacional.
2.2.Conceitos bsicos da Linguagem Assembly
2.3.Usando o programa debug
--------------- // --------------Esta seo tem o propsito de fazer um breve comentrio a respeito dos
principais componentes de um sistema computacional, o que ir permitir ao
usurio uma melhor compreenso dos conceitos propostos no decorrer do
tutorial.
Sistema Computacional.
Chamamos de Sistema Computacional a completa configurao de um computador,
incluindo os perifricos e o sistema operacional.
2.1.1.Processador Central.
tambm conhecido por CPU ou Unidade Central de Processamento, que por sua
vez composta pela unidade de controle e unidade de lgica e aritmtica.
Sua funo consiste na leitura e escrita do contedo das clulas de memria,
regular o trfego de dados entre as clulas de memria e registradores
especiais, e decodificar e executar as instrues de um programa.
O processador tem uma srie de clulas de memria usadas com freqncia e,
dessa forma, so partes da CPU. Estas clulas so conhecidas com o nome de
registradores. Um processador de um PC possui cerca de 14 registradores.
Como os PCs tem sofrido evoluo veremos que podemos manipular registradores
de 16 ou 32 bits.
A unidade de lgica e aritmtica da CPU realiza as operaes relacionadas ao
clculo simblico e numrico. Tipicamente estas unidades apenas so capazes
de realizar operaes elementares, tais como: adio e subtrao de dois
nmeros inteiros, multiplicao e diviso de nmero inteiro, manuseio de
bits de registradores e comparao do contedo de dois registradores.
Computadores pessoais podem ser classificados pelo que conhecido como
tamanho da palavra, isto , a quantidade de bits que o processador capaz
de manusear de uma s vez.
2.1.2.Memria Principal.
um grupo de clulas, agora sendo fabricada com semicondutores, usada para
processamentos gerais, tais como a execuo de programas e o armazenamento
de informaes para operaes.
Cada uma das clulas pode conter um valor numrico e capaz de ser
endereada, isto , pode ser identificada de forma singular em relao as
outras clulas pelo uso de um nmero ou endereo.
O nome genrico destas memrias Random Access Memory ou RAM. A principal
desvantagem deste tipo de memria o fato de que seus circuitos integrados
perdem a informao que armazenavam quando a energia eltrica for
interrompida, ou seja, ela voltil. Este foi o motivo que levou a criao
de um outro tipo de memria cuja informao no perdida quando o sistema
desligado. Estas memrias receberam o nome de Read Only Memory ou ROM.
2.1.3.Unidades de Entrada e Sada.
Para que o computador possa ser til para ns se faz necessrio que o
processador se comunique com o exterior atravs de interfaces que permitem a
entrada e a sada de informao entre ele e a memria. Atravs do uso destas
comunicaes possvel introduzir informao a ser processada e mais tarde
visualizar os dados processados.
Algumas das mais comuns unidades de entrada so o teclado e o mouse. As mais
comuns unidades de sada so a tela do monitor e a impressora.
2.1.4.Unidades de Memria Auxiliar.
Considerando o alto custo da memria principal e tambm o tamanho das
Decimal:
1*2^0
=
16
= 19 decimal.
2.2.2.1.Cdigo ASCII
ASCII significa American Standard Code for Information Interchange. Este
cdigo contm as letras do alfabeto, dgitos decimais de 0 a 9 e alguns
smbolos adicionais como um nmero binrio de 7 bits, tendo o oitavo bit em
0, ou seja, desligado.
Deste modo, cada letra, dgito ou caracter especial ocupa 1 byte na memria
do computador.
Podemos observar que este mtodo de representao de dados muito
ineficiente no aspecto numrico, uma vez que no formato binrio 1 byte no
suficiente para representar nmeros de 0 a 255, com o ASCII podemos
representar apenas um dgito.
Devido a esta ineficincia, o cdigo ASCII usado, principalmente, para a
representao de textos.
2.2.2.2.Mtodo BCD
BCD significa Binary Coded Decimal.
Neste mtodo grupos de 4 bits so usados para representar cada dgito
decimal de 0 a 9. Com este mtodo podemos representar 2 dgitos por byte de
informao.
Vemos que este mtodo vem a ser muito mais prtico para representao
numrica do que o cdigo ASCII. Embora ainda menos prtico do que o binrio,
com o mtodo BCD podemos representar dgitos de 0 a 99. Com o binrio, vemos
que o alcance maior, de 0 a 255.
Este formato (BCD) principalmente usado na representao de nmeros
grandes, aplicaes comerciais, devido as suas facilidades de operao.
2.2.2.3.Representao de ponto flutuante
Esta representao baseada em notao cientfica, isto , representar um
nmero em 2 partes: sua base e seu expoente.
2.3.3.Programa Debug.
Para a criao de um programa em assembly existem 2 opes: usar o TASM Turbo Assembler da Borland, ou o DEBUGGER. Nesta primeira seo vamos usar o
debug, uma vez que podemos encontr-lo em qualquer PC com o MS-DOS.
Debug pode apenas criar arquivos com a extenso .COM, e por causa das
caractersticas deste tipo de programa, eles no podem exceder os 64 Kb, e
tambm devem iniciar no endereo de memria 0100H dentro do segmento
especfico. importante observar isso, pois deste modo os programas .COM
no so relocveis.
Os principais comandos do programa debug so:
A
D
E
G
N
P
Q
R
T
U
W
Aqui "add" o comando a ser executado, neste caso uma adio, e "ah" bem
como "bh" so os parmetros.
Por exemplo:
mov al, 25
No exemplo acima, estamos usando a instruo mov, que significa mover o
valor 25 para o registrador al.
O nome das instrues nesta linguagem constitudo de 2, 3 ou 4 letras.
Estas instrues so chamadas mnemnicos ou cdigos de operao,
representando a funo que o processador executar.
s vezes instrues aparecem assim:
add al,[170] <- Ponteiro
Os colchetes no segundo parmetro indica-nos que vamos trabalhar com o
contedo da clula de memria de nmero 170, ou seja, com o valor contido no
endereo 170 da memria e no com o valor 170, isto conhecido como
"endereamento direto".
0D62:0108 nop
0D62:0109
Entramos com o comando "t" para executar passo a passo as instrues:
-t
AX=0002 BX=0000
DS=0D62 ES=0D62
0D62:0103 BB0400
Vemos o valor 0002 no registrador AX. Teclamos "t" para executar a segunda
instruo:
-t
AX=0002 BX=0004
DS=0D62 ES=0D62
0D62:0106 01D8
CX=0000 DX=0000
SS=0D62 CS=0D62
NOP
SP=FFEE
IP=0108
mov
mov
add
int
ax,0002
bx,0004
ax,bx
20
Para obter o tamanho de um programa, o comando "h" usado, j que ele nos
mostra a adio e subtrao de dois nmeros em hexadecimal. Para obter o
tamanho do programa em questo, damos como parmetro o valor do endereo
final do nosso programa (10A), e o endereo inicial (100). O primeiro
resultado mostra-nos a soma dos endereos, o segundo, a subtrao.
-h 10a 100
020a 000a
C:\>tasm exam1.asm
Turbo Assembler Version 2.0
Assembling file:
exam1.asm
Error messages:
None
Warning messages: None
Passes:
1
Remaining memory: 471k
O TASM s pode criar programas no formato .OBJ, que ainda no pode ser
executado...
Quarto passo
Usar o programa TLINK para criar o programa executvel.
Exemplo:
C:\>tlink exam1.obj
Turbo Link Version 3.0 Copyright (c) 1987, 1990 Borland International
C:\>
Onde exam1.obj o nome do programa intermedirio, .OBJ. O comando acima
gera diretamente o arquivo com o nome do programa intermedirio e a extenso
.EXE. opcional a colocao da extenso .obj no comando.
Quinto passo
Executar o programa executvel criado.
C:\>exam1[enter]
Lembre-se, este programa assembly muda o tamanho do cursor no DOS.
--------------- // --------------3.2.Processo Assembly.
3.2.1.Segmentos
3.2.2.Tabela de equivalncia
3.2.1.SEGMENTOS
A arquitetura dos processadores x86 fora-nos a usar segmentos de memria
para gerenciar a informao, o tamanho destes segmentos de 64Kb.
A razo de ser destes segmentos que, considerando que o tamanho mximo de
um nmero que o processador pode gerenciar dado por uma palavra de 16 bits
ou registrador, assim no seria possvel ter acesso a mais do que 65536
locais da memria usando apenas um destes registradores. Mas agora, se a
memria do PC dividida em grupos de segmentos, cada um com 65536 locais, e
podemos usar um endereo ou registrador exclusivo para encontrar cada
segmento, e ainda fazemos cada endereo de um especfico slot com dois
registradores, nos possvel ter acesso quantidade de 4294967296 bytes de
memria, que , atualmente, a maior memria que podemos instalar num PC.
Desta forma, para que o montador seja capaz de gerenciar os dados, se faz
necessrio que cada informao ou instruo se encontre na rea
correspondente ao seu segmento. O endereo do segmento fornecido ao
montador pelos registradores DS, ES, SS e CS. Lembrando um programa no
Debug, observe:
1CB0:0102 MOV AX,BX
O primeiro nmero 1CB0, corresponde ao segmento de memria que est sendo
usado, o segundo uma referncia ao endereo dentro do segmento, um
deslocamento dentro do segmento offset.
O modo usado para indicar ao montador com quais segmentos vamos trabalhar
fazendo uso das diretivas .CODE, .DATA e .STACK.
O montador ajusta o tamanho dos segmentos tomando como base o nmero de
bytes que cada instruo assembly precisa, j que seria um desperdcio de
memria usar segmentos inteiros. Por exemplo, se um programa precisa de
apenas 10Kb para armazenar dados, o segmento de dados seria apenas de 10Kb e
no de 64Kb, como poderia acontecer se feito manualmente.
3.2.2.TABELAS DE EQUIVALNCIA
Cada uma das partes numa linha de cdigo assembly conhecida como token,
por exemplo:
MOV AX,Var
Aqui temos trs tokens, a instruo MOV, o operador AX e o operador VAR. O
que o montador faz para gerar o cdigo OBJ ler cada um dos tokens e
procurar a equivalncia em cdigo de mquina em tabelas correspondentes,
seja de palavras reservadas, tabela de cdigos de operao, tabela de
smbolos, tabela de literais, onde o significado dos mnemnicos e os
endereos dos smbolos que usamos sero encontrados.
A maioria dos montadores so de duas passagens. Em sntese na primeira
passagem temos a definio dos smbolos, ou seja, so associados endereos a
todas as instrues do programa. Seguindo este processo, o assembler l MOV
e procura-o na tabela de cdigos de operao para encontrar seu equivalente
na linguagem de mquina. Da mesma forma ele l AX e encontra-o na tabela
correspondente como sendo um registrador. O processo para Var um pouco
diferenciado, o montador verifica que ela no uma palavra reservada, ento
procura na tabela de smbolos, l encontrando-a ele designa o endereo
correspondente, mas se no encontrou ele a insere na tabela para que ela
possa receber um endereo na segunda passagem. Ainda na primeira passagem
executado parte do processamento das diretivas, importante notar que as
diretivas no criam cdigo objeto. Na passagem dois so montadas as
instrues, traduzindo os cdigos de operao e procurando os endereos, e
gerado o cdigo objeto.
H smbolos que o montador no consegue encontrar, uma vez que podem ser
declaraes externas. Neste caso o linker entra em ao para criar a
estrutura necessria a fim de ligar as diversas possveis partes de cdigo,
dizendo ao loader que o segmento e o token em questo so definidos quando o
programa carregado e antes de ser executado.
--------------- // --------------3.3.Mais programas.
Outro exemplo
Primeiro passo
Use qualquer editor e crie o seguinte:
;exemplo2
.model small
.stack
.code
mov ah,2h ;move o valor 2h para o registrador ah
mov dl,2ah ;move o valor 2ah para o registrador dl
;( o valor ASCII do caractere *)
int 21h
;interrupo 21h
mov ah,4ch ;funo 4ch, sai para o sistema operacional
int 21h
;interrupo 21h
end
;finaliza o programa
Segundo passo
Salvar o arquivo com o nome: exam2.asm
No esquecer de salvar em formato ASCII.
Terceiro passo
Usar o programa TASM para construir o programa objeto.
C:\>tasm exam2.asm
Turbo Assembler Version 2.0
Assembling file:
Error messages:
Warning messages:
Passes:
Remaining memory:
exam2.asm
None
None
1
471k
Quarto passo
Usar o programa TLINK para criar o programa executvel.
C:\>tlink exam2.obj
Turbo Link Version 3.0 Copyright (c) 1987, 1990 Borland International
C:\>
Quinto passo
Executar o programa:
C:\>exam2[enter]
*
C:\>
Este programa imprime o caracter * na tela.
--------------- // --------------3.4.Tipos de instrues.
3.4.1.Movimento de dados
3.4.2.Operaes lgicas e aritmticas
3.4.3.Saltos, laos e procedimentos
3.4.1.MOVIMENTO DE DADOS
Em qualquer programa h necessidade de se mover dados na memria e em
registradores da CPU; h vrios modos de se faz-lo: pode-se copiar os dados
da memria para algum registrador, de registrador para registrador, de um
registrador para a pilha, da pilha para um registrador, transmitir dados
para um dispositivo externo e vice-versa.
Este movimento de dados sujeito a regras e restries, entre elas:
*No possvel mover dados de um local da memria para outro diretamente;
necessrio primeiro mover o dado do local de origem para um registrador e
ento do registrador para o local de destino.
*No possvel mover uma constante diretamente para um registrador de
segmento; primeiro deve-se mover para um registrador.
possvel mover blocos de dados atravs de instrues movs, que copia uma
cadeia de bytes ou palavras; movsb copia n bytes de um local para outro; e
movsw copia n palavras. A ltima das duas instrues toma os valores dos
endereos definidos por DS:SI como o grupo de dados a mover e ES:DI como a
nova localizao dos dados.
*****************************************************************************
CAPTULO 4: INSTRUES ASSEMBLY
Contedo:
4.1.Instrues de operao de dados
4.2.Instrues lgicas e aritmticas
4.3.Instrues de controle de processos
--------------- // --------------4.1. Instrues de operao de dados
4.1.1.Instrues de transferncia
4.1.2.Instrues de carga
4.1.3.Instrues de pilha
4.1.1.Instrues de transferncia.
So usadas para mover o contedo dos operadores. Cada instruo pode ser
usada com diferentes modos de endereamento.
MOV
MOVS (MOVSB) (MOVSW)
INSTRUO MOV
Propsito: Transferncia de dados entre clulas de memria, registradores e
o acumulador.
Sintaxe:
MOV Destino, Fonte
Destino o lugar para onde o dado ser
est.
memria.
acumulador.
registrador de segmento.
memria/registrador.
registrador.
registrador.
memria.
registrador.
memria.
Fonte:
Fonte:
Fonte:
Fonte:
Fonte:
Fonte:
Fonte:
Fonte:
Fonte:
acumulador
memria
memria/registrador
registrador de segmento
registrador
memria
registrador
dado imediato
dado imediato
Exemplo:
MOV
MOV
MOV
INT
AX,0006h
BX,AX
AX,4C00h
21h
Este pequeno programa move o valor 0006h para o registrador AX, ento ele
move o contedo de AX (0006h) para o registrador BX, e finalmente move o
valor 4C00h para o registrador AX para terminar a execuo com a opo 4C da
interrupo 21h.
INSTRUO LAHF
Propsito: Transferir o contedo dos flags para o registrador AH.
Sintaxe:
LAHF
Esta instruo til para verificar o estado dos flags durante a execuo
do nosso programa.
Os flags so deixados na seguinte ordem dentro do registrador:
SF ZF ?? AF ?? PF ?? CF
O "??" significa que haver um valor indefinido naqueles bits.
INSTRUO LDS
Propsito: Carregar o registrador de segmento de dados.
Sintaxe:
LDS destino, fonte
O operador fonte deve ser uma double word na memria. A palavra associada
com o maior endereo transferida para DS, em outras palavras isto tomado
como o endereo de segmento. A palavra associada com o menor endereo o
endereo de deslocamento e depositada no registrador indicado como
destino.
INSTRUO LEA
Propsito: Carregar o endereo do operador fonte.
Sintaxe:
LEA destino, fonte
O operador fonte deve estar localizado na memria, e seu deslocamento
colocado no registrador de ndice ou ponteiro especificado no destino.
Para ilustrar uma das facilidades que temos com este comando, vejamos:
MOV SI,OFFSET VAR1
equivalente a:
LEA SI,VAR1
muito provvel que para o programador muito mais fcil criar programas
grandes usando este ltimo formato.
INSTRUO LES
Propsito: Carregar o registrador de segmento extra
Sintaxe:
LES destino, fonte
O operador fonte deve ser uma palavra dupla na memria. O contedo da
palavra com endereo maior interpretado como o endereo do segmento e
colocado em ES. A palavra com endereo menor o endereo do deslocamento e
colocada no registrador especificado no parmetro de destino.
FLAG
0
2
4
6
7
8
9
10
11
CF
PF
AF
ZF
SF
TF
IF
DF
OF
4.2.2.Instrues aritmticas.
INSTRUO MUL
Propsito: Multiplicao com sinal.
Sintaxe:
MUL fonte
Esta instruo realiza uma multiplicao no sinalizada entre o contedo do
acumulador AL ou AX pelo operando-fonte, devolvendo o resultado no
acumulador AX caso a operao tenha envolvido AL com um operando de 8 bits,
ou em DX e AX caso a operao tenha envolvido AX e um operando de 16 bits.
INSTRUO IMUL
Propsito: Multiplicao de dois nmeros inteiros com sinal.
Sintaxe:
IMUL fonte
Esta instruo faz o mesmo que a anterior, difere apenas pela incluso do
sinal.
Os resultados so mantidos nos mesmos registradores usados pela instruo
MUL.
INSTRUO SBB
Propsito: Subtrao com carry.
Sintaxe:
SBB destino, fonte
Esta instruo subtrai os operadores e subtrai um do resultado se CF est
ativado. O operador fonte sempre subtrado do destino.
Este tipo de subtrao usado quando se trabalha com quantidades de 32
bits.
INSTRUO SUB
Propsito: Subtrao.
Sintaxe:
SUB destino, fonte
Esta instruo subtrai o operador fonte do destino.
--------------- // --------------4.3.Instrues de controle de processos
4.3.1.Instrues de salto
4.3.2.Instrues de laos: loop
4.3.3.Instrues de contagem
4.3.4.Instrues de comparao
4.3.5.Instrues de flag
4.3.1.Instrues de salto.
Usadas para transferir o processo de execuo do programa para o operador
indicado.
JMP
JA (JNBE)
JAE (JNBE)
JB (JNAE)
JBE (JNA)
JE (JZ)
JNE (JNZ)
JG (JNLE)
JGE (JNL)
JL (JNGE)
JLE (JNG)
JC
JNC
JNO
JNP (JPO)
JNS
JO
JP (JPE)
JS
INSTRUO JMP
Propsito: Salto incondicional.
Sintaxe:
JMP destino
Esta instruo usada para desviar o curso do programa sem tomar em conta
as condies atuais dos flags ou dos dados.
INSTRUO JA (JNBE)
Propsito: Salto condicional.
Sintaxe:
JA smbolo
Aps uma comparao este comando salta se no igual.
Isto quer dizer que o salto s feito se o flag CF ou o flag ZF esto
desativados, ou seja, se um dos dois for zero.
INSTRUO JAE (JNB)
Propsito: Salto condicional.
Sintaxe:
JAE smbolo
A instruo salta se est UP, se est EQUAL ou se est NOT DOWN.
O salto feito se CF est desativado.
INSTRUO JB (JNAE)
Propsito: Salto condicional.
Sintaxe:
JB smbolo
A instruo salta se est DOWN, se est NOT UP ou se est EQUAL.
O salto feito se CF est ativado.
INSTRUO JBE (JNA)
Propsito: Salto condicional.
Sintaxe:
JBE smbolo
A instruo salta se est DOWN, se est EQUAL ou se est NOT UP.
O salto feito se CF ou ZF esto ativados, ou seja, se um deles for 1.
INSTRUO JE (JZ)
Propsito: Salto condicional.
Sintaxe:
JE smbolo
A instruo salta se est equal ou se est zero.
O salto feito se ZF est ativado.
INSTRUO JNE (JNZ)
Propsito: Salto condicional.
Sintaxe:
JNE smbolo
A instruo salta se est not equal ou se est zero.
O salto feito se ZF est desativado.
INSTRUO JG (JNLE)
Propsito: Salto condicional, e o sinal tomado.
Sintaxe:
JG smbolo
A instruo salta se est larger, se est not larger ou se est equal.
O salto ocorre se ZF = 0 ou se OF = SF.
INSTRUO JGE (JNL)
Propsito: Salto condicional, e o sinal tomado.
Sintaxe:
JGE smbolo
A instruo salta se est larger, se est less than ou se est equal.
O salto feito se SF = OF.
INSTRUO JL (JNGE)
Propsito: Salto condicional, e o sinal tomado.
Sintaxe:
JL smbolo
A instruo salta se est less than, se est not larger than ou se est
equal.
O salto feito se SF diferente de OF.
INSTRUO JLE (JNG)
Propsito: Salto condicional, e o sinal tomado.
Sintaxe:
JLE smbolo
A instruo salta se est less than, se est equal ou se est not larger.
O salto feito se ZF = 1 ou se SF diferente de OF.
INSTRUO JC
Propsito: Salto condicional, e os flags so tomados.
Sintaxe:
JC smbolo
A instruo salta se h carry.
O salto feito se CF = 1.
INSTRUO JNC
Propsito: Salto condicional, e o estado dos flags tomado.
Sintaxe:
JNC smbolo
A instruo salta se no h carry.
O salto feito se CF = 0.
INSTRUO JNO
Propsito: Salto condicional, e o estado dos flags tomado.
Sintaxe:
JNO smbolo
A instruo salta se no h overflow
O salto feito se OF = 0.
INSTRUO JNP (JPO)
Propsito: Salto condicional, e o estado dos flags tomado.
Sintaxe:
JNP smbolo
A instruo salta se no h paridade ou se a paridade mpar.
O salto feito se PF = 0.
INSTRUO JNS
Propsito: Salto condicional, e o estado dos flags tomado.
Sintaxe:
JNP smbolo
A instruo salta se o sinal est desativado.
O salto feito se SF = 0.
INSTRUO JO
Propsito: Salto condicional, e o estado dos flags tomado.
Sintaxe:
JO smbolo
A instruo salta se h overflow.
O salto feito se OF = 1.
INSTRUO JP (JPE)
Propsito: Salto condicional, e o estado dos flags tomado.
Sintaxe:
JP smbolo
A instruo salta se h paridade ou se a paridade par.
O salto feito se PF = 1.
INSTRUO JS
Propsito: Salto condicional, e o estado dos flags tomado.
Sintaxe:
JS smbolo
A instruo salta se o sinal est ativado.
O salto feito se SF =1.
--------------- // --------------4.3.2.Instrues para laos: LOOP.
Estas instrues transferem a execuo do processo, condicional ou
incondicionalmente, para um destino, repetindo a ao at o contador ser
zero.
LOOP
LOOPE
LOOPNE
INSTRUO LOOP
Propsito: Gerar um lao no programa.
Sintaxe:
LOOP smbolo
A instruo LOOP decrementa CX de 1 e transfere a execuo do programa para
o smbolo que dado como operador, caso CX ainda no seja 1.
INSTRUO LOOPE
Propsito: Gerar um lao no programa, considerando o estado de ZF.
Sintaxe:
LOOPE smbolo
Esta instruo decrementa CX de 1. Se CX diferente de zero e ZF igual a
1, ento a execuo do programa transferida para o smbolo indicado como
operador.
INSTRUO LOOPNE
Propsito: Gerar um lao no programa, considerando o estado de ZF.
Sintaxe:
LOOPNE smbolo
Esta instruo decrementa CX de 1 e transfere a execuo do programa apenas
se ZF diferente de 0.
--------------- // ---------------
4.3.3.Instrues contadoras.
Estas instrues so usadas para decrementar ou incrementar o contedo de
contadores.
DEC
INC
DEC INSTRUCTION
Propsito: Decrementar o operador.
Sintaxe:
DEC destino
Esta instruo subtrai 1 do operador destino e armazena o novo valor no
mesmo operador.
INSTRUO INC
Propsito: Incrementar o operador.
Sintaxe:
INC destino
Esta instruo adiciona 1 ao operador destino e mantm o resultado no mesmo
operador.
--------------- // --------------4.3.4.Instrues de comparao.
Estas instrues so usadas para comparar os operadores, e elas afetam o
contedo dos flags.
CMP
CMPS (CMPSB) (CMPSW)
INSTRUO CMP
Propsito: Comparar os operadores.
Sintaxe:
CMP destino, fonte
Esta instruo subtrai o operador fonte do destino, mas no armazena o
resultado da operao, apenas afeta o estado dos flags.
INSTRUO CMPS (CMPSB) (CMPSW)
Propsito: Comparar cadeias de um byte ou uma palavra.
Sintaxe:
CMP destino, fonte
Esta instruo
endereado por
endereado por
flags, mas sem
INSTRUO STC
Propsito: Ativar o flag de carry.
Sintaxe:
STC
Esta instruo ajusta para 1 o flag CF.
INSTRUO STD
Propsito: Ativar o flag de endereo.
Sintaxe:
STD
Esta instruo ajusta para 1 o flag DF.
INSTRUO STI
Propsito: Ativar o flag de interrupo.
Sintaxe:
STI
Esta instruo ativa o flag IF, e habilita interrupes externas mascarveis
(que s funcionam quando IF = 1).
*****************************************************************************
CAPTULO 5: INTERRUPES E GERNCIA DE ARQUIVOS
Contedo:
5.1.Interrupes
5.2.Gerenciamento de arquivos
--------------- // --------------5.1.Interrupes
5.1.1.Interrupes
5.1.2.Interrupes
5.1.3.Interrupes
5.1.4.Interrupes
de hardware interno
de hardware externo
de software
mais comuns
Abertura de arquivo
Leitura seqencial
Escrita seqencial
Criao de arquivo
Leitura randmica
Escrita randmica
Handles
3CH
3DH
3EH
3FH
40H
42H
Criao de arquivo
Abertura de arquivo
Fechamento de arquivo
Leitura de arquivo/dispositivo
Escrita de arquivo/dispositivo
Move ponteiro de leitura/escrita num arquivo
FUNO 02H
Uso:
Mostra um caracter na tela.
Registradores de chamada:
AH = 02H
DL = Valor de caracter a ser mostrado.
Registradores de retorno:
Nenhum.
FUNO 01H
Uso:
Ler um caracter do teclado e mostr-lo.
Registradores de chamada
AH = 01H
Registradores de retorno:
AL = Caracter lido
muito fcil ler um caracter do teclado com esta funo, o cdigo
hexadecimal do caracter lido armazenado no registrador AL. Nos caso de
teclas especiais, como as de funo F1, F2, alm de outras, o registrador AL
conter o valor 1, sendo necessrio chamar a funo novamente para obter o
cdigo daquele caracter.
FUNO 0AH
Uso:
Ler caracteres do teclado e armazen-los num buffer.
Registradores de chamada:
AH = 0AH
DS:DX = Endereo inicial da rea de armazenamento
BYTE 0 = Quantidade de bytes na rea
BYTE 1 = Quantidade de bytes lidos
do BYTE 2 at BYTE 0 + 2 = caracteres lidos
Registradores de retorno:
Nenhum.
Os caracteres so lidos e armazenados num espao de memria que foi
definido. A estrutura deste espao indica que o primeiro byte representar a
quantidade mxima de caracteres que pode ser lida. O segundo, a quantidade
de caracteres lidos e, no terceiro byte, o inicio onde eles so armazenados.
Quando se atinge a quantidade mxima permitida, ouve-se o som do speaker e
qualquer caracter adicional ignorado. Para finalizar a entrada, basta
digitar [ENTER].
FUNO 3FH
Uso:
Ler informao de um dispositivo ou de um arquivo.
Registradores de chamada:
AH = 3FH
BX = Nmero do handle
CX = Nmero de bytes a ler
DS:DX = rea para receber o dado
Registradores de retorno:
CF = 0 se no h erro e AX = nmero de bytes lidos.
CF = 1 se h erro e AX conter o cdigo de erro.
FUNO 0FH
Uso:
Abrir um arquivo FCB.
Registradores de chamada:
AH = 0FH
DS:DX = Ponteiro para um FCB
Registradores de retorno:
AL = 00H se no h problemas, de outra forma retorna 0FFH
FUNO 14H
Uso:
Leitura seqencial num arquivo FCB.
Registradores de chamada:
AH = 14H
DS:DX = Ponteiro para um FCB j aberto.
Registradores de retorno:
AL = 0 se no h erros, de outra forma o cdigo correspondente de erro
retornar:
1 erro no fim do arquivo, 2 erro na estrutura FCB e 3 erro de leitura
parcial.
O que esta funo faz ler o prximo bloco de informaes do endereo dado
por DS:DX, e atualizar este registro.
FUNO 15H
Uso:
Escrita seqencial e arquivo FCB.
Registradores de chamada:
AH = 15H
DS:DX = Ponteiro para um FCB j aberto.
Registradores de retorno:
AL = 00H se no h erros, de outra forma conter o cdigo de erro: 1 disco
cheio ou arquivo somente de leitura, 2 erro na formao ou na especificao
do FCB.
A funo 15H atualiza o FCB aps a escrita do registro para o presente
bloco.
FUNO 16H
Uso:
Criar um arquivo FCB. Registradores de chamada:
AH = 16H
DS:DX = Ponteiro para um FCB j aberto.
Registradores de retorno:
AL = 00H se no h erros, de outra forma conter o valor 0FFH.
baseada na informao advinda de um FCB para criar um arquivo num disco.
FUNO 21H
Uso:
Ler de modo randmico um arquivo FCB.
Registradores de chamada:
AH = 21H
DS:DX = Ponteiro para FCB aberto.
Registradores de retorno:
A = 00H se no h erro, de outra forma AH conter o cdigo de erro:
1 se o fim do arquivo, 2 se h um erro de especificao no FCB e 3 se um
registro foi lido parcialmente ou o ponteiro de arquivo est no fim do mesmo.
Esta funo l o registro especificado pelos campos do bloco atual e
registro de um FCB aberto e coloca a informao na DTA, rea de Transferncia
do Disco.
FUNO 22H
Uso:
Escrita randmica num arquivo FCB.
Registradores de chamada:
AH = 22H
DS:DX = Ponteiro para um FCB aberto.
Registradores de retorno:
AL = 00H se no h erro, de outra forma conter o cdigo de erro:
1 se o disco est cheio ou o arquivo apenas de leitura e 2 se h um erro na
especificao FCB.
Escreve o registro especificado pelos campos do bloco atual e registro de um
FCB aberto. Esta informao do contedo da DTA.
FUNO 3CH
Uso:
Criar um arquivo se no existe ou deix-lo com comprimento 0 se existe.
Registradores de chamada:
AH = 3CH
CH = Atributo do arquivo
DS:DX = Nome do arquivo, no formato ASCII.
Registradores de retorno:
CF = 0 e AX informa o nmero do handle se no h erro. Se caso houver erro,
CF ser 1 e AX conter o cdigo de erro: 3 caminho no encontrado, 4 no h
handles disponveis e 5 acesso negado.
Esta funo substitui a funo 16H. O nome do arquivo especificado numa
cadeia ASCII de bytes terminados pelo caracter 0.
O arquivo criado conter os atributos definidos no registrador CX, do
seguinte modo:
Valor
00H
Atributos
Normal
02H
04H
06H
Hidden
System
Hidden e System
.
.
.
.
.
.
.
x
0
0
0
.
0
0
1
.
0
1
0
.
.
.
.
.
.
.
.
.
Apenas leitura
Apenas escrita
Leitura/Escrita
RESERVADO
FUNO 3EH
Uso:
Fecha um arquivo (handle).
Registradores de chamada:
AH = 3EH
BX = Nmero do handle associado
Registradores de retorno:
CF = 0 se no h erros, ou CF ser 1 e AX conter o cdigo de erro: 06H se o
handle invlido.
Esta funo atualiza o arquivo e libera o handle que estava usando.
FUNO 3FH
Uso:
Ler uma quantidade especfica de bytes de um arquivo aberto e armazen-los
num buffer especfico.
--------------- // ---------------
5.1.4.2.Interrupo 10h
Propsito: Chamar uma diversidade de funes do BIOS
Sintaxe:
Int 10H
Esta interrupo tem vrias funes, todas para entrada e sada de vdeo.
Para ter acesso a cada uma delas necessrio colocar o nmero da funo
correspondente no registrador AH.
Veremos apenas as funes mais comuns da interrupo 10H.
Funo
Funo
Funo
Funo
02H,
09H,
0AH,
0EH,
Funo 02h
Uso:
Move o cursor na tela do computador usando o modo texto.
Registradores de chamada:
AH
BH
DH
DL
=
=
=
=
02H
Pgina de vdeo onde o cursor est posicionado.
linha
coluna
Registradores de retorno:
Nenhum.
A posio do cursor definida pelas suas coordenadas, iniciando-se na
posio 0,0 at a posio 79,24. Logo os valores possveis para os
registradores DH e DL so: de 0 a 24 para linhas e de 0 a 79 para colunas.
Funo 09h
Uso:
Mostra um determinado caracter vrias vezes na tela do computador com um
atributo definido, iniciando pela posio atual do cursor.
Registradores de chamada:
AH
AL
BH
BL
CX
=
=
=
=
=
09H
Caracter a exibir
Pgina de vdeo, onde o caracter ser
Atributo do caracter
Nmero de repeties.
mostrado
Registradores de retorno:
Nenhum
Esta funo mostra um caracter na tela vrias vezes, de acordo com o nmero
especificado no registrador CX, mas sem mudar a posio do cursor na tela.
Funo 0Ah
Uso:
Exibe um caracter na posio atual do cursor.
Registradores de chamada:
AH
AL
BH
BL
CX
=
=
=
=
=
0AH
Caracter a exibir
Pgina de vdeo onde o caracter ser exibido
Cor do caracter (apenas em modo gr fico)
Nmero de repeties
Registradores de retorno:
Nenhum.
A principal diferena entre esta funo e a anterior permitir mudana nos
atributos, bem como mudar a posio do cursor.
Funo 0Eh
Uso:
Exibir um caracter na tela do computador atualizando a posio do cursor.
Registradores de chamada:
AH
AL
BH
BL
=
=
=
=
0EH
Caracter a exibir
Pgina de vdeo onde o caracter ser exibido
Cor a usar (apenas em modo grfico)
Registradores de retorno:
Nenhum
--------------- // --------------5.1.4.3.Interrupo 16H
Veremos duas funes da interrupo 16H. A exemplo das demais interrupes,
usa-se o registrador AH para cham-las.
Funes da interrupo 16h
Funo 00H, l um caracter do teclado.
Funo 01H, l o estado atual do teclado.
Funo 00H
Uso:
Ler um caracter do teclado.
Registradores de chamada:
AH = 00H
Registradores de retorno:
AH = Cdigo da tecla pressionada
AL = Valor ASCII do caracter
Quando se usa esta interrupo, os programas executam at que uma tecla seja
pressionada. Se um valor ASCII, armazenado no registrador AH. Caso
0
1
2
3
4
5
6
7
1
1
1
1
1
1
Estado de time-out
Erro de entrada e sada
Impressora selecionada
Fim de papel
Reconhecimento de comunicao
A impressora est pronta para o uso
COMPRIMENTO
1 Byte
8 Bytes
3 Bytes
2 Bytes
2 Bytes
4 Bytes
2 Bytes
2 Bytes
8 Bytes
1 Bytes
4 Bytes
SIGNIFICADO
Drive
Nome do arquivo
Extenso
Nmero do bloco
Tamanho do registro
Tamanho do arquivo
Data de criao
Hora de criao
Reservado
Registro corrente
Registro randmico
5.2.2.4.ESCRITA SEQENCIAL
Antes de conseguirmos realizar escrita para o disco, necessrio definir a
rea de transferncia de dados usando, para tanto, a funo 1AH da
interrupo 21h.
A funo 1AH no retorna qualquer estado do disco nem da operao. Mas a
funo 15H, que usaremos para escrever para o disco, faz isso no registrador
AL. Se este for igual a zero, ento no h erro e os campos de registro
corrente e de bloco so atualizados.
--------------- // --------------5.2.2.5.LEITURA SEQENCIAL
Antes de tudo, devemos definir a rea de transferncia de arquivo ou DTA.
Para a leitura seqencial usaremos a funo 14H da interrupo 21h.
O registro a ser lido definido pelos campos registro e bloco corrente. O
registrador AL retorna o estado da operao. Se AL contm o valor 1 ou 3,
significa que foi atingido o fim do arquivo. Um valor 2, por sua vez,
significa que o FCB est estruturado erroneamente.
Caso no ocorra erro, AL conter o valor 0 e os campos de registro e bloco
corrente so atualizados.
--------------- // --------------5.2.2.6.LEITURA E ESCRITA RANDMICA
A funo 21H e a funo 22H da interrupo 21h so usadas na realizao,
respectivamente, da escrita e leitura randmica.
O nmero de registro randmico e o bloco corrente so usados para calcular a
posio relativa do registro a ser lido ou escrito.
O registrador AL retorna a mesma informao do que para escrita e leitura
seqencial. A informao a ser lida ser retornada na rea de transferncia
do disco, bem como a informao a ser escrita retorna na DTA.
--------------- // --------------5.2.2.7.FECHAR UM ARQUIVO
Para fechar um arquivo usamos a funo 10H da interrupo 21h.
Se aps invocar esta funo, o registrador AL conter o valor FFH, significa
que o arquivo foi mudado de posio, o disco foi mudado ou h erro de acesso
a disco.
--------------- // --------------5.2.3.Canais de comunicao.
5.2.3.1.Trabalhando com handles
5.2.3.2.Funes para usar handles
5.2.3.1.TRABALHANDO COM HANDLES
O uso de handles para gerenciar arquivos traz grandes facilidades na criao
de arquivos e o programador pode concentrar-se em outros aspectos da
programao sem preocupar-se com detalhes que podem ser manuseados pelo
sistema operacional.
Declarao do procedimento
Cdigo do procedimento
Diretiva de retorno
Trmino do procedimento
Por exemplo, se quisermos uma rotina que soma dois bytes armazenados em AH e
AL, e o resultado da soma em BX:
Soma Proc Near
Mov BX, 0
Mov BL, AH
Mov AH, 00
Add BX, AX
Ret
Soma EndP
; Declarao do Procedimento
; Contedo do Procedimento...
; Diretiva de retorno
; Fim do Procedimento
Linha, Coluna
02H
Linha
Coluna
0
Para usar uma macro basta cham-la pelo seu nome, tal como se fosse qualquer
instruo na linguagem assembly:
Pos 8, 6
--------------- // --------------6.2.3.Biblioteca de Macros
Uma das facilidades oferecidas pelo uso de macros a criao de
bibliotecas, que so grupo de macros, podendo ser includas num programa
originrias de arquivos diferentes.
A criao destas bibliotecas muito simples. Criamos um arquivo com todas
as macros que sero necessrias e o salvamos como um arquivo texto.
Para incluir uma biblioteca num programa, basta colocar a seguinte instruo
Include NomedoArquivo na parte inicial do programa, antes da declarao do
modelo de memria.
Supondo que o arquivo de macros tenha sido salvo com o nome de MACROS.TXT, a
instruo Include seria utilizada do seguinte modo:
;Incio do programa
Include MACROS.TXT
.MODEL SMALL
.DATA
;Os dados vo aqui
.CODE
Inicio:
;O cdigo do programa comea aqui
.STACK
;A pilha declarada
End Inicio
;Fim do programa
*****************************************************************************
CAPTULO 7: EXEMPLOS DE PROGRAMAS
Contedo:
7.1.Exemplos de Programas com Debug
7.2.Exemplos de Programas com TASM
--------------- // --------------7.1.Exemplos de Programas com Debug
Nesta seo forneceremos alguns programas feitos no debug do DOS.
Voc pode executar cada programa assembly usando o comando "g" (go), para
ver o que cada programa faz.
Procedimento
Primeiro passo
Carregar o programa exemplo
Por exemplo:
C:\>debug
-n one.com
-l
-u 100 109
0D80:0100 B80600
0D80:0103 BB0400
0D80:0106 01D8
0D80:0108 CD20
-
MOV
MOV
ADD
INT
AX,0006
BX,0004
AX,BX
20
Nota:
-n one.com
Dar nome ao programa a ser carregado
-l
Carreg-lo
-u 100 109
Desmontar o cdigo do endereo inicial ao final especificado
Segundo passo
Digite o comando g
Por exemplo:
-g
Program terminated normally
-
MOV
MOV
ADD
INT
AX,0006
BX,0004
AX,BX
20
A nica coisa que este programa faz salvar dois valores em dois
registradores e adicionar o valor de um ao outro.
Segundo exemplo
- a100
0C1B:0100 jmp 125 ;Salta para o endereo 125h
0C1B:0102 [Enter]
- e 102 'Hello, How are you ?' 0d 0a '$'
- a125
0C1B:0125 MOV DX,0102 ;Copia a string para registrador DX
0C1B:0128 MOV CX,000F ;Quantas vezes a string ser mostrada
0C1B:012B MOV AH,09
;Copia o valor 09 para registrador AH
0C1B:012D INT 21
;Mostra a string
0C1B:012F DEC CX
;Subtrai 1 de CX
0C1B:0130 JCXZ 0134
;Se CX igual a 0 salta para o endereo 0134
0C1B:0132 JMP 012D
;Salta ao endereo 012D
0C1B:0134 INT 20
;Finaliza o programa
Este programa mostra 15 vezes na tela a string de caracteres.
Terceiro exemplo
-a100
297D:0100
297D:0102
297D:0105
297D:0107
MOV
MOV
INT
INT
AH,01
CX,0007
10
20
MOV
INT
CMP
JNZ
MOV
MOV
INT
INT
AH,01
21
AL,0D
0100
AH,02
DL,AL
21
20
Este programa usa a interrupo 21h do DOS. Usa duas funes da mesma: a
primeira l um caractere do teclado (funo 1) e a segundo escreve um
caractere na tela. O programa l caracteres do teclado at encontrar um
ENTER.
Quinto exemplo
-a100
297D:0100
297D:0102
297D:0105
297D:0107
esquerda
297D:0109
297D:010C
297D:010E
297D:0110
MOV
MOV
MOV
RCL
AH,02
CX,0008
DL,00
BL,1
ADC
INT
LOOP
INT
DL,30
21
0105
20
MOV
MOV
ADD
CMP
AH,02
DL,BL
DL,30
DL,3A
297D:010A
297D:010C
297D:010F
297D:0111
JL
ADD
INT
INT
010F
DL,07
21
20
MOV
MOV
AND
AH,02
DL,BL
DL,0F
297D:0107
297D:010A
297D:010D
297D:010F
297D:0112
297D:0114
ADD
CMP
JL
ADD
INT
INT
DL,30
DL,3A
0112
DL,07
21
20
MOV
MOV
MOV
SHR
AH,02
DL,BL
CL,04
DL,CL
297D:0108
297D:010B
297D:010E
297D:0110
297D:0113
297D:0115
ADD
CMP
JL
ADD
INT
INT
DL,30
DL,3A
0113
DL,07
21
20
MOV
MOV
MOV
SHR
AH,02
DL,BL
CL,04
DL,CL
297D:0108
297D:010B
297D:010E
297D:0110
297D:0113
297D:0115
297D:0117
297D:011A
297D:011D
297D:0120
297D:0122
297D:0125
297D:0127
ADD
CMP
JL
ADD
INT
MOV
AND
ADD
CMP
JL
ADD
INT
INT
DL,30
DL,3A
0113
DL,07
21
DL,BL
DL,0F
DL,30
DL,3A
0125
DL,07
21
20
MOV
INT
MOV
SUB
CMP
JLE
SUB
MOV
SHL
INT
SUB
CMP
JLE
SUB
ADD
INT
AH,01
21
DL,AL
DL,30
DL,09
0111
DL,07
CL,04
DL,CL
21
AL,30
AL,09
011F
AL,07
DL,AL
20
CALL
INT
0200
20
;Chama um procedimento
;Finaliza o programa
-a200
297D:0200
297D:0201
297D:0203
297D:0205
297D:0207
297D:0209
PUSH
MOV
INT
CMP
JB
CMP
DX
AH,08
21
AL,30
0203
AL,46
297D:020B
297D:020D
297D:020F
297D:0211
297D:0213
297D:0215
297D:0217
297D:0219
297D:021A
297D:021B
297D:021D
297D:021F
297D:022
297D:0223
297D:0225
297D:0227
297D:0228
JA
CMP
JA
MOV
MOV
INT
SUB
POP
RET
CMP
JB
MOV
MOV
INT
SUB
POP
RET
0203
AL,39
021B
AH,02
DL,AL
21
AL,30
DX
AL,41
0203
AH,02
DL,AL
21
AL,37
DX
one.asm
None
None
1
471k
C:\>
Isto criar
one.obj
Segundo passo
Criar o programa executvel
Por exemplo:
C:\>tlink one.obj
Turbo Link Version 3.0 Copyright (c) 1987, 1990 Borland International
C:\>
Isto cria o programa executvel com o mesmo nome do objeto e com extenso
diferente, one.exe
Terceiro passo
Rodar o programa executvel. Basta digitar o nome do programa criado.
one.asm
;Funo 1 do DOS
;l o caracter e retorna o cdigo ASCII ao registrador AL
;move o cdigo ASCII para o registrador DL
;subtrai de 30h para converter a um dgito de 0 a 9
;compara se o dgito est entre 0 e 9
;se verdadeiro obtm o primeiro nmero (4 bits)
;se falso, subtrai de 7h para converter a uma letra A-F
;prepara para multiplicar por 16
;multiplica para converter dentro dos 4 bits mais altos
;obtm o prximo caracter
;repete a operao de converso
;compara o valor 9h com o contedo do registrador AL
;se verdadeiro, obtm o segundo dgito
;se falso, subtrai de 7h
;adiciona o segundo dgito
;funo 4Ch do DOS (exit)
;interrupo 21h
;finaliza o programa
PROC
;Funo 2h, imprime caracter
;Imprime o caracter que est em DL
;Retorna o controle ao procedimento que chamou
ENDP ;Finaliza o procedimento
END
PRINT_A_J
;Finaliza o programa
;coloca
;coloca
;move o
;move o
PUBLIC WRITE_HEX_DIGIT
;......................................................................;
;Este procedimento converte os 4 bits mais baixos do registrador DL
;
;para um nmero hexadecimal e o mostra na tela do computador
;
;Use: WRITE_CHAR
;
;......................................................................;
WRITE_HEX_DIGIT
PROC
PUSH DX
CMP DL,10
JAE HEX_LETTER
ADD DL,"0"
JMP Short WRITE_DIGIT
HEX_LETTER:
ADD DL,"A"-10
WRITE_DIGIT:
CALL WRITE_CHAR
POP DX
RET
WRITE_HEX_DIGIT
ENDP
PUBLIC WRITE_CHAR
;......................................................................;
;Este procedimento imprime um caracter na tela usando o D.O.S.
;
;......................................................................;
WRITE_CHAR
PROC
PUSH AX
MOV AH,2
INT 21h
POP AX
RET
WRITE_CHAR
ENDP
SI
DX
CX
AX
chamou
;......................................................................;
;
;
;Este procedimento converte os 4 bits mais baixos do registrador DL
;
;num nmero hexadecimal e os imprime
;
;Use: WRITE_CHAR
;
;......................................................................;
WRITE_HEX_DIGIT
PROC
PUSH DX
;Pe na pilha o valor do registrador DX
CMP DL,10
;Compara o valor 10 com o valor do registrador DL
JAE HEX_LETTER ;se no, salta para HEX_LETER
ADD DL,"0"
;se , converte em dgito numrico
JMP Short WRITE_DIGIT ;escreve o caracter
HEX_LETTER:
ADD DL,"A"-10
;converte um caracter para um nmero hexadecimal
WRITE_DIGIT:
CALL WRITE_CHAR ;mostra o caracter na tela
POP DX
;Retorna o valor inicial para o registrador DL
RET
;Retorna o controle ao procedimento que chamou
WRITE_HEX_DIGIT
ENDP
PUBLIC WRITE_CHAR
;......................................................................;
;Este procedimento imprime um caracter na tela usando uma funo D.O.S.;
;......................................................................;
WRITE_CHAR
PROC
PUSH AX
;Pe na pilha o valor do registrador AX
MOV AH,2h ;Funo 2h
INT 21h
;Interrupo 21h
POP AX
;Retira da pilha o valor inicial do registrador AX
RET
;Retorna o controle ao procedimento que chamou
WRITE_CHAR
ENDP
END TEST_WRITE_DECIMAL ;finaliza o programa
Este programa mostra na tela os nmeros 12345
Quinto exemplo
;nome do programa: five.asm
.model small
.stack
.code
PRINT_ASCII
MOV DL,00h
MOV CX,255
PROC
;move o valor 00h para o registrador DL
;move o valor decimal 255 para o registrador CX
;usado para fazer um lao com 255 interaes
PRINT_LOOP:
CALL WRITE_CHAR
INC DL
LOOP PRINT_LOOP
MOV AH,4Ch
INT 21h
PRINT_ASCII
ENDP
WRITE_CHAR
PROC
MOV AH,2h
INT 21h
RET
WRITE_CHAR
ENDP
END
PRINT_ASCII
;Finaliza o programa
Este programa mostra na tela o valor dos 256 caracteres do cdigo ASCII.
*****************************************************************************
CAPTULO 8: BIBLIOGRAFIA
Crditos:
Monico Briseo C., Engenheiro
Idia Original
Desenvolvimento e Implementao da edio 1996
Hugo Eduardo Prez P.
Desenvolvimento e Implementao da edio 1995
Vctor Hugo Avila B.
Verso Inglesa
Jeferson Botelho do Amaral
Verso Portuguesa
Ana Mara Peraza
Programadora de Linguagem Assembly
Graciela Salcedo Mancilla
Programadora Tcl/Tk
Juan Olmos Monroy
Designer Grfico
Referncias Bibliogrficas:
Assembly Language For IBM Microcomputers
J. Terry Godfrey
Prentice Hall Hispanoamericana, S.A.
Mexico
Basic Assembler
A. Rojas
Ed Computec Editores S.A. de C.V.
Mexico
IBM Personal Computer Assembly Language Tutorial
Joshua Auerbach
Yale University
Organizao Estruturada de Computadores
Andrew S. Tanenbaum
Prentice Hall do Brasil
Guia do Programador para as Placas EGA e VGA
Richard F. Ferraro
Ed. Cincia Moderna