Escolar Documentos
Profissional Documentos
Cultura Documentos
Tutorial Assembly
Tutorial Assembly
---------------
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
***********************************************************************
CAPTULO 1: INTRODUO
Contedo:
1.1.O que h de novo neste material
1.2.Apresentao
1.3.Por que aprender Assembly?
A segunda razo que voc pode ter um controle total sobre o PC ao fazer uso do
assembler.
Uma outra razo que programas assembly so mais rpidos, menores e mais poderosos
do que os criados com outras linguagens.
Ultimamente, o assembler (montador) permite uma otimizao ideal nos
programas, seja no seu tamanho ou execusso.
2.2.CONCEITOS BSICOS
Contedo:
2.2.1.Informaes nos computadores
2.2.1.1.Unidades de informao
Para o PC processar a informao, necessrio que ela esteja em clulas especiais,
chamadas registradores.
Os registradores so grupos de 8 ou 16 flip-flops.
Um flip-flop um dispositivo capaz de armazenar 2 nveis de voltagem, um baixo,
geralmente 0.5 volts, e outro comumente de 5 volts. O nvel baixo de energia no
flip-flop interpretado como desligado ou 0, e o nvel alto, como ligado ou 1.
Estes estados so geralmente conhecidos como bits, que so a menor unidade de
informao num computador.
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 numricos
O sistema numrico que ns usamos diariamente o decimal, mas este sistema no
conveniente para mquinas, pois ali as informaes tm que ser codificadas de modo
a interpretar os estados da corrente (ligado-desligado); este modo de cdigo faz
com que tenhamos que conhecer o clculo posicional que nos permitir expressar um
nmero em qualquer base onde precisarmos dele.
O possvel representar um determinado nmero em qualquer base atravs da seguinte
frmula:
Onde n a posio do dgito, iniciando da direita para a esquerda e
numerando de 0. D o dgito sobre o qual ns operamos e B a base numrica usada.
2.2.1.3.Convertendo nmeros binrios para decimais
Quando trabalhamos com a Linguagem Assembly encontramos por acaso a
necessidade de converter nmeros de um sistema binrio, que usado em
computadores, para o sistema decimal usado pelas pessoas.
O sistema binrio baseado em apenas duas condies ou estados, estar
ligado(1), ou desligado(0), portanto sua base dois.
Para a converso, podemos usar a frmula de valor posicional:
Por exemplo, se tivermos o nmero binrio 10011, tomamos cada dgito da
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 s suas facilidades de operao.
2.2.2.3.Representao de ponto flutuante
Esta representao baseada em notao cientfica, isto , representar um nmero
2.3.PROGRAMA DEBUG
Contedo:
2.3.1.Processo de criao de programas
2.3.2.Registradores da CPU
2.3.3.Programa debug
2.3.4.Estrutura Assembly
2.3.5.Criando um programa assembly simples
2.3.6.Armazenando e carregando os programas
2.3.2.Registradores da CPU.
Para o propsito didtico, vamos focar registradores de 16 bits. A CPU
possui 4 registradores internos, cada um de 16 bits. So eles AX, BX, CX e DX. So
registradores de uso geral e tambm podem ser usados como
registradores de 8 bits. Para tanto devemos referenci-los como, por
exemplo, AH e AL, que so, respectivamente, o byte high e o low do
registrador AX. Esta nomenclatura tambm se aplica para os registradores BX, CX e
DX.
Os registradores, segundo seus respectivos nomes:
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.
Para a criao de um programa em assembler 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. O
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
Para montar um programa no Debug, usado o comando "a" (assemble); quando usamos
este comando, podemos especificar um endereo inicial para o nosso programa como o
parmetro, mas opcional. No caso de omisso, o endereo inicial o especificado
pelos registradores CS:IP, geralmente 0100h, o local em que programas com extenso
.COM devem iniciar. E ser este o local que usaremos, uma vez que o Debug s pode
criar este tipo de programa.
Embora neste momento no seja necessrio darmos um parmetro ao comando "a", isso
recomendvel 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 contedo dos registradores ax e bx, guardando o
resultado em ax e finalmente a instruo nop (nenhuma operao) finaliza o
programa.
No programa debug, a tela se parecer com:
C:\>debug
-a 100
0D62:0100
0D62:0103
0D62:0106
0D62:0108
0D62:0109
mov ax,0002
mov bx,0004
add ax,bx
nop
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
O comando "n" permite-nos nomear o programa.
-n test.com
O comando "rcx" permite-nos mudar o contedo do registrador CX para o valor obtido
como tamanho do arquivo com o comando "h", neste caso 000a.
-rcx
CX 0000
:000a
Finalmente, o comando "w" grava nosso programa no disco, indicando quantos bytes
gravou.
-w
Writing 000A bytes
Para j salvar um arquivo quando carreg-lo, 2 passos so necessrios:
Dar o nome do arquivo a ser carregado.
Carreg-lo usando o comando "l" (load).
Para obter o resultado correto destes passos, necessrio que o programa acima j
esteja criado.
Dentro do Debug, escrevemos o seguinte:
-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.
O Debug sempre carrega os programas na memria no endereo 100h, conforme j
comentamos.
***********************************************************************
CAPTULO 3: PROGRAMAO ASSEMBLY
Contedo:
3.1.Construindo programas em Assembly
3.2.Processo Assembly
3.3.Pequenos programas em Assembly
3.4.Tipos de instrues
3.1.Construindo programas em Assembly.
3.1.1.Software necessrio
3.1.2.Programao Assembly
3.1.1.SOFTWARE NECESSRIO
Para que possamos criar um programa, precisamos de algumas ferramentas:
Primeiro de um editor para criar o programa fonte. Segundo de um montador, um
programa que ir transformar nosso fonte num programa objeto. E, terceiro, de um
linker (ligador) que ir gerar o programa executvel a partir do programa objeto.
O editor pode ser qualquer um que dispusermos. O montador ser o TASM macro
assembler da Borland, e o linker ser o TLINK, tambm da Borland.
Ns devemos criar os programas fonte com a extenso .ASM para
e o transforme no programa objeto, um "formato intermedirio"
chamado porque ainda no um programa executvel e to pouco
linker gera a partir de um programa .OBJ, ou da combinao de
programa executvel, cuja extenso normalmente .EXE, embora
dependendo da forma como for montado e ligado.
3.1.2.PROGRAMAO ASSEMBLY
Para construirmos os programas com o TASM, devemos estruturar o fonte de forma
diferenciada ao que fazamos com o programa debug.
O importante incluir as seguintes diretivas 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
; use ; para
.MODEL SMALL
.STACK
.CODE
mov ah,01h
mov cx,07h
int 10h
mov ah,4ch
int 21h
END
exam1.asm
None
None
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. O
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 acessar 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
acessar a 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.
Clique aqui para obter mais programas
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.
O 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.
Para mover dados h tambm estruturas chamadas pilhas, onde o dado
introduzido com a instruo push e extrado com a instruo pop
Numa pilha o primeiro dado a entrar o ltimo a sair, por exemplo:
PUSH AX
PUSH BX
PUSH CX
Para retornar os valores da pilha referentes cada registrador necessrio
seguir-se a ordem:
POP CX
POP BX
POP AX
Para a comunicao com dispositivos externos o comando de sada usado para o
envio de informaes a uma porta e o comando de entrada usado para receber
informao de uma porta.
A sintaxe do comando de sada:
OUT DX,AX
Onde DX contm o valor da porta que ser usada para a comunicao e AX
contm a informao que ser enviada.
A sintaxe do comando de entrada:
IN AX,DX
Onde AX o registrador onde a informao ser armazenada e DX contm o
endereo da porta de onde chegar a informao.
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 movido e Fonte o lugar onde o dado est.
Os diferentes movimentos de dados permitidos para esta instruo so:
*Destino:
*Destino:
*Destino:
*Destino:
*Destino:
*Destino:
*Destino:
*Destino:
*Destino:
memria.
acumulador.
registrador de segmento.
memria/regitrador.
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.
Instrues de carga.
So instrues especficas para registradores, usadas para carregar bytes ou
cadeias de bytes num registrador.
LODS (LODSB) (LODSW)
LAHF
LDS
LEA
LES
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
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
O equivalente a:
LEA SI,VAR1
O 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.
PUSHF
INSTRUO POP
Propsito: Recuperar uma parte de informao da pilha.
Sintaxe:
POP destino
Esta instruo transfere o ltimo valor armazenado na pilha para o operador de
destino, e incrementa de 2 o registrador SP.
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
Propsito: Extrair os flags armazenados na pilha.
Sintaxe:
POPF
Este comando transfere os bits da palavra armazenada na parte mais alta da pilha
para registrador de flag.
O modo da transferncia como se segue:
BIT
FLAG
0
2
4
6
7
8
9
10
11
CF
PF
AF
ZF
SF
TF
IF
DF
OF
INSTRUO PUSH
Propsito: Coloca uma palavra na pilha.
Sintaxe:
PUSH fonte
A instruo PUSH decrementa de dois o valor de SP e ento transfere o
contedo do operador fonte para o novo endereo desultante no registrador recm
modificado.
O decremento no endereo duplo pelo fato de que quando os valores so
adicionados pilha, que cresce do maior para o menor endereo, logo quando
subramos de 2 o registrador SP o que fazemos incrementar o tamanho da pilha em
dois bytes, que a nica quantidade de informao que a pilha pode manusear em
cada entrada e sada.
INSTRUO PUSHF
Propsito: Colocar os valores dos flags na pilha.
Sintaxe:
PUSHF
Este comando decrementa de 2 o valor do registrador SP e ento o contedo do
registrador de flag transferido para a pilha, no endereo indicado por SP.
Os flags so armazenados na memria da mesma forma que o comando POPF.
tabela:
Fonte
Destino |
Destino
----------------------------1
1
|
1
1
0
|
0
0
1
|
0
0
0
|
0
O resultado desta operao armazenado no operador de destino.
INSTRUO NEG
Propsito: Gera o complemento de 2.
Sintaxe:
NEG destino
Esta instruo gera o complemento de 2 do operador destino e o armazena no mesmo
operador. Por exemplo, if AX armazena o valor 1234H, ento:
NEG AX
Isto far com o que o valor EDCCH fque armazenado no registrador AX.
INSTRUO NOT
Propsito: Faz a negao do operador de destino bit a bit.
Sintaxe:
NOT destino
O resultado armazenado no mesmo operador de destino.
INSTRUO OR
Propsito: Realiza um OU lgico.
Sintaxe:
OR destino,fonte
A instruo OR, faz uma disjuno lgica bit a bit dos dois operadores:
Fonte
Destino
|
Destino
----------------------------------1
1
|
1
1
0
|
1
0
1
|
1
0
0
|
0
INSTRUO TEST
Propsito: Compara logicamente os operadores.
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
Propsito: Realiza um OU exclusivo.
Sintaxe:
XOR destino,fonte
Esta instruo realizxa uma disjuno exclusiva de dois operadores bit a bit.
Fonte
Destino
|
Destino
----------------------------------1
1
|
0
0
0
|
1
0
1
|
1
0
0
|
0
4.2.2.Instrues aritmticas.
So usadas para realizar operaes aritmticas nos operadores.
ADC
ADD
DIV
IDIV
MUL
IMUL
SBB
SUB
INSTRUO ADC
Propsito: Efetuar a soma entre dois operandos com carry.
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
Propsito: Adio de dois operadores.
Sintaxe:
ADD destino,fonte
Esta instruo adiciona dois operadores e armazena o resultado no operador destino.
INSTRUO DIV
Propsito: Diviso sem sinal.
Sintaxe:
DIV fonte
O divisor pode ser um byte ou uma palavra e o operador que dado na
instruo.
Se o divisor de 8 bits, o registrador AX de 16 bits tomado como
dividendo e se o divisor de 16 bits, o par de registradores DX:AX ser tomado
como dividendo, tomando a palavra alta de DX e a baixa de AX.
Se o divisor for um byte, ento o quociente ser armazenado no registrador AL e o
resto em AH. Se for uma palavra, ento o quociente armazenado em AX e o resto em
DX.
INSTRUO IDIV
Propsito: Diviso com sinal.
Sintaxe:
IDIV fonte
Consiste basicamente como a instruo DIV, diferencia-se apenas por realizar a
operao com sinal.
Para os resultados so usados os mesmos registradores da instruo DIV.
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: Multiplico 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.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 par adesviar 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 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 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.
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 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.
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.
O salto feito se PF = 0.
INSTRUOO 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.
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.
CMP destino,fonte
Esta instruo
endereado por
endereado por
sem devolver o
4.3.5.Instrues de flag.
Estas instrues afetam diretamente o contedo dos flags.
CLC
CLD
CLI
CMC
STC
STD
STI
INSTRUO CLC
Propsito: Limpar o flag de carry.
Sintaxe:
CLC
Esta instruo desliga o bit correspondente ao flag de carry. Em outras
palavras, ela o ajusta para zero.
INSTRUO CLD
Propsito: Limpar o flag de endereo.
Sintaxe:
CLD
Esta instruo desliga o bit correspondente ao flag de endereo.
INSTRUO CLI
Propsito: Limpar o flag de interrupo.
Sintaxe:
CLI
Esta instruo desliga o flag de interrupes, desabilitando, deste modo,
interrupes mascarveis.
Uma interrupo mascarvel aquela cujas funes so desativadas quando IF=0.
INSTRUO CMC
Propsito: Complementar o flag de carry.
Sintaxe:
CMC
Esta instruo complementa o estado do flag CF. Se CF = 0 a instruo o
iguala a 1. Se CF = 1, a instruo o iguala a 0.
Poderamos dizer que ela apenas inverte o valor do flag.
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 insterrupo.
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
Contedo
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
5.1.3.Interrupes de software
Interrupes de software podem ser ativadas diretamente por nossos programas
assembly, invocando o nmero da interrupo desejada com a instruo INT.
O uso das interrupes facilita muito a criao dos programas, torna-os
menores. Alm disso, fcil compreend-las e geram boa performance.
Este tipo de interrupes podem ser separadas em duas categorias:
Interrupes do Sistema Operacional DOS e interrupes do BIOS.
A diferena entre ambas que as interrupes do sistema operacional so mais
fceis de usar, mas tambm so mais lentas, uma vez que acessam os servios do
BIOS. Por outro lado, interrupes do BIOS so muito mais rpidas, mas possuem a
desvantagem de serem parte do hardware, o que significa serem especficas
arquitetura do computador em questo.
A escolha sobre qual o tipo de interrupo usar ir depender somente das
caractersticas que voc deseja dar ao seu programa: velocidade (use BIOS),
portabilidade (use DOS).
5.1.4.1.Interrupo 21H
Propsito: Chamar uma diversidade de funes DOS.
Sintaxe:
Int 21H
Nota: Quando trabalhamos com o programa TASM necessrio especificar que o valor
que estamos usando est em hexadecimal.
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.
Funes para mostrar informaes no vdeo.
02H Exibe um caracter
09H Exibe uma cadeia de caracteres
40H Escreve num dispositivo/arquivo
Funes para ler informaes do teclado.
01H Entrada do teclado
0AH Entrada do teclado usando buffer
3FH Leitura de um dispositivo/arquivo
Funes para trabalhar com arquivos.
Nesta seo so apenas especificadas as tarefas de cada funo, para uma referncia
acerca dos conceitos usados, veja Introduo ao gerenciamento de arquivos.
Mtodo FCB
0FH
14H
15H
16H
21H
22H
Abertura de arquivo
Leitura seq encial
Escrita seq encial
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.
Esta funo mostra o caracter cujo cdigo hexadecimal corresponde ao valor
FUNO 09H
Uso:
Mostra uma cadeia de caracteres na tela.
Registradores de chamada:
AH = 09H
DS:DX = Endereo de incio da cadeia de caracteres.
Registradores de retorno:
Nenhum.
Esta funo mostra os caracteres, um por um, a partir do endereo indicado nos
registradores DS:DX at encontrar um caracter $, que interpretado como fim da
cadeia.
O recomendado usar a funo 40H ao invs desta.
FUNO 40H
Uso:
Escrever num dispositivo ou num arquivo.
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
AX = Nmero de bytes escrito
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:
Ler um caracter do teclado e mostr-lo.
Registradores de chamada
AH = 01H
Registradores de retorno:
AL = Caracter lido
O 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
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 sequencial 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 sequencial e arquivo FCB.
Registradores de chamada:
AH = 15H
DS:DX = Ponteiro para um FCB ja aberto.
Registradores de retorno:
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.
O 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 compirmento 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
02H
04H
06H
Atributos
Normal
Hidden
System
Hidden e System
FUNO 3DH
Uso:
Abre um arquivo e retorna um handle.
Registradores de chamada:
AH = 3DH
AL = modo de acesso
DS:DX = Nome do arquivo, no formato ASCII.
Registradores de retorno:
CF = 0 e AX = nmero do handle se no h erros, de outra forma CF = 1 e AX = cdigo
de erro:
01H se a funo no vlida, 02H se o arquivo no foi encontrado, 03H se o caminho
no foi
encontrado, 04H se no h handles disponveis, 05H acesso negado, e 0CH se o cdigo
de acesso no vlido.
O handle retornado de 16 bits.
O cdigo de acesso especificado da seguinte maneira:
BITS
6 5
7
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
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.
02H,
09H,
0AH,
0EH,
Funo 02h
Uso:
Move o cursor na tela do computador usando o modo texto.
Registradores de chamada:
AH = 02H
BH = Pgina de vdeo onde o cursor est posicionado.
DH = linha
DL = 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 mostrado
Atributo do caracter
Nmero de repeties.
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 grfico)
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.
Funo 01h
Uso:
Ler o estado do teclado
Registradores de chamada:
AH = 01H
Registradores de retorno:
Se o registrador de flag zero, significa que h informao no buffer de eclado na
memria. Caso contrrio, o buffer est vazio. Portanto o valor do registrador AH
ser o valor da tecla armazenada no buffer.
5.1.4.4.Interrupo 17H
Propsito: Manusear a entrada e sada da impressora.
Sintaxe:
Int 17H
Esta interrupo usada para enviar caracteres, setar ou ler o estado de uma
impressora.
Funes da interrupo 17h
Funo 00H, imprime um valor ASCII
Funo 01H, seta a impressora
Funo 02H, l estado da impressora
Funo 00H
Uso:
Imprimir um caracter numa impressora.
Registradores de chamada:
AH = 00H
AL = Caracter a imprimir
DX = Porta de conexo
Registradores de retorno:
AH = Estado da impressora
Os valores da porta a colocar no registrador DX so:
LPT1 = 0, LPT2 = 1, LPT3 = 2 ...
O estado da impressora codificado bit a bit como segue:
BIT 1/0 SIGNIFICADO
---------------------------------------0 1 Estado de time-out
1 2 3 1 Erro de entrada e sada
4 1 Impressora selecionada
5 1 Fim de papel
6 1 Reconhecimento de comunicao
7 1 A impressora est pronta para o uso
Os bits 1 e 2 bits no so relevantes
A maioria dos BIOS suportam 3 portas paralelas, havendo alguns que suportam 4.
Funo 01h
Uso:
Setar uma porta paralela.
Registradores de chamada:
AH = 01H
DX = Porta
Registradores de retorno:
AH = Status da impressora
A porta definida no registrador DX pode ser: LPT1=0, LPT2=1, assim por
diante.
O estado da impressora codificado bit a bit como segue:
BIT 1/0 SIGNIFICADO
---------------------------------------0 1 Estado de time-out
1 -
2
3
4
5
6
7
1
1
1
1
1
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 seq encial
5.2.2.5.Leitura seq encial
5.2.2.6.Leitura e escrita randmica
5.2.2.7.Fechar um arquivo
5.2.2.1.INTRODUO
H dois tipos de FCB, o normal, cujo comprimento 37 bytes, e o extendido, com 44
bytes. Neste tutorial iremos assumir o primeiro, ou seja, quando falarmos em FCB,
estaremos fazendo referncia ao tipo normal (37 bytes).
O FCB composto de informaes dadas pelo programador e por informaes que ele
toma diretamente do sistema operacional. Quando estes tipos de arquivos so usados,
s possvel se trabalhar no diretrio corrente, pois FCBs no fornecem suporte ao
sistema de organizao de arquivos atravs de diretrios do DOS.
FCB composto pelos seguintes campos:
POSIO
00H
01H
09H
0CH
0EH
10H
14H
16H
18H
20H
21H
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.5.LEITURA SEQENCIAL
Antes de tudo, devemos definir a rea de transferncia de arquivo ou DTA.
Para a leitura seq encial 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.
6.1.Procedimentos
6.1.1.Definio de procedimento
6.1.2.Sintaxe de um procedimento
6.1.1.Definio de um procedimento
Um procedimento uma coleo de instrues para as quais possvel
direcionar o curso de nosso programa, e uma vez que a execuo destas
instrues do procedimento tenha acabado, o controle retorna para linha que segue
que chamou o procedimento.
Procedimentos nos ajudam a criar programas legveis e fceis de modificar.
Quando se invoca um procedimento, o endereo da prxima instruo do
programa mantido na pilha, de onde recuperado quando do retorno do
procedimento.
6.1.2.Sintaxe de um procedimento
H dois tipos de procedimentos, os intrasegments, que se localizam no mesmo
segmento da instruo que o chama, e os inter segments, que podem se localizar em
diferentes segmentos de memria.
Quando os procedimentos intrasegments so usados, o valor de IP armazenado na
pilha e quando os procedimentos inter segments so usados o valor de CS:IP
armazenado. Lembre-se que o registrador CS indica qual o segmento de cdigo.
A diretiva que chama um procedimento como segue:
CALL NomedoProcedimento
As partes que compem um procedimento so as seguintes:
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
Para declarar um procedimento inter segment, basta substituir a palavra Near para
FAR.
A chamada deste procedimento feito de modo idntico:
Call Soma
Macros oferecem uma grande flexibilidade na programao, comparadas aos
procedimentos.
6.2.Macros
6.2.1.Definio de uma Macro
6.2.2.Sintaxe de uma Macro
6.2.3.Bibliotecas de Macros
6.2.1.Definio de uma Macro
Uma macro um grupo de instrues repetitivas em um programa que so
codificadas apenas uma vez e, assim, poupam espao, podendo ser utilizadas tantas
vezes quantas forem necessrio.
A principal diferena entre uma macro e um procedimento que numa macro possvel
a passagem de parmetros e num procedimento no. No momento em que a macro
executada, cada parmetro substitudo pelo nome ou valor especificado na hora da
chamada.
Podemos dizer, desta forma, que um procedimento uma extenso de um
determinado programa, enquanto que uma macro um mdulo que especifica
funes que podem ser utilizadas por diferentes programas.
Uma outra diferena entre uma macro e um procedimento o modo de chamada de cada
um. Para chamar um procedimento, se faz necessrio a diretiva CALL, por outro lado,
para chamada de macros feita com se fosse uma instruo normal da linguagem
assembly.
6.2.2.Sintaxe de uma Macro
As partes que compem uma macro so as seguintes:
Declarao da macro
Cdigo da macro
Diretiva de trmino da macro
A declarao da macro feita como se segue:
NomeMacro MACRO [parmetro1, parmetro2...]
Do mesmo modo que temos a funcionalidade dos parmetros, possvel tambm a
criao de uma macro que no os possua.
A diretiva de trmino da macro : ENDM
Um exemplo de uma macro para colocar o cursor numa determinada posio da tela:
Pos MACRO
Linha, Coluna
PUSH AX
PUSH BX
PUSH DX
MOV AH,
MOV DH,
MOV DL,
MOV BH,
INT 10H
POP DX
POP BX
POP AX
ENDM
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
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
AX,0006
BX,0004
AX,BX
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
;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
297D:0109
297D:010C
MOV
MOV
MOV
RCL
ADC
INT
AH,02
CX,0008
DL,00
BL,1
DL,30
21
297D:010E
297D:0110
LOOP
INT
0105
20
MOV
MOV
ADD
CMP
AH,02
DL,BL
DL,30
DL,3A
carry
297D:010A
297D:010C
297D:010F
297D:0111
JL
ADD
INT
INT
010F
DL,07
21
20
MOV
MOV
AND
ADD
CMP
JL
ADD
INT
INT
AH,02
DL,BL
DL,0F
DL,30
DL,3A
0112
DL,07
21
20
AH,02
DL,BL
CL,04
DL,CL
;Funo 2 (escreve
;Pe o valor de BL
;Pe o valor 04 em
;Desloca os 4 bits
um caractere na tela)
em DL
CL
mais altos do nmero ao nibble
DL,30
DL,3A
0113
DL,07
21
20
;Adiciona 30 a DL
;Compara Dl com 3A
;Salta ao endereo 0113, se menor
;Adiciona 07 a DL
;Chama interrupo do DOS
;Finaliza o programa
MOV
AH,02
297D:0102
MOV
297D:0104
MOV
297D:0106
SHR
mais direita
297D:0108
ADD
297D:010B
CMP
297D:010E
JL
297D:0110
ADD
297D:0113
INT
297D:0115
MOV
297D:0117
AND
297D:011A
ADD
DL,BL
CL,04
DL,CL
;Pe o valor de BL em DL
;Pe o valor 04 em CL
;Desloca os 4 bits mais altos do nmero ao nibble
DL,30
DL,3A
0113
DL,07
21
DL,BL
DL,0F
DL,30
;Adiciona 30 a DL
;Compara Dl com 3A
;Salta ao endereo 0113, se menor
;Adiciona 07 a DL
;Chama interrupo do DOS
;Pe o valor de BL em DL
;Transporta fazendo AND dos nmeros bit a bit
;Adiciona 30 a DL
297D:011D
297D:0120
297D:0122
297D:0125
297D:0127
DL,3A
0125
DL,07
21
20
;Compara Dl com 3A
;Salta ao endereo 0125, se menor
;Adiciona 07 a DL
;Chama interrupo do DOS
;Finaliza o programa
CMP
JL
ADD
INT
INT
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
297D:020B
297D:020D
297D:020F
PUSH
MOV
INT
CMP
JB
CMP
JA
CMP
JA
DX
AH,08
21
AL,30
0203
AL,46
0203
AL,39
021B
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
MOV
MOV
INT
SUB
POP
RET
CMP
JB
MOV
MOV
INT
SUB
POP
RET
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 um programa objeto com o mesmo nome do fonte, neste caso:
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 returna 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
MOV AH,2h
INT 21h
RET
WRITE_CHAR
ENDP
END PRINT_A_J
;coloca
;coloca
;move o
;move o
PUBLIC WRITE_HEX_DIGIT
;......................................................................;
;Este procediento converte os 4 bits mais baixos do registrador DL
;
;para um nmero hexadecimal e o mostrana 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
POP DX
;Retorna o valor em modo reverso
CALL WRITE_HEX_DIGIT ;Chama o procedimento
LOOP WRITE_DIGIT_LOOP ;loop
END_DECIMAL:
POP SI
;retira da pilha o valor do registrador
POP DX
;retira da pilha o valor do registrador
POP CX
;retira da pilha o valor do registrador
POP AX
;retira da pilha o valor do registrador
RET
;Retorna o controle ao procedimento que
WRITE_DECIMAL
ENDP ;Finaliza o procedimento
SI
DX
CX
AX
chamou
PUBLIC WRITE_HEX_DIGIT
;......................................................................;
;
;
;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
PROC
;move o valor 00h para o registrador DL
MOV CX,255
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.