Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila Assembly
Apostila Assembly
*****************************************************************************
*
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.
****************************************************************************
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.2.Apresentao:
Este tutorial destina-se quelas pessoas que nunca tiveram contato com a
Linguagem Assembly.
A segunda razo que voc pode ter um controle total sobre o PC ao fazer
uso do assembler.
Nosso intuito oferecer um modo simples para que voc consiga aprender
*****************************************************************************
--------------- // ---------------
Contedo:
2.1.1.Processador Central
2.1.2.Memria Principal
2.1.3.Unidades de Entrada e Sada
Sistema Computacional.
2.1.1.Processador Central.
2.1.2.Memria Principal.
Cada uma das clulas pode conter um valor numrico e capaz de ser
endereada, isto , pode ser identificada de forma singular em relao s
outras clulas pelo uso de um nmero ou endereo.
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.
--------------- // ---------------
2.2.CONCEITOS BSICOS
Contedo:
2.2.1.Informao no computador:
2.2.1.1.Unidades de informao
2.2.1.2.Sistemas numricos
2.2.1.3.Convertendo nmeros binrios para decimais
2.2.1.4.Convertendo nmeros decimais para binrios
2.2.1.5.Sistema hexadecimal
2.2.1.1.Unidades de informao
2.2.1.2.Sistemas numricos
Binary:
Decimal:
= 1
+ 2 + 0 + 0 + 16 = 19 decimal.
2.2.1.5.Sistema hexadecimal
10;1011
0010;1011
0010=2;1011=11
isto seria um erro, uma vez que os nmeros em hexa maiores que 9 e
menores
que 16 so representados pelas letras A,B,...,F. Logo, obtemos como
resultado:
--------------- // ---------------
2.2.2.1.Cdigo ASCII
2.2.2.2.Mtodo BCD
2.2.2.3.Representao de ponto flutuante
2.2.2.1.Cdigo ASCII
0, ou seja, desligado.
2.2.2.2.Mtodo BCD
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,
O expoente negativo, por outro lado, indica o nmero de casas que o ponto
decimal deve se locomover para a esquerda.
--------------- // ---------------
2.3.PROGRAMA DEBUG
Contedo:
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 Cdigo
BP Registrador Apontador da Base
SI Registrador de ndice Fonte
DI Registrador de ndice Destino
SP Registrador Apontador de Pilha
IP Registrador Apontador da Prxima Instruo
F Registrador de Flag
2.3.3.Programa Debug.
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.
C:/>Debug [Enter]
-
-r[Enter]
CS:
0D62:0101 803ED3DF00
CS:DFD3=03
CMP
-rbx
BX 0000
2.3.4.Estrutura Assembly.
add ah bh
Aqui "add" o comando a ser executado, neste caso uma adio, e "ah"
bem
como "bh" so os parmetros.
Por exemplo:
mov al, 25
add al,[170]
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 contedo dos registradores ax e bx,
guardando o resultado em ax e finalmente a instruo nop (nenhuma
operao)
finaliza o programa.
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
MOV
BX,0004
-t
ADD
AX,BX
-t
NOP
No seria prtico ter que digitar o programa cada vez que inicissemos o
Debug. Ao invs disso, podemos armazen-lo no disco. S que o mais
interessante nisso que um simples comando de salvar cria um arquivo
com a
extenso .COM, ou seja, executvel - sem precisarmos efetuar os processos
de
montagem e ligao, como veremos posteriormente com o TASM.
-h 10a 100
020a 000a
-n test.com
-rcx
CX 0000
:000a
-w
Writing 000A bytes
-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
memria. O que ele faz desmontar o cdigo e mostr-lo em assembly. Os
parmetros indicam ao Debug os endereos inicial e final a serem
desmontados.
*****************************************************************************
Contedo:
--------------- // ---------------
3.1.1.Software necessrio
3.1.2.Programao Assembly
3.1.1.SOFTWARE NECESSRIO
normalmente .EXE, embora possa ser .COM dependendo da forma como for
montado
e ligado.
3.1.2.PROGRAMAO ASSEMBLY
.MODEL SMALL
Define o melo de memria a usar em nosso programa
.CODE
Define as instrues do programa, relacionado ao segmento de cdigo
.STACK
Reserva espao de memria para as instrues 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
.CODE
;interrupo 10h
;interrupo 21h
;finaliza o cdigo do programa
Segundo passo
Terceiro passo
Exemplo:
C:\>tasm exam1.asm
Turbo Assembler Version 2.0 Copyright (c) 1988, 1990 Borland
International
None
O TASM s pode criar programas no formato .OBJ, que ainda no 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 equivalncia
3.2.1.SEGMENTOS
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:
3.2.2.TABELAS DE EQUIVALNCIA
Cada uma das partes numa linha de cdigo assembly conhecida como
token,
por exemplo:
MOV AX,Var
--------------- // ---------------
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
;interrupo 21h
;interrupo 21h
;finaliza o programa
Segundo passo
Terceiro passo
C:\>tasm exam2.asm
Turbo Assembler Version 2.0 Copyright (c) 1988, 1990 Borland
International
None
Passes:
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 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
endereos definidos por DS:SI como o grupo de dados a mover e ES:DI como
a
nova localizao dos dados.
PUSH AX
PUSH BX
PUSH CX
POP CX
POP BX
POP AX
OUT DX,AX
IN AX,DX
As instrues usadas para operaes algbricas so: para adio add, para
subtrao sub, para multiplicao mul e para diviso div.
*****************************************************************************
Contedo:
--------------- // ---------------
Contedo:
4.1.1.Instrues de transferncia
4.1.2.Instrues de carga
4.1.3.Instrues de pilha
4.1.1.Instrues de transferncia.
MOV
MOVS (MOVSB) (MOVSW)
INSTRUO MOV
Sintaxe:
MOV Destino,Fonte
Destino o lugar para onde o dado ser movido e Fonte o lugar onde o
dado
est.
*Destino: memria.
*Destino: acumulador.
Fonte: acumulador
Fonte: memria
*Destino: registrador.
Fonte: registrador
*Destino: registrador.
Fonte: memria
*Destino: memria.
*Destino: registrador.
*Destino: memria.
Fonte: registrador
Fonte: dado imediato
Fonte: dado imediato
Exemplo:
MOV AX,0006h
MOV BX,AX
MOV AX,4C00h
INT 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.
Sintaxe:
MOVS
Instrues de carga.
Sintaxe:
LODS
INSTRUO LAHF
Sintaxe:
LAHF
Esta instruo til para verificar o estado dos flags durante a execuo
do nosso programa.
SF ZF ?? AF ?? PF ?? CF
INSTRUO LDS
Sintaxe:
LDS destino,fonte
INSTRUO LEA
Sintaxe:
LEA destino,fonte
Para ilustrar uma das facilidades que temos com este comando, vejamos:
equivalente a:
LEA SI,VAR1
muito provvel que para o programador muito mais fcil criar programas
grandes usando este ltimo formato.
INSTRUO LES
Sintaxe:
LES destino,fonte
POP
POPF
PUSH
PUSHF
INSTRUO POP
Sintaxe:
POP destino
Este incremento duplo pelo fato de que a pilha do mais alto endereo de
memria 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 subtrado do
tamanho real da pilha.
INSTRUO POPF
Sintaxe:
POPF
BIT
FLAG
CF
PF
AF
ZF
SF
TF
IF
10
DF
11
OF
vimos anteriormente.
INSTRUO PUSH
Sintaxe:
PUSH fonte
INSTRUO PUSHF
Sintaxe:
PUSHF
--------------- // ---------------
Contedo:
4.2.1.Instrues lgicas
4.2.2.Instrues aritmticas
4.2.1.Instrues lgicas
AND
NEG
NOT
OR
TEST
XOR
INSTRUO AND
Sintaxe:
AND destino,fonte
Fonte
Destino | Destino
----------------------------1
INSTRUO NEG
Sintaxe:
NEG destino
NEG AX
Isto far com o que o valor EDCCH fque armazenado no registrador AX.
INSTRUO NOT
Sintaxe:
NOT destino
INSTRUO OR
Sintaxe:
OR destino,fonte
A instruo OR, faz uma disjuno lgica bit a bit dos dois operadores:
Fonte
Destino
Destino
----------------------------------1
INSTRUO TEST
Sintaxe:
TEST destino,fonte
Realiza uma conjuno, bit a bit, dos operadores, mas difere da instruo
AND, uma vez que no coloca o resultado no operador de destino. Tem
efeito
sobre o registrador de flag.
INSTRUO XOR
Sintaxe:
XOR destino,fonte
Fonte
Destino
Destino
----------------------------------1
4.2.2.Instrues aritmticas.
ADC
ADD
DIV
IDIV
MUL
IMUL
SBB
SUB
INSTRUO ADC
Sintaxe:
ADC destino,fonte
Esta instruo efetua a soma entre dois operandos, mais o valor do flag CF,
existente antes da operao. Apenas o operando destino e os flags so
afetados.
INSTRUO ADD
Sintaxe:
ADD destino,fonte
INSTRUO DIV
Sintaxe:
DIV fonte
INSTRUO IDIV
Sintaxe:
IDIV fonte
INSTRUO MUL
Sintaxe:
MUL fonte
INSTRUO IMUL
Sintaxe:
IMUL fonte
Esta instruo faz o mesmo que a anterior, difere apenas pela incluso do
sinal.
INSTRUO SBB
Sintaxe:
SBB destino,fonte
INSTRUO SUB
Propsito: Subtrao.
Sintaxe:
SUB destino,fonte
--------------- // ---------------
Contedo:
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.
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
Sintaxe:
JMP destino
INSTRUO JA (JNBE)
Sintaxe:
JA smbolo
Sintaxe:
JAE smbolo
INSTRUO JB (JNAE)
Sintaxe:
JB smbolo
Sintaxe:
JBE smbolo
INSTRUO JE (JZ)
Sintaxe:
JE smbolo
Sintaxe:
JNE smbolo
INSTRUO JG (JNLE)
Sintaxe:
JG smbolo
Sintaxe:
JGE smbolo
INSTRUO JL (JNGE)
Sintaxe:
JL smbolo
A instruo salta se est less than, se est not larger than ou se est
equal.
Sintaxe:
JLE smbolo
A instruo salta se est less than, se est equal ou se est not larger.
INSTRUO JC
Sintaxe:
JC smbolo
O salto feito se CF = 1.
INSTRUO JNC
Sintaxe:
JNC smbolo
O salto feito se CF = 0.
INSTRUO JNO
Sintaxe:
JNO smbolo
O salto feito se OF = 0.
Sintaxe:
JNP smbolo
O salto feito se PF = 0.
INSTRUO JNS
Sintaxe:
JNP smbolo
O salto feito se SF = 0.
INSTRUO JO
Sintaxe:
JO smbolo
O salto feito se OF = 1.
INSTRUO JP (JPE)
Sintaxe:
JP smbolo
O salto feito se PF = 1.
INSTRUO JS
Sintaxe:
JS smbolo
--------------- // ---------------
LOOP
LOOPE
LOOPNE
INSTRUO LOOP
Sintaxe:
LOOP smbolo
INSTRUO LOOPE
Sintaxe:
LOOPE smbolo
INSTRUO LOOPNE
Sintaxe:
LOOPNE smbolo
--------------- // ---------------
4.3.3.Instrues contadoras.
DEC
INC
DEC INSTRUCTION
Sintaxe:
DEC destino
INSTRUO INC
Sintaxe:
INC destino
--------------- // ---------------
4.3.4.Instrues de comparao.
CMP
CMPS (CMPSB) (CMPSW)
INSTRUO CMP
Sintaxe:
CMP destino,fonte
Sintaxe:
CMP destino,fonte
--------------- // ---------------
4.3.5.Instrues de flag.
CLC
CLD
CLI
CMC
STC
STD
STI
INSTRUO CLC
Sintaxe:
CLC
INSTRUO CLD
Sintaxe:
CLD
INSTRUO CLI
Sintaxe:
CLI
INSTRUO CMC
Sintaxe:
CMC
INSTRUO STC
Sintaxe:
STC
INSTRUO STD
Sintaxe:
STD
INSTRUO STI
Sintaxe:
STI
*****************************************************************************
Contedo:
5.1.Interrupes
5.2.Gerenciamento de arquivos
--------------- // ---------------
Contedo
durante um segundo.
--------------- // ---------------
--------------- // ---------------
5.1.3.Interrupes de software
--------------- // ---------------
Contedo
--------------- // ---------------
5.1.4.1.Interrupo 21H
Sintaxe:
Int 21H
Esta interrupo tem muitas funes, para acessar cada uma delas
necessrio que o nmero correspondente da funo esteja no registrador AH
no
momento da chamada da interrupo.
Mtodo FCB
Handles
FUNO 02H
Uso:
Registradores de chamada:
AH = 02H
DL = Valor de caracter a ser mostrado.
Registradores de retorno:
Nenhum.
FUNO 09H
Uso:
Registradores de chamada:
AH = 09H
DS:DX = Endereo de incio da cadeia de caracteres.
Registradores de retorno:
Nenhum.
FUNO 40H
Uso:
Registradores de chamada:
AH = 40H
BX = Nmero do handle
CX = Quantidade de bytes a gravar
DS:DX = rea onde est o dado
Registradores de retorno:
CF = 0 se no houve erro
CF = 1 se houve erro
AX = Cdigo de erro
Para usar esta funo para mostrar a informao na tela, faa o registrador
BX ser igual a 1, que o valor default para o vdeo no DOS.
FUNO 01H
Uso:
Registradores de chamada
AH = 01H
Registradores de retorno:
AL = Caracter lido
FUNO 0AH
Uso:
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.
FUNO 3FH
Uso:
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:
FUNO 0FH
Uso:
Registradores de chamada:
AH = 0FH
DS:DX = Ponteiro para um FCB
Registradores de retorno:
FUNO 14H
Uso:
Registradores de chamada:
AH = 14H
DS:DX = Ponteiro para um FCB j aberto.
Registradores de retorno:
FUNO 15H
Uso:
Registradores de chamada:
AH = 15H
DS:DX = Ponteiro para um FCB ja aberto.
Registradores de retorno:
FUNO 16H
Uso:
AH = 16H
DS:DX = Ponteiro para um FCB j aberto.
Registradores de retorno:
FUNO 21H
Uso:
Registradores de chamada:
AH = 21H
DS:DX = Ponteiro para FCB aberto.
Registradores de retorno:
FUNO 22H
Uso:
Registradores de chamada:
AH = 22H
DS:DX = Ponteiro para um FCB aberto.
Registradores de retorno:
FUNO 3CH
Uso:
Registradores de chamada:
AH = 3CH
CH = Atributo do arquivo
DS:DX = Nome do arquivo, no formato ASCII.
Registradores de retorno:
seguinte modo:
Valor
Atributos
00H
Normal
02H
Hidden
04H
System
06H
Hidden e System
FUNO 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
FUNO 3EH
Uso:
Registradores de chamada:
AH = 3EH
Registradores de retorno:
FUNO 3FH
Uso:
--------------- // ---------------
5.1.4.2.Interrupo 10h
Sintaxe:
Int 10H
Esta interrupo tem vrias funes, todas para entrada e sada de vdeo.
Funo 02h
Uso:
Registradores de chamada:
AH = 02H
DH = linha
DL = coluna
Registradores de retorno:
Nenhum.
Funo 09h
Uso:
Registradores de chamada:
AH = 09H
AL = Caracter a exibir
BH = Pgina de vdeo, onde o caracter ser mostrado
BL = Atributo do caracter
CX = Nmero de repeties.
Registradores de retorno:
Nenhum
Funo 0Ah
Uso:
Registradores de chamada:
AH = 0AH
AL = Caracter a exibir
BH = Pgina de vdeo onde o caracter ser exibido
BL = Cor do caracter (apenas em modo grfico)
CX = Nmero de repeties
Registradores de retorno:
Nenhum.
Funo 0EH
Uso:
Registradores de chamada:
AH = 0EH
AL = Caracter a exibir
BH = Pgina de vdeo onde o caracter ser exibido
BL = Cor a usar (apenas em modo grfico)
Registradores de retorno:
Nenhum
--------------- // ---------------
5.1.4.3.Interrupo 16H
Registradores de chamada:
AH = 00H
Registradores de retorno:
Este valor de AL pode ser utilizado quando queremos detectar teclas que
no
esto diretamente representadas pelo seu valor ASCII, tais como
[ALT][CONTROL].
Funo 01h
Uso:
Registradores de chamada:
AH = 01H
Registradores de retorno:
--------------- // ---------------
5.1.4.4.Interrupo 17H
Sintaxe:
Int 17H
Funo 00H
Uso:
Registradores de chamada:
AH = 00H
AL = Caracter a imprimir
DX = Porta de conexo
Registradores de retorno:
AH = Estado da impressora
Funo 01h
Uso:
Registradores de chamada:
AH = 01H
DX = Porta
Registradores de retorno:
AH = Status da impressora
Funo 02h
Uso:
Registradores de chamada:
AH = 01H
DX = Porta
Registradores de retorno
AH = Status da impressora
--------------- // ---------------
Contedo:
Para uma melhor facilidade, daqui por diante nos referiremos aos Blocos de
Controle de Arquivo como FCBs e aos Canais de Comunicao como
handles.
--------------- // ---------------
5.2.2.Mtodo FCB.
5.2.2.1.Introduo
5.2.2.2.Abertura de arquivo
5.2.2.3.Criar um novo arquivo
5.2.2.4.Escrita seqencial
5.2.2.5.Leitura seqencial
5.2.2.6.Leitura e escrita randmica
5.2.2.7.Fechar um arquivo
--------------- // ---------------
5.2.2.1.INTRODUO
POSIO
COMPRIMENTO SIGNIFICADO
00H
1 Byte
Drive
01H
8 Bytes
Nome do arquivo
09H
3 Bytes
Extenso
0CH
2 Bytes
Nmero do bloco
0EH
2 Bytes
Tamanho do registro
10H
4 Bytes
Tamanho do arquivo
14H
2 Bytes
Data de criao
16H
2 Bytes
Hora de criao
18H
8 Bytes
Reservado
20H
1 Bytes
Registro corrente
21H
4 Bytes
Registro randmico
--------------- // ---------------
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 SEQENCIAL
--------------- // ---------------
5.2.2.5.LEITURA SEQENCIAL
--------------- // ---------------
--------------- // ---------------
5.2.2.7.FECHAR UM ARQUIVO
--------------- // ---------------
5.2.3.Canais de comunicao.
--------------- // ---------------
*****************************************************************************
Contedo
6.1.Procedimentos
6.2.Macros
6.1.Procedimentos
6.1.1.Definio de procedimento
6.1.2.Sintaxe de um procedimento
--------------- // ---------------
6.1.1.Definio de um procedimento
--------------- // ---------------
6.1.2.Sintaxe de um procedimento
CALL NomedoProcedimento
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:
; Declarao do Procedimento
; Contedo do Procedimento...
Mov BL, AH
Mov AH, 00
Add BX, AX
Ret
Soma EndP
; Diretiva de retorno
; Fim do Procedimento
Call Soma
--------------- // ---------------
6.2.Macros
--------------- // ---------------
Declarao da macro
Cdigo da macro
Diretiva de trmino da macro
POP AX
ENDM
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
;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
*****************************************************************************
Contedo:
--------------- // ---------------
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
0D80:0108 CD20
INT
AX,BX
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
297D:0103
MOV
BX,0004
297D:0106
ADD
AX,BX
;Adiciona BX ao contedo 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 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
0C1B:012F DEC CX
;Mostra a string
;Subtrai 1 de CX
Terceiro exemplo
-a100
297D:0100
MOV
AH,01
297D:0102
MOV
297D:0105
INT
10
297D:0107
INT
20
;Finaliza o programa
Quarto exemplo
-a100
297D:0100
MOV
AH,01
297D:0102
INT
297D:0104
CMP
297D:0106
JNZ
297D:0108
MOV
AH,02
297D:010A
MOV
DL,AL
;Character to write on AL
297D:010C
INT
21
297D:010E
INT
20
;Finaliza o programa
21
AL,0D
0100
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
MOV
AH,02
297D:0102
MOV
297D:0105
MOV
DL,00
297D:0107
esquerda
RCL
BL,1
297D:0109
ADC
DL,30
297D:010C
INT
297D:010E
LOOP
297D:0110
INT
21
0105
20
Sexto exemplo
-a100
297D:0100
MOV
AH,02
297D:0102
MOV
DL,BL
;Pe o valor de BL em DL
297D:0104
ADD
DL,30
;Adiciona o valor 30 a DL
297D:0107
sem afet-lo
CMP
DL,3A
JL
010F
297D:010C
ADD
297D:010F
INT
21
297D:0111
INT
20
;Finaliza o programa
DL,07
Stimo exemplo
-a100
297D:0100
MOV
AH,02
297D:0102
MOV
DL,BL
;Pe o valor de BL em DL
297D:0104
bit
AND
DL,0F
297D:0107
ADD
DL,30
;Adiciona 30 a Dl
297D:010A
CMP
DL,3A
;Compara Dl com 3A
297D:010D
JL
297D:010F
ADD
297D:0112
INT
21
297D:0114
INT
20
;Finaliza o programa
0112
DL,07
;Adiciona 07 a DL
Oitavo exemplo
-a100
297D:0100
MOV
AH,02
297D:0102
MOV
DL,BL
;Pe o valor de BL em DL
297D:0104
MOV
CL,04
;Pe o valor 04 em CL
297D:0106
SHR
DL,CL
nibble mais direita
297D:0108
ADD
DL,30
;Adiciona 30 a DL
297D:010B
CMP
DL,3A
;Compara Dl com 3A
297D:010E
JL
297D:0110
ADD
297D:0113
INT
21
297D:0115
INT
20
;Finaliza o programa
0113
DL,07
Nono exemplo
-a100
297D:0100
MOV
297D:0102
MOV
297D:0104
MOV
297D:0106
SHR
DL,CL ;Desloca os 4 bits mais altos do nmero ao
nibble mais direita
297D:0108
ADD
DL,30 ;Adiciona 30 a DL
297D:010B
CMP
297D:010E
JL
297D:0110
ADD
297D:0113
INT
297D:0115
MOV
297D:0117
AND
297D:011A
ADD
DL,30 ;Adiciona 30 a DL
297D:011D
CMP
297D:0120
JL
297D:0122
ADD
297D:0125
INT
21
297D:0127
INT
20
;Finaliza o programa
0113
DL,07 ;Adiciona 07 a DL
21
0125
DL,07 ;Adiciona 07 a DL
Dcimo exemplo
-a100
297D:0100
MOV
297D:0102
INT
297D:0104
MOV
297D:0106
SUB
DL,30 ;Subtrai 30 de DL
297D:0109
CMP
297D:010C
JLE
297D:010E
SUB
DL,07 ;Subtrai 07 de DL
297D:0111
MOV
297D:0113
SHL
297D:0115
INT
21
297D:0117
SUB
AL,30 ;Subtrai 30 de AL
297D:0119
CMP
297D:011B
JLE
297D:011D
SUB
AL,07 ;Subtrai 07 de AL
297D:011F
ADD
DL,AL ;Adiciona AL a DL
297D:0121
INT
21
0111
011F
20
;Finaliza o programa
-a100
297D:0100
CALL
297D:0103
INT
;Finaliza o programa
-a200
297D:0200
PUSH
DX
297D:0201
MOV
AH,08 ;Funo 8
297D:0203
INT
21
297D:0205
CMP
297D:0207
JB
297D:0209
CMP
297D:020B
JA
297D:020D
CMP
297D:020F
JA
297D:0211
MOV
297D:0213
MOV
297D:0215
INT
297D:0217
SUB
AL,30 ;Subtrai 30 de AL
297D:0219
POP
DX
297D:021A
RET
297D:021B
CMP
297D:021D
JB
297D:021F
MOV
297D:022
MOV
21
297D:0223
INT
21
297D:0225
SUB
AL,37 ;Subtrai 37 de AL
297D:0227
POP
DX
297D:0228
RET
--------------- // ---------------
Procedimento:
Primeiro passo
Montar o programa
Por exemplo:
C:\>tasm one.asm
Turbo Assembler Version 2.0 Copyright (c) 1988, 1990 Borland
International
None
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:\>
Terceiro passo
Primeiro exemplo
mov AH,1h
;Funo 1 do DOS
Int 21h
mov DL,AL
sub DL,30h
cmp DL,9h
jle digit1
sub DL,7h
digit1:
mov CL,4h
shl DL,CL
int 21h
sub AL,30h
cmp AL,9h
jle digit2
sub AL,7h
digit2:
add DL,AL
mov AH,4Ch
Int 21h
End
;finaliza o programa
Segundo exemplo
.code
PRINT_A_J
PROC
MOV DL,'A'
MOV CX,10
WRITE_CHAR
PROC
MOV AH,2h
INT 21h
RET
WRITE_CHAR
Terceiro exemplo
TEST_WRITE_HEX
PROC
MOV DL,3Fh
;Funo 4Ch
;Retorna o controle ao DOS
PUBLIC WRITE_HEX
;........................................................;
;Este procedimento converte para hexadecimal o byte
;armazenado no registrador DL e mostra o dgito
;Use:WRITE_HEX_DIGIT
;
;
;........................................................;
WRITE_HEX
PROC
PUSH CX
PUSH DX
MOV DH,DL
MOV CX,4
SHR DL,CL
CALL WRITE_HEX_DIGIT ;mostra na tela o primeiro nmero hexadecimal
MOV DL,DH
AND DL,0Fh
CALL WRITE_HEX_DIGIT ;mostra na tela o segundo nmero hexadecimal
POP DX
POP CX
RET
WRITE_HEX ENDP
PUBLIC WRITE_HEX_DIGIT
;......................................................................;
;Este procediento converte os 4 bits mais baixos do registrador DL
;......................................................................;
WRITE_HEX_DIGIT
PROC
PUSH DX
CMP DL,10
JAE HEX_LETTER
ADD DL,"0"
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
;Funo 2h
INT 21h
;Interrupo 21h
POP AX
RET
WRITE_CHAR ENDP
Quarto exemplo
TEST_WRITE_DECIMAL
MOV DX,12345
PROC
;Move o valor decimal 12345 para o registrador DX
;Funo 4Ch
;Interrupo 21h
PUBLIC WRITE_DECIMAL
;.................................................................;
;Este procedimento escreve um nmero de 16 bit como um nmero
;
;
;.................................................................;
WRITE_DECIMAL
PROC
;divizo entre SI
;incrementa CX
POP DX
POP CX
POP AX
RET
PUBLIC WRITE_HEX_DIGIT
;......................................................................;
;
;
;
;......................................................................;
WRITE_HEX_DIGIT
PROC
PUSH DX
CMP DL,10
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
RET
WRITE_CHAR ENDP
Quinto exemplo
PRINT_ASCII
PROC
MOV DL,00h
MOV CX,255
;Funo 4Ch
;Interrupo 21h
PRINT_ASCII
WRITE_CHAR
PROC
MOV AH,2h
INT 21h
RET
WRITE_CHAR
Este programa mostra na tela o valor dos 256 caracteres do cdigo ASCII.
*****************************************************************************
CAPTULO 8: BIBLIOGRAFIA
Crditos:
Referncias Bibliogrficas:
Basic Assembler
A. Rojas
C - Caixa de Ferramentas
Carlos Augusto P. Gomes
Antonio Carlos Barbosa
Editora rica