Escolar Documentos
Profissional Documentos
Cultura Documentos
TXT
University of Guadalajara
Information Sistems General Coordination.
Culture and Entertainment Web
*****************************************************************************
* Este tutorial foi traduzido para o Portuguˆs por Jeferson Amaral. *
* e-mail: amaral@inf.ufsm.br *
*****************************************************************************
(1) any copy or republication of the entire document must show University of
Guadalajara as the source, and must include this notice; and
(2) any other use of this material must reference this manual and University
of Guadalajara, and the fact that the material is copyright by Hugo Perez
and is used by permission.
****************************************************************************
Conte£do:
1.Introdu‡Æo
2.Conceitos B sicos
3.Programa‡Æo Assembly
4.Instru‡äes Assembly
5.Interrup‡äes e gerˆncia de arquivos
6.Macros e procedimentos
7.Exemplos de programas
8.Bibliografia
*****************************************************************************
CAPÖTULO 1: INTRODUÇO
Conte£do:
--------------- // ---------------
1.2.Apresenta‡Æo:
Este tutorial destina-se …quelas pessoas que nunca tiveram contato com a
Linguagem Assembly.
A segunda razÆo ‚ que vocˆ pode ter um controle total sobre o PC ao fazer
uso do assembler.
Uma outra razÆo ‚ que programas assembly sÆo mais r pidos, menores e mais
poderosos do que os criados com outras linguagens.
Nosso intuito ‚ oferecer um modo simples para que vocˆ consiga aprender
Assembly por si mesmo. Por tanto, qualquer coment rio ou sugestÆo ser
bem-vinda.
*****************************************************************************
--------------- // ---------------
Esta se‡Æo tem o prop¢sito de fazer um breve coment rio a respeito dos
principais componentes de um sistema computacional, o que ir permitir ao
usu rio uma melhor compreensÆo dos conceitos propostos no decorrer do
tutorial.
Conte£do:
2.1.1.Processador Central
2.1.2.Mem¢ria Principal
2.1.3.Unidades de Entrada e Sa¡da
2.1.4.Unidades de Mem¢ria Auxiliar
Sistema Computacional.
2.1.1.Processador Central.
• tamb‚m conhecido por CPU ou Unidade Central de Processamento, que por sua
vez ‚ composta pela unidade de controle e unidade de l¢gica e aritm‚tica.
Sua fun‡Æo consiste na leitura e escrita do conte£do das c‚lulas de mem¢ria,
regular o tr fego de dados entre as c‚lulas de mem¢ria e registradores
especiais, e decodificar e executar as instru‡äes de um programa.
2.1.2.Mem¢ria Principal.
Cada uma das c‚lulas pode conter um valor num‚rico e ‚ capaz de ser
endere‡ada, isto ‚, pode ser identificada de forma singular em rela‡Æo …s
outras c‚lulas pelo uso de um n£mero ou endere‡o.
Para que o computador possa ser £til para n¢s se faz necess rio que o
processador se comunique com o exterior atrav‚s de interfaces que permitem a
entrada e a sa¡da de informa‡Æo entre ele e a mem¢ria. Atrav‚s do uso destas
comunica‡äes ‚ poss¡vel introduzir informa‡Æo a ser processada e mais tarde
visualizar os dados processados.
Algumas das mais comuns unidades de entrada sÆo o teclado e o mouse. As mais
comuns unidades de sa¡da sÆo a tela do monitor e a impressora.
--------------- // ---------------
2.2.CONCEITOS BµSICOS
Conte£do:
2.2.1.Informa‡Æo no computador:
2.2.1.1.Unidades de informa‡Æo
2.2.1.2.Sistemas num‚ricos
2.2.1.3.Convertendo n£meros bin rios para decimais
2.2.1.4.Convertendo n£meros decimais para bin rios
2.2.1.5.Sistema hexadecimal
2.2.1.1.Unidades de informa‡Æo
Um grupo de 16 bits ‚ conhecido como palavra; uma palavra pode ser dividida
em grupos de 8 bits chamados bytes, e grupos de 4 bits chamados nibbles.
2.2.1.2.Sistemas num‚ricos
O sistema num‚rico que n¢s usamos diariamente ‚ o decimal, mas este sistema
nÆo ‚ conveniente para m quinas, pois ali as informa‡äes tˆm que ser
codificadas de modo a interpretar os estados da corrente (ligado-desligado);
este modo de c¢digo faz com que tenhamos que conhecer o c lculo posicional
que nos permitir expressar um n£mero em qualquer base onde precisarmos
dele.
Por exemplo, se tivermos o n£mero bin rio 10011, tomamos cada d¡gito da
direita para a esquerda e o multiplicamos pela base, elevando … potˆncia
correspondente … sua posi‡Æo relativa:
Binary: 1 1 0 0 1
= 1 + 2 + 0 + 0 + 16 = 19 decimal.
H v rios m‚todos para se converter n£meros decimais para bin rio; apenas um
Para construir o equivalente bin rio de 43, vamos pegar os restos obtidos de
baixo para cima, assim temos 101011.
2.2.1.5.Sistema hexadecimal
Tomando como exemplo o n£mero bin rio 101011, vamos dividi-lo em grupos de 4
bits:
10;1011
0010;1011
0010=2;1011=11
Entretanto, observa-se que nÆo podemos representar este n£mero como 211,
isto seria um erro, uma vez que os n£meros em hexa maiores que 9 e menores
que 16 sÆo representados pelas letras A,B,...,F. Logo, obtemos como
resultado:
--------------- // ---------------
2.2.2.1.C¢digo ASCII
2.2.2.2.M‚todo BCD
2.2.2.3.Representa‡Æo de ponto flutuante
2.2.2.1.C¢digo ASCII
Deste modo, cada letra, d¡gito ou caracter especial ocupa 1 byte na mem¢ria
do computador.
2.2.2.2.M‚todo BCD
Neste m‚todo grupos de 4 bits sÆo usados para representar cada d¡gito
decimal de 0 a 9. Com este m‚todo podemos representar 2 d¡gitos por byte de
informa‡Æo.
Vemos que este m‚todo vem a ser muito mais pr tico para representa‡Æo
num‚rica do que o c¢digo ASCII. Embora ainda menos pr tico do que o bin rio,
com o m‚todo BCD podemos representar d¡gitos de 0 a 99. Com o bin rio, vemos
que o alcance ‚ maior, de 0 a 255.
O expoente negativo, por outro lado, indica o n£mero de casas que o ponto
decimal deve se locomover para a esquerda.
--------------- // ---------------
2.3.PROGRAMA DEBUG
Conte£do:
2.3.2.Registradores da CPU.
AX Registrador Acumulador
BX Registrador Base
CX Registrador Contador
DX Registrador de Dados
DS Registrador de Segmento de Dados
ES Registrador de Segmento Extra
SS Registrador de Segmento de Pilha
CS Registrador de Segmento de C¢digo
BP Registrador Apontador da Base
SI Registrador de Öndice Fonte
2.3.3.Programa Debug.
Debug pode apenas criar arquivos com a extensÆo .COM, e por causa das
caracter¡sticas deste tipo de programa, eles nÆo podem exceder os 64 Kb, e
tamb‚m devem iniciar no endere‡o de mem¢ria 0100H dentro do segmento
espec¡fico. • importante observar isso, pois deste modo os programas .COM
nÆo sÆo reloc veis.
C:/>Debug [Enter]
-
registradores, experimente:
-r[Enter]
-rbx
BX 0000
:
2.3.4.Estrutura Assembly.
add ah bh
Aqui "add" ‚ o comando a ser executado, neste caso uma adi‡Æo, e "ah" bem
como "bh" sÆo os parƒmetros.
Por exemplo:
mov al, 25
add al,[170]
Embora neste momento nÆo seja necess rio darmos um parƒmetro ao comando "a",
isso ‚ recomend vel para evitar problemas, logo:
a 100[enter]
mov ax,0002[enter]
mov bx,0004[enter]
add ax,bx[enter]
nop[enter][enter]
O que o programa faz? Move o valor 0002 para o registrador ax, move o valor
0004 para o registrador bx, adiciona o conte£do dos registradores ax e bx,
C:\>debug
-a 100
0D62:0100 mov ax,0002
0D62:0103 mov bx,0004
0D62:0106 add ax,bx
0D62:0108 nop
0D62:0109
-t
Vemos o valor 0002 no registrador AX. Teclamos "t" para executar a segunda
instru‡Æo:
-t
-t
NÆo seria pr tico ter que digitar o programa cada vez que inici ssemos o
Debug. Ao inv‚s disso, podemos armazen -lo no disco. S¢ que o mais
interessante nisso ‚ que um simples comando de salvar cria um arquivo com a
extensÆo .COM, ou seja, execut vel - sem precisarmos efetuar os processos de
montagem e liga‡Æo, como veremos posteriormente com o TASM.
Para obter o tamanho de um programa, o comando "h" ‚ usado, j que ele nos
mostra a adi‡Æo e subtra‡Æo de dois n£meros em hexadecimal. Para obter o
tamanho do programa em questÆo, damos como parƒmetro o valor do endere‡o
final do nosso programa (10A), e o endere‡o inicial (100). O primeiro
resultado mostra-nos a soma dos endere‡os, o segundo, a subtra‡Æo.
-h 10a 100
020a 000a
-n test.com
-rcx
CX 0000
:000a
-w
Writing 000A bytes
Para j salvar um arquivo quando carreg -lo, 2 passos sÆo necess rios:
Para obter o resultado correto destes passos, ‚ necess rio que o programa
acima j esteja criado.
-n test.com
-l
-u 100 109
0C3D:0100 B80200 MOV AX,0002
0C3D:0103 BB0400 MOV BX,0004
0C3D:0106 01D8 ADD AX,BX
0C3D:0108 CD20 INT 20
O £ltimo comando "u" ‚ usado para verificar que o programa foi carregado na
mem¢ria. O que ele faz ‚ desmontar o c¢digo e mostr -lo em assembly. Os
parƒmetros indicam ao Debug os endere‡os inicial e final a serem
desmontados.
*****************************************************************************
Conte£do:
--------------- // ---------------
3.1.1.SOFTWARE NECESSµRIO
O editor pode ser qualquer um que dispusermos. O montador ser o TASM macro
assembler da Borland, e o linker ser o TLINK, tamb‚m da Borland.
N¢s devemos criar os programas fonte com a extensÆo .ASM para que o TASM
reconhe‡a e o transforme no programa objeto, um "formato intermedi rio" do
programa, assim chamado porque ainda nÆo ‚ um programa execut vel e tÆo
pouco um programa fonte. O linker gera a partir de um programa .OBJ, ou da
combina‡Æo de v rios deles, um programa execut vel, cuja extensÆo ‚
normalmente .EXE, embora possa ser .COM dependendo da forma como for montado
e ligado.
3.1.2.PROGRAMAÇO ASSEMBLY
.MODEL SMALL
Define o melo de mem¢ria a usar em nosso programa
.CODE
Define as instru‡äes do programa, relacionado ao segmento de c¢digo
.STACK
Reserva espa‡o de mem¢ria para as instru‡äes de programa na pilha
END
Finaliza um programa assembly
Vamos programar
Primeiro passo
Use qualquer editor para criar o programa fonte. Entre com as seguintes
linhas:
Primeiro exemplo
Segundo passo
Terceiro passo
Exemplo:
C:\>tasm exam1.asm
Turbo Assembler Version 2.0 Copyright (c) 1988, 1990 Borland International
O TASM s¢ pode criar programas no formato .OBJ, que ainda nÆo pode ser
executado...
Quarto passo
Exemplo:
C:\>tlink exam1.obj
Turbo Link Version 3.0 Copyright (c) 1987, 1990 Borland International
C:\>
Quinto passo
C:\>exam1[enter]
--------------- // ---------------
3.2.Processo Assembly.
3.2.1.Segmentos
3.2.2.Tabela de equivalˆncia
3.2.1.SEGMENTOS
Desta forma, para que o montador seja capaz de gerenciar os dados, se faz
necess rio que cada informa‡Æo ou instru‡Æo se encontre na rea
correspondente ao seu segmento. O endere‡o do segmento ‚ fornecido ao
montador pelos registradores DS, ES, SS e CS. Lembrando um programa no
Debug, observe:
O modo usado para indicar ao montador com quais segmentos vamos trabalhar ‚
fazendo uso das diretivas .CODE, .DATA e .STACK.
3.2.2.TABELAS DE EQUIVALÒNCIA
Cada uma das partes numa linha de c¢digo assembly ‚ conhecida como token,
por exemplo:
MOV AX,Var
H s¡mbolos que o montador nÆo consegue encontrar, uma vez que podem ser
declara‡äes externas. Neste caso o linker entra em a‡Æo para criar a
estrutura necess ria a fim de ligar as diversas poss¡veis partes de c¢digo,
dizendo ao loader que o segmento e o token em questÆo sÆo definidos quando o
programa ‚ carregado e antes de ser executado.
--------------- // ---------------
3.3.Mais programas.
Outro exemplo
Primeiro passo
;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 ;interrup‡Æo 21h
mov ah,4ch ;fun‡Æo 4ch, sai para o sistema operacional
int 21h ;interrup‡Æo 21h
end ;finaliza o programa
Segundo passo
Terceiro passo
C:\>tasm exam2.asm
Turbo Assembler Version 2.0 Copyright (c) 1988, 1990 Borland International
Quarto passo
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:\>
--------------- // ---------------
3.4.Tipos de instru‡äes.
3.4.1.Movimento de dados
3.4.2.Opera‡äes l¢gicas e aritm‚ticas
3.4.3.Saltos, la‡os e procedimentos
3.4.1.MOVIMENTO DE DADOS
• poss¡vel mover blocos de dados atrav‚s de instru‡äes 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 instru‡äes toma os valores dos
endere‡os definidos por DS:SI como o grupo de dados a mover e ES:DI como a
nova localiza‡Æo dos dados.
PUSH AX
PUSH BX
PUSH CX
POP CX
POP BX
POP AX
OUT DX,AX
IN AX,DX
As instru‡äes usadas para opera‡äes alg‚bricas sÆo: para adi‡Æo add, para
subtra‡Æo sub, para multiplica‡Æo mul e para divisÆo div.
*****************************************************************************
Conte£do:
--------------- // ---------------
Conte£do:
4.1.1.Instru‡äes de transferˆncia
4.1.2.Instru‡äes de carga
4.1.3.Instru‡äes de pilha
4.1.1.Instru‡äes de transferˆncia.
SÆo usadas para mover o conte£do dos operadores. Cada instru‡Æo pode ser
usada com diferentes modos de endere‡amento.
MOV
MOVS (MOVSB) (MOVSW)
INSTRUÇO MOV
Sintaxe:
MOV Destino,Fonte
Destino ‚ o lugar para onde o dado ser movido e Fonte ‚ o lugar onde o dado
est .
Exemplo:
MOV AX,0006h
MOV BX,AX
MOV AX,4C00h
INT 21h
Este pequeno programa move o valor 0006h para o registrador AX, entÆo ele
move o conte£do de AX (0006h) para o registrador BX, e finalmente move o
valor 4C00h para o registrador AX para terminar a execu‡Æo com a op‡Æo 4C da
interrup‡Æo 21h.
Sintaxe:
MOVS
Este comando nÆo necessita de parƒmetros uma vez que toma como endere‡o
fonte o conte£do do registrador SI e como destino o conte£do de DI. A
seguinte seq•ˆncia de instru‡äes ilustra isso:
As instru‡äes MOVSB e MOVSW sÆo usadas do mesmo modo que MOVS, a primeira
move um byte e a segunda move uma palavra.
Instru‡äes de carga.
Sintaxe:
LODS
INSTRUÇO LAHF
Sintaxe:
LAHF
Esta instru‡Æo ‚ £til para verificar o estado dos flags durante a execu‡Æo
do nosso programa.
SF ZF ?? AF ?? PF ?? CF
INSTRUÇO LDS
Sintaxe:
LDS destino,fonte
O operador fonte deve ser uma double word na mem¢ria. A palavra associada
com o maior endere‡o ‚ transferida para DS, em outras palavras isto ‚ tomado
como o endere‡o de segmento. A palavra associada com o menor endere‡o ‚ o
endere‡o de deslocamento e ‚ depositada no registrador indicado como
destino.
INSTRUÇO LEA
Sintaxe:
LEA destino,fonte
Para ilustrar uma das facilidades que temos com este comando, vejamos:
• equivalente a:
LEA SI,VAR1
• muito prov vel que para o programador ‚ muito mais f cil criar programas
grandes usando este £ltimo formato.
INSTRUÇO LES
Sintaxe:
LES destino,fonte
POP
POPF
PUSH
PUSHF
INSTRUÇO POP
Sintaxe:
POP destino
Este incremento ‚ duplo pelo fato de que a pilha do mais alto endere‡o de
mem¢ria para o mais baixo, e a pilha trabalha apenas com palavras, 2 bytes,
logo deve ser 2 o incremento de SP, na realidade 2 est sendo subtra¡do do
tamanho real da pilha.
INSTRUÇO POPF
Sintaxe:
POPF
BIT FLAG
0 CF
2 PF
4 AF
6 ZF
7 SF
8 TF
9 IF
10 DF
11 OF
INSTRUÇO PUSH
Sintaxe:
PUSH fonte
INSTRUÇO PUSHF
Sintaxe:
PUSHF
--------------- // ---------------
Conte£do:
4.2.1.Instru‡äes l¢gicas
4.2.2.Instru‡äes aritm‚ticas
4.2.1.Instru‡äes l¢gicas
AND
NEG
NOT
OR
TEST
XOR
INSTRUÇO AND
Sintaxe:
AND destino,fonte
Com esta instru‡Æo a opera‡Æo l¢gica "y" para ambos os operadores ‚ usada
como na tabela:
INSTRUÇO NEG
Sintaxe:
NEG destino
NEG AX
Isto far com o que o valor EDCCH fque armazenado no registrador AX.
INSTRUÇO NOT
Sintaxe:
NOT destino
INSTRUÇO OR
Sintaxe:
OR destino,fonte
A instru‡Æo OR, faz uma disjun‡Æo l¢gica bit a bit dos dois operadores:
INSTRUÇO TEST
Sintaxe:
TEST destino,fonte
Realiza uma conjun‡Æo, bit a bit, dos operadores, mas difere da instru‡Æo
AND, uma vez que nÆo coloca o resultado no operador de destino. Tem efeito
sobre o registrador de flag.
INSTRUÇO XOR
Sintaxe:
XOR destino,fonte
4.2.2.Instru‡äes aritm‚ticas.
ADC
ADD
DIV
IDIV
MUL
IMUL
SBB
SUB
INSTRUÇO ADC
Sintaxe:
ADC destino,fonte
Esta instru‡Æo efetua a soma entre dois operandos, mais o valor do flag CF,
existente antes da opera‡Æo. Apenas o operando destino e os flags sÆo
afetados.
INSTRUÇO ADD
Sintaxe:
ADD destino,fonte
INSTRUÇO DIV
Sintaxe:
DIV fonte
INSTRUÇO IDIV
Sintaxe:
IDIV fonte
INSTRUÇO MUL
Sintaxe:
MUL fonte
INSTRUÇO IMUL
Sintaxe:
IMUL fonte
Esta instru‡Æo faz o mesmo que a anterior, difere apenas pela inclusÆo do
sinal.
INSTRUÇO SBB
Sintaxe:
SBB destino,fonte
INSTRUÇO SUB
Prop¢sito: Subtra‡Æo.
Sintaxe:
SUB destino,fonte
--------------- // ---------------
Conte£do:
4.3.1.Instru‡äes de salto
4.3.2.Instru‡äes de la‡os: loop
4.3.3.Instru‡äes de contagem
4.3.4.Instru‡äes de compara‡Æo
4.3.5.Instru‡äes de flag
4.3.1.Instru‡äes de salto.
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
INSTRUÇO JMP
Sintaxe:
JMP destino
Esta instru‡Æo ‚ usada par adesviar o curso do programa sem tomar em conta
as condi‡äes atuais dos flags ou dos dados.
INSTRUÇO JA (JNBE)
Sintaxe:
JA s¡mbolo
Sintaxe:
JAE s¡mbolo
INSTRUÇO JB (JNAE)
Sintaxe:
JB s¡mbolo
Sintaxe:
JBE s¡mbolo
INSTRUÇO JE (JZ)
Sintaxe:
JE s¡mbolo
Sintaxe:
JNE s¡mbolo
INSTRUÇO JG (JNLE)
Sintaxe:
JG s¡mbolo
Sintaxe:
JGE s¡mbolo
INSTRUÇO JL (JNGE)
Sintaxe:
JL s¡mbolo
A instru‡Æo salta se est less than, se est not larger than ou se est
equal.
Sintaxe:
JLE s¡mbolo
A instru‡Æo salta se est less than, se est equal ou se est not larger.
INSTRUÇO JC
Sintaxe:
JC s¡mbolo
O salto ‚ feito se CF = 1.
INSTRUÇO JNC
Sintaxe:
JNC s¡mbolo
O salto ‚ feito se CF = 0.
INSTRUÇO JNO
Sintaxe:
JNO s¡mbolo
O salto ‚ feito se OF = 0.
Sintaxe:
JNP s¡mbolo
O salto ‚ feito se PF = 0.
INSTRUÇO JNS
Sintaxe:
JNP s¡mbolo
O salto ‚ feito se SF = 0.
INSTRUÇO JO
Sintaxe:
JO s¡mbolo
O salto ‚ feito se OF = 1.
INSTRUÇO JP (JPE)
Sintaxe:
JP s¡mbolo
O salto ‚ feito se PF = 1.
INSTRUÇO JS
Sintaxe:
JS s¡mbolo
--------------- // ---------------
LOOP
LOOPE
LOOPNE
INSTRUÇO LOOP
Sintaxe:
LOOP s¡mbolo
INSTRUÇO LOOPE
Sintaxe:
LOOPE s¡mbolo
INSTRUÇO LOOPNE
Sintaxe:
LOOPNE s¡mbolo
--------------- // ---------------
4.3.3.Instru‡äes contadoras.
DEC
INC
DEC INSTRUCTION
Sintaxe:
DEC destino
INSTRUÇO INC
Sintaxe:
INC destino
--------------- // ---------------
4.3.4.Instru‡äes de compara‡Æo.
CMP
CMPS (CMPSB) (CMPSW)
INSTRUÇO CMP
Sintaxe:
CMP destino,fonte
Sintaxe:
CMP destino,fonte
--------------- // ---------------
4.3.5.Instru‡äes de flag.
CLC
CLD
CLI
CMC
STC
STD
STI
INSTRUÇO CLC
Sintaxe:
CLC
INSTRUÇO CLD
Sintaxe:
CLD
INSTRUÇO CLI
Sintaxe:
CLI
Uma interrup‡Æo mascar vel ‚ aquela cujas fun‡äes sÆo desativadas quando
IF=0.
INSTRUÇO CMC
Sintaxe:
CMC
INSTRUÇO STC
Sintaxe:
STC
INSTRUÇO STD
Sintaxe:
STD
INSTRUÇO STI
Sintaxe:
STI
Esta instru‡Æo ativa o flag IF, e habilita interrup‡äes externas mascar veis
(que s¢ funcionam quando IF = 1).
*****************************************************************************
Conte£do:
5.1.Interrup‡äes
5.2.Gerenciamento de arquivos
--------------- // ---------------
Conte£do
Interrup‡äes internas sÆo geradas por certos eventos que ocorrem durante a
execu‡Æo de um programa.
NÆo nos ‚ permitido gerenciar diretamente esta interrup‡Æo, uma vez que nÆo
se pode controlar a hora atualizada por software. Mas podemos usar seus
efeitos no computador para o nosso benef¡cio, por exemplo para criar um
virtual clock atualizado continuamente pelo contador interno de clock. Para
tanto, precisamos apenas ler o valor atual do contador e o transformar num
formato compreens¡vel pelo usu rio.
--------------- // ---------------
Estas interrup‡äes nÆo sÆo enviadas diretamente para a CPU, mas, de uma
forma melhor, sÆo enviadas para um circuito integrado cuja fun‡Æo exclusiva
‚ manusear este tipo de interrup‡Æo. O circuito, chamado PIC8259A, ‚
controlado pela CPU atrav‚s de uma s‚rie de comunica‡Æo chamada paths.
--------------- // ---------------
5.1.3.Interrup‡äes de software
--------------- // ---------------
Conte£do
--------------- // ---------------
5.1.4.1.Interrup‡Æo 21H
Sintaxe:
Int 21H
Nota: Quando trabalhamos com o programa TASM ‚ necess rio especificar que o
valor que estamos usando est em hexadecimal.
Esta interrup‡Æo tem muitas fun‡äes, para acessar cada uma delas ‚
necess rio que o n£mero correspondente da fun‡Æo esteja no registrador AH no
momento da chamada da interrup‡Æo.
Nesta se‡Æo sÆo apenas especificadas as tarefas de cada fun‡Æo, para uma
referˆncia acerca dos conceitos usados, veja Introdu‡Æo ao gerenciamento de
arquivos.
M‚todo FCB
Handles
FUNÇO 02H
Uso:
Registradores de chamada:
AH = 02H
DL = Valor de caracter a ser mostrado.
Registradores de retorno:
Nenhum.
FUNÇO 09H
Uso:
Registradores de chamada:
AH = 09H
DS:DX = Endere‡o de in¡cio da cadeia de caracteres.
Registradores de retorno:
Nenhum.
FUNÇO 40H
Uso:
Registradores de chamada:
AH = 40H
BX = N£mero do handle
CX = Quantidade de bytes a gravar
DS:DX = µrea onde est o dado
Registradores de retorno:
CF = 1 se houve erro
AX = C¢digo de erro
Para usar esta fun‡Æo para mostrar a informa‡Æo na tela, fa‡a o registrador
BX ser igual a 1, que ‚ o valor default para o v¡deo no DOS.
FUNÇO 01H
Uso:
Registradores de chamada
AH = 01H
Registradores de retorno:
AL = Caracter lido
FUNÇO 0AH
Uso:
Registradores de chamada:
AH = 0AH
DS:DX = Endere‡o 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.
FUNÇO 3FH
Uso:
Registradores de chamada:
AH = 3FH
BX = N£mero do handle
CX = N£mero de bytes a ler
DS:DX = µrea para receber o dado
Registradores de retorno:
FUNÇO 0FH
Uso:
Registradores de chamada:
AH = 0FH
DS:DX = Ponteiro para um FCB
Registradores de retorno:
FUNÇO 14H
Uso:
Registradores de chamada:
AH = 14H
DS:DX = Ponteiro para um FCB j aberto.
Registradores de retorno:
O que esta fun‡Æo faz ‚ ler o pr¢ximo bloco de informa‡äes do endere‡o dado
por DS:DX, e atualizar este registro.
FUNÇO 15H
Uso:
Registradores de chamada:
AH = 15H
DS:DX = Ponteiro para um FCB ja aberto.
Registradores de retorno:
AL = 00H se nÆo h erros, de outra forma conter o c¢digo de erro: 1 disco cheio ou
arquivo somente de leitura, 2 erro na forma‡Æo ou na especifica‡Æo do FCB.
FUNÇO 16H
Uso:
AH = 16H
Registradores de retorno:
FUNÇO 21H
Uso:
Registradores de chamada:
AH = 21H
DS:DX = Ponteiro para FCB aberto.
Registradores de retorno:
FUNÇO 22H
Uso:
Registradores de chamada:
AH = 22H
DS:DX = Ponteiro para um FCB aberto.
Registradores de retorno:
FUNÇO 3CH
Uso:
Registradores de chamada:
AH = 3CH
CH = Atributo do arquivo
DS:DX = Nome do arquivo, no formato ASCII.
Registradores de retorno:
Valor Atributos
00H Normal
02H Hidden
04H System
06H Hidden e System
FUNÇO 3DH
Uso:
Registradores de chamada:
AH = 3DH
AL = modo de acesso
DS:DX = Nome do arquivo, no formato ASCII.
Registradores de retorno:
BITS
7 6 5 4 3 2 1
. . . . 0 0 0 Apenas leitura
. . . . 0 0 1 Apenas escrita
. . . . 0 1 0 Leitura/Escrita
. . . x . . . RESERVADO
FUNÇO 3EH
Uso:
Registradores de chamada:
AH = 3EH
BX = N£mero do handle associado
Registradores de retorno:
CF = 0 se nÆo h erros, ou CF ser 1 e AX conter o c¢digo de erro: 06H se o handle ‚ inv lido.
FUNÇO 3FH
Uso:
--------------- // ---------------
5.1.4.2.Interrup‡Æo 10h
Sintaxe:
Int 10H
Esta interrup‡Æo tem v rias fun‡äes, todas para entrada e sa¡da de v¡deo.
Para acessar cada uma delas ‚ necess rio colocar o n£mero da fun‡Æo
correspondente no registrador AH.
Fun‡Æo 02h
Uso:
Registradores de chamada:
AH = 02H
DH = linha
DL = coluna
Registradores de retorno:
Nenhum.
Fun‡Æo 09h
Uso:
Registradores de chamada:
AH = 09H
AL = Caracter a exibir
BH = P gina de v¡deo, onde o caracter ser mostrado
BL = Atributo do caracter
CX = N£mero de repeti‡äes.
Registradores de retorno:
Nenhum
Esta fun‡Æo mostra um caracter na tela v rias vezes, de acordo com o n£mero
especificado no registrador CX, mas sem mudar a posi‡Æo do cursor na tela.
Fun‡Æo 0Ah
Uso:
Registradores de chamada:
AH = 0AH
AL = Caracter a exibir
BH = P gina de v¡deo onde o caracter ser exibido
BL = Cor do caracter (apenas em modo gr fico)
CX = N£mero de repeti‡äes
Registradores de retorno:
Nenhum.
Fun‡Æo 0EH
Uso:
Registradores de chamada:
AH = 0EH
AL = Caracter a exibir
BH = P gina de v¡deo onde o caracter ser exibido
BL = Cor a usar (apenas em modo gr fico)
Registradores de retorno:
Nenhum
--------------- // ---------------
5.1.4.3.Interrup‡Æo 16H
Registradores de chamada:
AH = 00H
Registradores de retorno:
Quando se usa esta interrup‡Æo, os programas executam at‚ que uma tecla seja
pressionada. Se ‚ um valor ASCII, ‚ armazenado no registrador AH. Caso
contr rio, o c¢digo ‚ armazenado no registrador AL e AH=0.
Este valor de AL pode ser utilizado quando queremos detectar teclas que nÆo
estÆo diretamente representadas pelo seu valor ASCII, tais como
[ALT][CONTROL].
Fun‡Æo 01h
Uso:
Registradores de chamada:
AH = 01H
Registradores de retorno:
--------------- // ---------------
5.1.4.4.Interrup‡Æo 17H
Sintaxe:
Int 17H
Fun‡Æo 00H
Uso:
Registradores de chamada:
AH = 00H
AL = Caracter a imprimir
DX = Porta de conexÆo
Registradores de retorno:
AH = Estado da impressora
A maioria dos BIOS suportam 3 portas paralelas, havendo alguns que suportam
4.
Fun‡Æo 01h
Uso:
Registradores de chamada:
AH = 01H
DX = Porta
Registradores de retorno:
AH = Status da impressora
Fun‡Æo 02h
Uso:
Registradores de chamada:
AH = 01H
DX = Porta
Registradores de retorno
AH = Status da impressora
2-
3 1 Erro de entrada e sa¡da
4 1 Impressora selecionada
5 1 Fim de papel
6 1 Reconhecimento de comunica‡Æo
7 1 A impressora est pronta para o uso
--------------- // ---------------
Conte£do:
Para uma melhor facilidade, daqui por diante nos referiremos aos Blocos de
Controle de Arquivo como FCBs e aos Canais de Comunica‡Æo como handles.
--------------- // ---------------
5.2.2.M‚todo FCB.
5.2.2.1.Introdu‡Æo
5.2.2.2.Abertura de arquivo
5.2.2.3.Criar um novo arquivo
5.2.2.4.Escrita seq•encial
5.2.2.5.Leitura seq•encial
5.2.2.6.Leitura e escrita rand“mica
5.2.2.7.Fechar um arquivo
--------------- // ---------------
5.2.2.1.INTRODUÇO
op‡Æo.
--------------- // ---------------
5.2.2.2.ABERTURA DE ARQUIVO
--------------- // ---------------
Caso ocorra problema, o valor FFH deve retornar em AL, de outra forma este
registrador conter o valor 0.
--------------- // ---------------
5.2.2.4.ESCRITA SEQšENCIAL
A fun‡Æo 1AH nÆo retorna qualquer estado do disco nem da opera‡Æo. Mas a
fun‡Æo 15H, que usaremos para escrever para o disco, faz isso no registrador
AL. Se este for igual a zero, entÆo nÆo h erro e os campos de registro
corrente e de bloco sÆo atualizados.
--------------- // ---------------
5.2.2.5.LEITURA SEQšENCIAL
--------------- // ---------------
--------------- // ---------------
5.2.2.7.FECHAR UM ARQUIVO
--------------- // ---------------
5.2.3.Canais de comunica‡Æo.
Quando usamos este m‚todo para trabalhar com arquivos, nÆo h distin‡Æo
entre acesso seq•encial ou rand“mico, o arquivo ‚ simplesmente tomado como
uma rede de bytes.
--------------- // ---------------
*****************************************************************************
Conte£do
6.1.Procedimentos
6.2.Macros
6.1.Procedimentos
6.1.1.Defini‡Æo de procedimento
6.1.2.Sintaxe de um procedimento
--------------- // ---------------
6.1.1.Defini‡Æo de um procedimento
--------------- // ---------------
6.1.2.Sintaxe de um procedimento
CALL NomedoProcedimento
Declara‡Æo do procedimento
C¢digo do procedimento
Diretiva de retorno
T‚rmino do procedimento
Por exemplo, se quisermos uma rotina que soma dois bytes armazenados em AH e
AL, e o resultado da soma em BX:
Call Soma
--------------- // ---------------
6.2.Macros
--------------- // ---------------
Declara‡Æo da macro
C¢digo da macro
Diretiva de t‚rmino da macro
PUSH AX
PUSH BX
PUSH DX
MOV AH, 02H
MOV DH, Linha
MOV DL, Coluna
MOV BH, 0
INT 10H
POP DX
POP BX
POP AX
ENDM
Para usar uma macro basta cham -la pelo seu nome, tal como se fosse qualquer
instru‡Æo na linguagem assembly:
Pos 8, 6
--------------- // ---------------
6.2.3.Biblioteca de Macros
Para incluir uma biblioteca num programa, basta colocar a seguinte instru‡Æo
Include NomedoArquivo na parte inicial do programa, antes da declara‡Æo do
modelo de mem¢ria.
Supondo que o arquivo de macros tenha sido salvo com o nome de MACROS.TXT, a
instru‡Æo Include seria utilizada do seguinte modo:
;In¡cio do programa
Include MACROS.TXT
.MODEL SMALL
.DATA
;Os dados vÆo aqui
.CODE
Inicio:
*****************************************************************************
Conte£do:
--------------- // ---------------
Procedimento
Primeiro passo
Por exemplo:
C:\>debug
-n one.com
-l
-u 100 109
0D80:0100 B80600 MOV AX,0006
0D80:0103 BB0400 MOV BX,0004
0D80:0106 01D8 ADD AX,BX
0D80:0108 CD20 INT 20
-
Nota:
-n one.com
-l
Carreg -lo
-u 100 109
Segundo passo
Digite o comando g
Por exemplo:
-g
Primeiro exemplo
-a0100
297D:0100 MOV AX,0006 ;Päe o valor 0006 no registrador AX
297D:0103 MOV BX,0004 ;Päe o valor 0004 no registrador BX
297D:0106 ADD AX,BX ;Adiciona BX ao conte£do de AX
297D:0108 INT 20 ;Finaliza o Programa
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 endere‡o 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 endere‡o 0134
0C1B:0132 JMP 012D ;Salta ao endere‡o 012D
0C1B:0134 INT 20 ;Finaliza o programa
Terceiro exemplo
-a100
297D:0100 MOV AH,01 ;Fun‡Æo para mudar o cursor
297D:0102 MOV CX,0007 ;Formata o cursor
297D:0105 INT 10 ;Chama interrup‡Æo do BIOS
297D:0107 INT 20 ;Finaliza o programa
Quarto exemplo
-a100
297D:0100 MOV AH,01 ;Fun‡Æo 1 (lˆ caractere do teclado)
297D:0102 INT 21 ;Chama interrup‡Æo do DOS
297D:0104 CMP AL,0D ;Compara se o caractere lido ‚ um ENTER
297D:0106 JNZ 0100 ;Se nÆo ‚, lˆ um outro caractere
297D:0108 MOV AH,02 ;Fun‡Æo 2 (escreve um caractere na tela)
297D:010A MOV DL,AL ;Character to write on AL
297D:010C INT 21 ;Chama interrup‡Æo do DOS
297D:010E INT 20 ;Finaliza o programa
Este programa usa a interrup‡Æo 21h do DOS. Usa duas fun‡äes da mesma: a
primeira lˆ um caractere do teclado (fun‡Æo 1) e a segundo escreve um
caractere na tela. O programa lˆ caracteres do teclado at‚ encontrar um
ENTER.
Quinto exemplo
-a100
297D:0100 MOV AH,02 ;Fun‡Æo 2 (escreve um caractere na tela)
297D:0102 MOV CX,0008 ;Päe o valor 0008 no registrador CX
297D:0105 MOV DL,00 ;Päe o valor 00 no registrador DL
297D:0107 RCL BL,1 ;Rotaciona o byte em BL um bit para a esquerda
297D:0109 ADC DL,30 ;Converte o registrador de flag para 1
297D:010C INT 21 ;Chama interrup‡Æo do DOS
297D:010E LOOP 0105 ;Salta se CX > 0 para o endere‡o 0105
297D:0110 INT 20 ;Finaliza o programa
Sexto exemplo
-a100
297D:0100 MOV AH,02 ;Fun‡Æo 2 (escreve um caractere na tela)
297D:0102 MOV DL,BL ;Päe o valor de BL em DL
297D:0104 ADD DL,30 ;Adiciona o valor 30 a DL
297D:0107 CMP DL,3A ;Compara o valor 3A com o conte£do de DL sem afet -lo
;seu valor apenas modifica o estado do flag de carry
297D:010A JL 010F ;salta ao endere‡o 010f, se for menor
297D:010C ADD DL,07 ;Adiciona o valor 07 a DL
297D:010F INT 21 ;Chama interrup‡Æo do DOS
297D:0111 INT 20 ;Finaliza o programa
S‚timo exemplo
-a100
297D:0100 MOV AH,02 ;Fun‡Æo 2 (escreve um caractere na tela)
297D:0102 MOV DL,BL ;Päe o valor de BL em DL
297D:0104 AND DL,0F ;Transporta fazendo AND dos n£meros bit a bit
297D:0107 ADD DL,30 ;Adiciona 30 a Dl
297D:010A CMP DL,3A ;Compara Dl com 3A
297D:010D JL 0112 ;Salta ao endere‡o 0112, se menor
297D:010F ADD DL,07 ;Adiciona 07 a DL
297D:0112 INT 21 ;Chama interrup‡Æo do DOS
297D:0114 INT 20 ;Finaliza o programa
Oitavo exemplo
-a100
297D:0100 MOV AH,02 ;Fun‡Æo 2 (escreve um caractere na tela)
297D:0102 MOV DL,BL ;Päe o valor de BL em DL
297D:0104 MOV CL,04 ;Päe o valor 04 em CL
297D:0106 SHR DL,CL ;Desloca os 4 bits mais altos do n£mero ao nibble mais … direita
297D:0108 ADD DL,30 ;Adiciona 30 a DL
297D:010B CMP DL,3A ;Compara Dl com 3A
297D:010E JL 0113 ;Salta ao endere‡o 0113, se menor
297D:0110 ADD DL,07 ;Adiciona 07 a DL
297D:0113 INT 21 ;Chama interrup‡Æo do DOS
297D:0115 INT 20 ;Finaliza o programa
Nono exemplo
-a100
297D:0100 MOV AH,02 ;Fun‡Æo 2 (escreve um caractere na tela)
297D:0102 MOV DL,BL ;Päe o valor de BL em DL
297D:0104 MOV CL,04 ;Päe o valor 04 em CL
297D:0106 SHR DL,CL ;Desloca os 4 bits mais altos do n£mero ao nibble mais … direita
297D:0108 ADD DL,30 ;Adiciona 30 a DL
297D:010B CMP DL,3A ;Compara Dl com 3A
297D:010E JL 0113 ;Salta ao endere‡o 0113, se menor
297D:0110 ADD DL,07 ;Adiciona 07 a DL
297D:0113 INT 21 ;Chama interrup‡Æo do DOS
297D:0115 MOV DL,BL ;Päe o valor de BL em DL
297D:0117 AND DL,0F ;Transporta fazendo AND dos n£meros bit a bit
297D:011A ADD DL,30 ;Adiciona 30 a DL
D‚cimo exemplo
-a100
-a100
297D:0100 CALL 0200 ;Chama um procedimento
297D:0103 INT 20 ;Finaliza o programa
-a200
297D:0200 PUSH DX ;Päe o valor de DX na pilha
297D:0201 MOV AH,08 ;Fun‡Æo 8
297D:0203 INT 21 ;Chama interrup‡Æo do DOS
297D:0205 CMP AL,30 ;Compara AL com 30
297D:0207 JB 0203 ;Salta se CF ‚ ativado ao endere‡o 0203
297D:0209 CMP AL,46 ;Compara AL com 46
297D:020B JA 0203 ;Salta ao endere‡o 0203, se diferente
297D:020D CMP AL,39 ;Compara AL com 39
297D:020F JA 021B ;Salta ao endere‡o 021B, se diferente
297D:0211 MOV AH,02 ;Fun‡Æo 2 (escreve um caractere na tela)
297D:0213 MOV DL,AL ;Päe o valor de AL em DL
297D:0215 INT 21 ;Chama interrup‡Æo do DOS
297D:0217 SUB AL,30 ;Subtrai 30 de AL
297D:0219 POP DX ;Extrai o valor de DX da pilha
297D:021A RET ;Retorna o controle ao programa principal
297D:021B CMP AL,41 ;Compara AL com 41
297D:021D JB 0203 ;Salta se CF ‚ ativado ao endere‡o 0203
Este programa se mant‚m lendo caracteres at‚ receber um que possa ser
convertido para um n£mero hexadecimal.
--------------- // ---------------
Procedimento:
Primeiro passo
Montar o programa
Por exemplo:
C:\>tasm one.asm
Turbo Assembler Version 2.0 Copyright (c) 1988, 1990 Borland International
C:\>
Isto criar um programa objeto com o mesmo nome do fonte, neste caso:
one.obj
Segundo passo
C:\>tlink one.obj
Turbo Link Version 3.0 Copyright (c) 1987, 1990 Borland International
C:\>
Isto cria o programa execut vel com o mesmo nome do objeto e com extensÆo
diferente, one.exe
Terceiro passo
Primeiro exemplo
Segundo exemplo
WRITE_CHAR PROC
MOV AH,2h ;Fun‡Æo 2h, imprime caracter
INT 21h ;Imprime o caracter que est em DL
RET ;Retorna o controle ao procedimento que chamou
WRITE_CHAR ENDP ;Finaliza o procedimento
END PRINT_A_J ;Finaliza o programa
Terceiro exemplo
TEST_WRITE_HEX PROC
MOV DL,3Fh ;Move o valor 3Fh para o registrador DL
CALL WRITE_HEX ;Chama a sub-rotina
PUBLIC WRITE_HEX
;........................................................;
;Este procedimento converte para hexadecimal o byte ;
;armazenado no registrador DL e mostra o d¡gito ;
;Use:WRITE_HEX_DIGIT ;
;........................................................;
WRITE_HEX PROC
PUSH CX ;coloca na pilha o valor do registrador CX
PUSH DX ;coloca na pilha o valor do registrador DX
MOV DH,DL ;move o valor do registrador DL para o registrador DH
MOV CX,4 ;move o valor 4 para o registrador CX
SHR DL,CL
CALL WRITE_HEX_DIGIT ;mostra na tela o primeiro n£mero hexadecimal
MOV DL,DH ;move o valor do registrador DH para o registrador DL
AND DL,0Fh
CALL WRITE_HEX_DIGIT ;mostra na tela o segundo n£mero hexadecimal
POP DX ;retira da pilha o valor do registrador DX
POP CX ;retira da pilha o valor do registrador CX
RET ;Retorna o controle ao procedimento que chamou
WRITE_HEX ENDP
PUBLIC WRITE_HEX_DIGIT
;......................................................................;
;Este procediento converte os 4 bits mais baixos do registrador DL ;
;para um n£mero hexadecimal e o mostrana tela do computador ;
;Use: WRITE_CHAR ;
;......................................................................;
WRITE_HEX_DIGIT PROC
PUSH DX ;coloca na pilha o valor de DX
CMP DL,10 ;compara se o n£mero de bits ‚ menor do que 10
JAE HEX_LETTER ;se nÆo, salta para HEX_LETER
ADD DL,"0" ;se sim, converte para n£mero
JMP Short WRITE_DIGIT ;escreve o caracter
HEX_LETTER:
ADD DL,"A"-10 ;converte um caracter para hexadecimal
WRITE_DIGIT:
CALL WRITE_CHAR ;imprime o caracter na tela
PUBLIC WRITE_CHAR
;......................................................................;
;Este procedimento imprime um caracter na tela usando o D.O.S. ;
;......................................................................;
WRITE_CHAR PROC
PUSH AX ;Coloca na pilha o valor do registarador AX
MOV AH,2 ;Fun‡Æo 2h
INT 21h ;Interrup‡Æo 21h
POP AX ;Extrai da pilha o valor de AX
RET ;Retorna o controle ao procedimento que chamou
WRITE_CHAR ENDP
Quarto exemplo
TEST_WRITE_DECIMAL PROC
MOV DX,12345 ;Move o valor decimal 12345 para o registrador DX
CALL WRITE_DECIMAL ;Chama o procedimento
MOV AH,4CH ;Fun‡Æo 4Ch
INT 21h ;Interrup‡Æo 21h
TEST_WRITE_DECIMAL ENDP ;Finaliza o procedimento
PUBLIC WRITE_DECIMAL
;.................................................................;
;Este procedimento escreve um n£mero de 16 bit como um n£mero ;
;sem sinal em nota‡Æo decimal ;
;Use: WRITE_HEX_DIGIT ;
;.................................................................;
WRITE_DECIMAL PROC
PUSH AX ;Päe na pilha o valor do registrador AX
PUBLIC WRITE_HEX_DIGIT
;......................................................................;
; ;
;Este procedimento converte os 4 bits mais baixos do registrador DL ;
;num n£mero hexadecimal e os imprime ;
;Use: WRITE_CHAR ;
;......................................................................;
WRITE_HEX_DIGIT PROC
PUSH DX ;Päe na pilha o valor do registrador DX
CMP DL,10 ;Compara o valor 10 com o valor do registrador DL
JAE HEX_LETTER ;se nÆo, salta para HEX_LETER
ADD DL,"0" ;se ‚, converte em d¡gito num‚rico
JMP Short WRITE_DIGIT ;escreve o caracter
HEX_LETTER:
ADD DL,"A"-10 ;converte um caracter para um n£mero hexadecimal
WRITE_DIGIT:
CALL WRITE_CHAR ;mostra o caracter na tela
PUBLIC WRITE_CHAR
;......................................................................;
;Este procedimento imprime um caracter na tela usando uma fun‡Æo D.O.S.;
;......................................................................;
WRITE_CHAR PROC
PUSH AX ;Päe na pilha o valor do registrador AX
MOV AH,2h ;Fun‡Æo 2h
INT 21h ;Interrup‡Æo 21h
POP AX ;Retira da pilha o valor inicial do registrador AX
RET ;Retorna o controle ao procedimento que chamou
WRITE_CHAR ENDP
Quinto exemplo
PRINT_ASCII PROC
MOV DL,00h ;move o valor 00h para o registrador DL
MOV CX,255 ;move o valor decimal 255 para o registrador CX
;usado para fazer um la‡o com 255 intera‡äes
PRINT_LOOP:
CALL WRITE_CHAR ;Chama o procedimento que imprime
INC DL ;Incrementa o valor do registrador DL
LOOP PRINT_LOOP ;Loop para imprimir 10 caracteres
MOV AH,4Ch ;Fun‡Æo 4Ch
INT 21h ;Interrup‡Æo 21h
PRINT_ASCII ENDP ;Finaliza o procedimento
WRITE_CHAR PROC
MOV AH,2h ;Fun‡Æo 2h para imprimir um caracter
INT 21h ;Imprime o caracter que est em DL
Este programa mostra na tela o valor dos 256 caracteres do c¢digo ASCII.
*****************************************************************************
CAPÖTULO 8: BIBLIOGRAFIA
Cr‚ditos:
Basic Assembler
A. Rojas
Ed Computec Editores S.A. de C.V.
Mexico
C - Caixa de Ferramentas
Carlos Augusto P. Gomes
Antonio Carlos Barbosa
Editora •rica