Escolar Documentos
Profissional Documentos
Cultura Documentos
Tutorial Assembly PDF
Tutorial Assembly PDF
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.2.Apresentao:
Este tutorial destina-se quelas pessoas que nunca tiveram contato com a Linguagem
Assembly.
Uma outra razo que programas assembly so mais rpidos, menores e mais poderosos
do que os criados com outras linguagens.
Contedo:
2.1.1.Processador Central
2.1.2.Memria Principal
2.1.3.Unidades de Entrada e Sada
2.1.4.Unidades de Memria Auxiliar
Sistema Computacional.
2.1.1.Processador Central.
O tambm conhecido por CPU ou Unidade Central de Processamento, que por sua vez
composta pela unidade de controle e unidade de lgica e aritmtica.
Sua funo consiste na leitura e escrita do contedo das clulas de memria,
regular o trfego de dados entre as clulas de memria e registradores especiais, e
decodificar e executar as instrues de um programa.
O processador tem uma srie de clulas de memria usadas com frequncia e, dessa
forma, so partes da CPU. Estas clulas so conhecidas com o nome de registradores.
Um processador de um PC possui cerca de 14 registradores.
Como os PCs tem sofrido evoluo veremos que podemos manipular registradores de 16
ou 32 bits.
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.
Algumas das mais comuns unidades de entrada so o teclado e o mouse. As mais comuns
unidades de sada so a tela do monitor e a impressora.
2.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
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
Binary: 1 1 0 0 1
= 1 + 2 + 0 + 0 + 16 = 19 decimal.
H vrios mtodos para se converter nmeros decimais para binrio; apenas um ser
analizado aqui. Naturalmente a converso com uma calculadora cientfica muito
mais fcil, mas nem sempre podemos contar com isso, logo o mais conveniente , ao
menos, sabermos uma frmula para faz-la.
Para construir o equivalente binrio de 43, vamos pegar os restos obtidos de baixo
para cima, assim temos 101011.
2.2.1.5.Sistema hexadecimal
Tomando como exemplo o nmero binrio 101011, vamos dividi-lo em grupos de 4 bits:
10;1011
0010;1011
A seguir, tomamos cada grupo como um nmero independente e consideramos o seu valor
decimal:
0010=2;1011=11
Entretanto, observa-se que no podemos representar este nmero como 211, 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
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.
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, com o
mtodo BCD podemos representar dgitos de 0 a 99. Com o binrio, vemos que o
alcance maior, de 0 a 255.
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. O
importante observar isso, pois deste modo os programas .COM no so relocveis.
C:/>Debug [Enter]
-
-r[Enter]
-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]
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.
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
instruo:
-t
-t
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.
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
-n test.com
-rcx
CX 0000
:000a
Finalmente, o comando "w" grava nosso programa no disco, indicando quantos bytes
gravou.
-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
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 que o TASM reconhea
e o transforme no programa objeto, um "formato intermedirio" do programa, assim
chamado porque ainda no um programa executvel e to pouco um programa fonte. O
linker gera a partir de um programa .OBJ, ou da combinao de vrios deles, um
programa executvel, cuja extenso 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
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 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:
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 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.
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
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 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
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.
PUSH AX
PUSH BX
PUSH CX
POP CX
POP BX
POP AX
OUT DX,AX
IN AX,DX
As instrues de operaes lgicas so: and, not, or e xor. Elas trabalham a nvel
de bits em seus operadores.
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.
So usadas para mover o contedo dos operadores. Cada instruo pode ser usada com
diferentes modos de endereamento.
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.
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.
Propsito: Mover byte ou cadeias de palavra da fonte, endereada por SI, para o
destino endereado por DI.
Sintaxe:
MOVS
Este comando no necessita de parmetros uma vez que toma como endereo
fonte o contedo do registrador SI e como destino o contedo de DI. A
seguinte seqncia de instrues ilustra isso:
As instrues MOVSB e MOVSW so usadas do mesmo modo que MOVS, a primeira move um
byte e a segunda move uma palavra.
Instrues de carga.
Sintaxe:
LODS
Esta instruo toma a cadeia encontrada no endereo especificado por SI, a carrega
para o registrador AL (ou AX) e adiciona ou subtrai, dependendo do estado de DF,
para SI se uma transferncia de bytes ou de palavras.
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
Propsito: Carregar o registrador de segmento de dados.
Sintaxe:
LDS destino,fonte
O operador fonte deve ser uma double word na memria. A palavra associada com o
maior endereo transferida para DS, em outras palavras isto tomado como o
endereo de segmento. A palavra associada com o menor endereo o endereo de
deslocamento e depositada no registrador indicado como destino.
INSTRUO LEA
Sintaxe:
LEA destino,fonte
Para ilustrar uma das facilidades que temos com este comando, vejamos:
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
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
Este comando transfere os bits da palavra armazenada na parte mais alta da pilha
para registrador de flag.
BIT FLAG
0 CF
2 PF
4 AF
6 ZF
7 SF
8 TF
9 IF
10 DF
11 OF
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
Com esta instruo a operao lgica "y" para ambos os operadores usada como na
tabela:
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:
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
Esta instruo realizxa uma disjuno exclusiva de dois operadores bit a bit.
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.
O resultado armazenado no operador de destino.
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: lOp
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
Esta instruo usada par adesviar o curso do programa sem tomar em conta as
condies atuais dos flags ou dos dados.
INSTRUO JA (JNBE)
Sintaxe:
JA smbolo
Sintaxe:
JAE smbolo
INSTRUO JB (JNAE)
Sintaxe:
JB smbolo
Sintaxe:
JBE smbolo
INSTRUO JE (JZ)
Sintaxe:
JE smbolo
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
INSTRUOO 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 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
Diante desta instruo, pode-se usar um prefixo para repetio, de modo a comparar
dois blocos de memria entre si, repetindo a instruo de
comparao at que ambos se tornem iguais ou desiguais.
4.3.5.Instrues de flag.
CLC
CLD
CLI
CMC
STC
STD
STI
INSTRUO CLC
Sintaxe:
CLC
INSTRUO CLD
Sintaxe:
CLD
Sintaxe:
CLI
INSTRUO CMC
Sintaxe:
CMC
INSTRUO STC
Sintaxe:
STC
INSTRUO STD
Sintaxe:
STD
INSTRUO STI
STI
Esta instruo ativa o flag IF, e habilita interrupes externas mascarveis (que
s funcionam quando IF = 1).
***********************************************************************
Contedo:
5.1.Interrupes
5.2.Gerenciamento de arquivos
Contedo
Interrupes internas so geradas por certos eventos que ocorrem durante a execuo
de um programa.
No nos permitido gerenciar diretamente esta interrupo, uma vez que no se pode
controlar a hora atualizada por software. Mas podemos usar seus efeitos no
computador para o nosso benefcio, 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 compreensvel pelo
usurio.
5.1.3.Interrupes de software
Contedo
5.1.4.1.Interrupo 21H
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.
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
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.
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.
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:
O que esta funo faz ler o prximo bloco de informaes do endereo dado por
DS:DX, e atualizar este registro.
FUNO 15H
Uso:
Registradores de chamada:
AH = 15H
DS:DX = Ponteiro para um FCB ja aberto.
Registradores de retorno:
AL = 00H se no h erros, de outra forma conter o cdigo de erro: 1 disco cheio
ou arquivo somente de leitura, 2 erro na formao ou na especificao do FCB.
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:
Esta funo substitui a funo 16H. O nome do arquivo especificado numa cadeia
ASCII de bytes terminados pelo caracter 0.
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
BX = Nmero do handle associado
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.
Para acessar cada uma delas necessrio colocar o nmero da funo
correspondente no registrador AH.
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
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:
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
Veremos duas funes da interrupo 16H. A exemplo das demais interrupes, usa-se
o registrador AH para cham-las.
Registradores de chamada:
AH = 00H
Registradores de retorno:
Quando se usa esta interrupo, os programas executam at que uma tecla seja
pressionada. Se um valor ASCII, armazenado no registrador AH. Caso contrrio, o
cdigo armazenado no registrador AL e AH=0.
Este valor de AL pode ser utilizado quando queremos detectar teclas que no sto
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
Esta interrupo usada para enviar caracteres, setar ou ler o estado de uma
impressora.
Funo 00H
Uso:
Registradores de chamada:
AH = 00H
AL = Caracter a imprimir
DX = Porta de conexo
Registradores de retorno:
AH = Estado da impressora
A maioria dos BIOS suportam 3 portas paralelas, havendo alguns que suportam 4.
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 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
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.
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
A funo 1AH no retorna qualquer estado do disco nem da operao. Mas a funo
15H, que usaremos para escrever para o disco, faz isso no registrador AL. Se este
for igual a zero, ento no h erro e os campos de registro corrente e de bloco so
atualizados.
5.2.2.5.LEITURA SEQENCIAL
5.2.2.7.FECHAR UM ARQUIVO
Se aps invocar esta funo, o regisatrador AL conter o valor FFH, significa que o
arquivo foi mudado de posio, o disco foi mudado ou h erro de acesso a disco.
5.2.3.Canais de comunicao.
A facilidade dos handles consiste em que para operarmos sobre um arquivo apenas
necessrio definirmos o nome do mesmo e o nmero de handle a usar, todo o resto da
informao manuseada internamente pelo DOS.
***********************************************************************
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:
Call Soma
6.2.Macros
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.
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.
Declarao da macro
Cdigo da macro
Diretiva de trmino da macro
Um exemplo de uma macro para colocar o cursor numa determinada posio da tela:
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
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
***********************************************************************
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 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 ;Pe o valor 0006 no registrador AX
297D:0103 MOV BX,0004 ;Pe o valor 0004 no registrador BX
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 ;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
Terceiro exemplo
-a100
297D:0100 MOV AH,01 ;Funo para mudar o cursor
297D:0102 MOV CX,0007 ;Formata o cursor
297D:0105 INT 10 ;Chama interrupo do BIOS
297D:0107 INT 20 ;Finaliza o programa
Quarto exemplo
-a100
297D:0100 MOV AH,01 ;Funo 1 (l caractere do teclado)
297D:0102 INT 21 ;Chama interrupo do DOS
297D:0104 CMP AL,0D ;Compara se o caractere lido um ENTER
297D:0106 JNZ 0100 ;Se no , l um outro caractere
297D:0108 MOV AH,02 ;Funo 2 (escreve um caractere na tela)
297D:010A MOV DL,AL ;Character to write on AL
297D:010C INT 21 ;Chama interrupo do DOS
297D:010E INT 20 ;Finaliza o programa
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 ;Funo 2 (escreve um caractere na tela)
297D:0102 MOV CX,0008 ;Pe o valor 0008 no registrador CX
297D:0105 MOV DL,00 ;Pe 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 interrupo do DOS
297D:010E LOOP 0105 ;Salta se CX > 0 para o endereo 0105
297D:0110 INT 20 ;Finaliza o programa
Sexto exemplo
-a100
297D:0100 MOV AH,02 ;Funo 2 (escreve um caractere na tela)
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 CMP DL,3A ;Compara o valor 3A com o contedo de DL sem
afet-lo
;seu valor apenas modifica o estado do flag de
carry
297D:010A JL 010F ;salta ao endereo 010f, se for menor
297D:010C ADD DL,07 ;Adiciona o valor 07 a DL
297D:010F INT 21 ;Chama interrupo do DOS
297D:0111 INT 20 ;Finaliza o programa
Stimo exemplo
-a100
297D:0100 MOV AH,02 ;Funo 2 (escreve um caractere na tela)
297D:0102 MOV DL,BL ;Pe o valor de BL em DL
297D:0104 AND DL,0F ;Transporta fazendo AND dos nmeros 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 endereo 0112, se menor
297D:010F ADD DL,07 ;Adiciona 07 a DL
297D:0112 INT 21 ;Chama interrupo do DOS
297D:0114 INT 20 ;Finaliza o programa
Oitavo exemplo
-a100
297D:0100 MOV AH,02 ;Funo 2 (escreve um caractere na tela)
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 ;Desloca os 4 bits mais altos do nmero 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 endereo 0113, se menor
297D:0110 ADD DL,07 ;Adiciona 07 a DL
297D:0113 INT 21 ;Chama interrupo do DOS
297D:0115 INT 20 ;Finaliza o programa
Nono exemplo
-a100
297D:0100 MOV AH,02 ;Funo 2 (escreve um caractere na tela)
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 ;Desloca os 4 bits mais altos do nmero 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 endereo 0113, se menor
297D:0110 ADD DL,07 ;Adiciona 07 a DL
297D:0113 INT 21 ;Chama interrupo do DOS
297D:0115 MOV DL,BL ;Pe o valor de BL em DL
297D:0117 AND DL,0F ;Transporta fazendo AND dos nmeros bit a bit
297D:011A ADD DL,30 ;Adiciona 30 a DL
Dcimo exemplo
-a100
297D:0100 MOV AH,01 ;Funo 1 (l caractere do teclado)
297D:0102 INT 21 ;Chama interrupo do DOS
297D:0104 MOV DL,AL ;Pe o valor de AL em DL
297D:0106 SUB DL,30 ;Subtrai 30 de DL
297D:0109 CMP DL,09 ;Compara DL com 09
297D:010C JLE 0111 ;Salta ao endereo 0111, se menor ou igual
297D:010E SUB DL,07 ;Subtrai 07 de DL
297D:0111 MOV CL,04 ;Pe o valor 04 em CL
297D:0113 SHL DL,CL ;Insere zeros direita
297D:0115 INT 21 ;Chama interrupo do DOS
297D:0117 SUB AL,30 ;Subtrai 30 de AL
297D:0119 CMP AL,09 ;Compara AL com 09
297D:011B JLE 011F ;Salta ao endereo 011f, se menor ou igual
297D:011D SUB AL,07 ;Subtrai 07 de AL
297D:011F ADD DL,AL ;Adiciona AL a DL
297D:0121 INT 20 ;Finaliza o programa
-a100
297D:0100 CALL 0200 ;Chama um procedimento
297D:0103 INT 20 ;Finaliza o programa
-a200
297D:0200 PUSH DX ;Pe o valor de DX na pilha
297D:0201 MOV AH,08 ;Funo 8
297D:0203 INT 21 ;Chama interrupo do DOS
297D:0205 CMP AL,30 ;Compara AL com 30
297D:0207 JB 0203 ;Salta se CF ativado ao endereo 0203
297D:0209 CMP AL,46 ;Compara AL com 46
297D:020B JA 0203 ;Salta ao endereo 0203, se diferente
297D:020D CMP AL,39 ;Compara AL com 39
297D:020F JA 021B ;Salta ao endereo 021B, se diferente
297D:0211 MOV AH,02 ;Funo 2 (escreve um caractere na tela)
297D:0213 MOV DL,AL ;Pe o valor de AL em DL
297D:0215 INT 21 ;Chama interrupo 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 endereo 0203
297D:021F MOV AH,02 ;Funo 2 (escreve um caractere na tela)
297D:022 MOV DL,AL ;Pe o valor AL em DL
297D:0223 INT 21 ;Chama interrupo do DOS
297D:0225 SUB AL,37 ;Subtrai 37 de AL
297D:0227 POP DX ;Extrai o valor de DX da pilha
297D:0228 RET ;Retorna o controle ao programa principal
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 executvel com o mesmo nome do objeto e com extenso
diferente, one.exe
Terceiro passo
Primeiro exemplo
Segundo exemplo
WRITE_CHAR PROC
MOV AH,2h ;Funo 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
MOV AH,4CH ;Funo 4Ch
INT 21h ;Retorna o controle ao DOS
TEST_WRITE_HEX ENDP ;Finaliza o procedimento
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 ;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 nmero 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 nmero 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 nmero 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 nmero de bits menor do que 10
JAE HEX_LETTER ;se no, salta para HEX_LETER
ADD DL,"0" ;se sim, converte para nmero
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
POP DX ;Retorna o valor inicial do registrador DX
;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 o D.O.S. ;
;......................................................................;
WRITE_CHAR PROC
PUSH AX ;Coloca na pilha o valor do registarador AX
MOV AH,2 ;Funo 2h
INT 21h ;Interrupo 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 ;Funo 4Ch
INT 21h ;Interrupo 21h
TEST_WRITE_DECIMAL ENDP ;Finaliza o procedimento
PUBLIC WRITE_DECIMAL
;.................................................................;
;Este procedimento escreve um nmero de 16 bit como um nmero ;
;sem sinal em notao decimal ;
;Use: WRITE_HEX_DIGIT ;
;.................................................................;
WRITE_DECIMAL PROC
PUSH AX ;Pe na pilha o valor do registrador AX
PUSH CX ;Pe na pilha o valor do registrador CX
PUSH DX ;Pe na pilha o valor do registrador DX
PUSH SI ;Pe na pilha o valor do registrador SI
MOV AX,DX ;move o valor do registrador DX para AX
MOV SI,10 ;move o valor 10 para o registrador SI
XOR CX,CX ;zera o registrador CX
NON_ZERO:
XOR DX,DX ;zera o registrador CX
DIV SI ;divizo entre SI
PUSH DX ;Pe na pilha o valor do registrador DX
INC CX ;incrementa CX
OR AX,AX ;no zero
JNE NON_ZERO ;salta para NON_ZERO
WRITE_DIGIT_LOOP:
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 SI
POP DX ;retira da pilha o valor do registrador DX
POP CX ;retira da pilha o valor do registrador CX
POP AX ;retira da pilha o valor do registrador AX
RET ;Retorna o controle ao procedimento que chamou
WRITE_DECIMAL ENDP ;Finaliza o procedimento
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
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 lao com 255 interaes
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 ;Funo 4Ch
INT 21h ;Interrupo 21h
PRINT_ASCII ENDP ;Finaliza o procedimento
WRITE_CHAR PROC
MOV AH,2h ;Funo 2h para imprimir um caracter
INT 21h ;Imprime o caracter que est em DL
RET ;Retorna o controle ao procediemento que chamou
WRITE_CHAR ENDP ;Finaliza o procedimento
Este programa mostra na tela o valor dos 256 caracteres do cdigo ASCII.