			   University of Guadalajara 
		  Information Sistems General Coordination.
			  Culture and Entertainment Web
				 
 June 12th 1995
Copyright(C)1995-1996

*****************************************************************************
*     Este tutorial foi traduzido para o Portugus por Jeferson Amaral.     *
*                       e-mail: amaral@inf.ufsm.br                          *
*****************************************************************************

        Este tutorial tem o intuito de apenas introduzir o leitor ao mundo
da programacao em Linguagem Assembly, nao tem, portanto e de forma alguma,
plano de esgotar o assunto.

Copyright (C) 1995-1996, Hugo Perez Perez.
Anyone  may  reproduce  this document,  in  whole  or  in  part,
provided  that:

(1) any copy or republication of the entire document must show University of
    Guadalajara as the source, and must include this notice; and
(2) any other use of this material must reference this manual and University
    of Guadalajara, and the fact that the material is copyright by Hugo Perez
    and is used by permission.

****************************************************************************

          T U T O R I A L   D E   L I N G U A G E M   A S S E M B L Y
          ---------------   ---   -----------------   ---------------

                                  Contedo:

           1.Introduo 
           2.Conceitos Bsicos
           3.Programao Assembly 
           4.Instrues Assembly
           5.Interrupes e gerncia de arquivos
           6.Macros e procedimentos 
           7.Exemplos de programas
           8.Bibliografia
 
 
*****************************************************************************

                           CAPTULO 1: INTRODUO

Contedo:

1.1.O que h de novo neste material
1.2.Apresentao
1.3.Por que aprender Assembly?
1.4.Ns precisamos da sua opinio

                    --------------- // ---------------

1.1.O que h de novo neste material:

Aps um ano da realizao da primeira verso do tutorial, e atravs das
opinies recebidas por e-mail, resolvemos ter por disposio todos estes
comentrios e sugestes. Esperamos que atravs deste novo material Assembly,
as pessoas que se mostrarem interessadas possam aprender mais sobre o seu
IBM PC. Esta nova edio do tutorial inclui:

Uma seo completa sobre como usar o programa debug.
Mais exemplos de programas.
Um motor de pesquisa, para qualquer tpico ou item relacionado  esta
nova verso.
Considervel reorganizao e reviso do material Assembly.
Em cada seo, h um link para o Dicionrio On-line de Computao de
Dennis Howe.


1.2.Apresentao:

Este tutorial destina-se quelas pessoas que nunca tiveram contato com a
Linguagem Assembly.

O tutorial est completamente focado em computadores com processadores 80x86
da famlia Intel, e considerando que a base da linguagem  o funcionamento
dos recursos internos do processador, os exemplos descritos no so
compatveis com qualquer outra arquitetura.

As informaes esto dispostas em unidades ordenadas para permitir fcil
acesso a cada tpico, bem como uma melhor navegao pelo tutorial.

Na seo introdutria so mencionados alguns conceitos elementares sobre
computadores e a Linguagem Assembly em si.


1.3.Por que aprender Assembly?

A primeira razo para se trabalhar com o assembler  a oportunidade de
conhecer melhor o funcionamento do seu PC, o que permite o desenvolvimento
de programas de forma mais consistente.

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 execuo.

                              
1.4.Ns precisamos da sua opinio:

Nosso intuito  oferecer um modo simples para que voc consiga aprender
Assembly por si mesmo. Por tanto, qualquer comentrio ou sugesto ser
bem-vinda.
                           

*****************************************************************************

                           CAPTULO 2: CONCEITOS BSICOS
 Contedo:

 2.1.Descrio bsica de um sistema computacional.
 2.2.Conceitos bsicos da Linguagem Assembly
 2.3.Usando o programa debug

			--------------- // ---------------
                             
Esta seo tem o propsito de fazer um breve comentrio a respeito dos
principais componentes de um sistema computacional, o que ir permitir ao
usurio uma melhor compreenso dos conceitos propostos no decorrer do
tutorial.

      
2.1.DESCRIO DE UM SISTEMA COMPUTACIONAL
                             
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.

Chamamos de Sistema Computacional a completa configurao de um computador,
incluindo os perifricos e o sistema operacional.

                                   
2.1.1.Processador Central.

 tambm conhecido por CPU ou Unidade Central de Processamento, que por sua
vez  composta pela unidade de controle e unidade de lgica e aritmtica.
Sua funo consiste na leitura e escrita do contedo das clulas de memria,
regular o trfego de dados entre as clulas de memria e registradores
especiais, e decodificar e executar as instrues de um programa.

O processador tem uma srie de clulas de memria usadas com freqncia e,
dessa forma, so partes da CPU. Estas clulas so conhecidas com o nome de
registradores. Um processador de um PC possui cerca de 14 registradores.
Como os PCs tem sofrido evoluo veremos que podemos manipular registradores
de 16 ou 32 bits.

A unidade de lgica e aritmtica da CPU realiza as operaes relacionadas ao
clculo simblico e numrico. Tipicamente estas unidades apenas so capazes
de realizar operaes elementares, tais como: adio e subtrao de dois
nmeros inteiros, multiplicao e diviso de nmero inteiro, manuseio de
bits de registradores e comparao do contedo de dois registradores.

Computadores pessoais podem ser classificados pelo que  conhecido como
tamanho da palavra, isto , a quantidade de bits que o processador  capaz
de manusear de uma s vez.

                              
2.1.2.Memria Principal.

 um grupo de clulas, agora sendo fabricada com semi-condutores, usada para
processamentos gerais, tais como a execuo de programas e o armazenamento
de informaes para operaes.

Cada uma das clulas pode conter um valor numrico e  capaz de ser
endereada, isto , pode ser identificada de forma singular em relao s
outras clulas pelo uso de um nmero ou endereo.

O nome genrico destas memrias  Random Access Memory ou RAM. A principal
desvantagem deste tipo de memria  o fato de que seus circuitos integrados
perdem a informao que armazenavam quando a energia eltrica for
interrompida, ou seja, ela  voltil. Este foi o motivo que levou  criao
de um outro tipo de memria cuja informao no  perdida quando o sistema 
desligado. Estas memrias receberam o nome de Read Only Memory ou ROM.


2.1.3.Unidades de Entrada e Sada.

Para que o computador possa ser til para ns se faz necessrio que o
processador se comunique com o exterior atravs de interfaces que permitem a
entrada e a sada de informao entre ele e a memria. Atravs do uso destas
comunicaes  possvel introduzir informao a ser processada e mais tarde
visualizar os dados processados.

Algumas das mais comuns unidades de entrada so o teclado e o mouse. As mais
comuns unidades de sada so a tela do monitor e a impressora.

                              
2.1.4.Unidades de Memria Auxiliar.

Considerando o alto custo da memria principal e tambm o tamanho das
aplicaes atualmente, vemos que ela  muito limitada. Logo, surgiu a
necessidade da criao de dispositivos de armazenamento prticos e
econmicos.

Estes e outros inconvenientes deram lugar s unidades de memria auxiliar,
perifricos. As mais comuns so as fitas e os discos magnticos.

A informao ali armazenada ser dividida em arquivos. Um arquivo  feito de
um nmero varivel de registros, geralmente de tamanho fixo, podendo conter
informao ou programas.


			--------------- // ---------------
                                   
2.2.CONCEITOS BSICOS

Contedo:

2.2.1.Informaes nos computadores
2.2.2.Mtodos de representao de dados
                                   

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

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.

 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
direita para a esquerda e o multiplicamos pela base, elevando  potncia
correspondente  sua posio relativa:

Binary:         1         1       0       0       1

Decimal:       1*2^0  + 1*2^1 + 0*2^2 + 0*2^3 + 1*2^4

            =   1     +   2   +   0   +   0   +  16  = 19 decimal.

O caracter ^  usado em computao como smbolo para potncia e * para a
multiplicao.


2.2.1.4.Convertendo nmeros decimais para binrio

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.

O mtodo resume-se na aplicao de divises sucessivas por 2, mantendo o
resto como o dgito binrio e o resultado como o prximo nmero a ser
dividido.

Tomemos como exemplo o nmero decimal 43.

43/2=21 e o resto  1; 21/2=10 e o resto  1; 10/2=5 e o resto  0;
5/2=2 e o resto  1; 2/2=1 e o resto  0; 1/2=0 e o resto  1.

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

Na base hexadecimal temos 16 dgitos, que vo de 0 a 9 e da letra A at a F,
estas letras representam os nmeros de 10 a 15. Portanto contamos:
0,1,2,3,4,5,6,7,8,9,A,B,C,D,E, e F.

A converso entre nmeros binrios e hexadecimais  fcil. A primeira coisa
a fazer  dividir o nmero binrio em grupos de 4 bits, comeando da direita
para a esquerda. Se no grupo mais  direita sobrarem dgitos, completamos
com zeros.

Tomando como exemplo o nmero binrio 101011, vamos dividi-lo em grupos de 4
bits:

10;1011

Preenchendo o ltimo grupo com zeros (o um mais  esquerda):

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:

2Bh, onde o "h" representa a base hexadecimal.

Para a converso de um nmero hexadecimal em binrio  apenas necessrio
inverter os passos: tomamos o primeiro dgito hexadecimal e o convertemos
para binrio, a seguir o segundo, e assim por diante.

                                   
			--------------- // ---------------


2.2.2.Mtodos de representao de dados num computador.

	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.

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 em 2 partes: sua base e seu expoente.

Por exemplo o nmero decimal 1234000,  representado como 1.234*10^6,
observamos que o expoente ir indicar o nmero de casas que o ponto decimal
deve ser movido para a direita, a fim de obtermos o nmero original.

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.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.1.Processo de criao de programas.

Para a criao de programas so necessrios os seguintes passos:

   * Desenvolvimento do algoritmo, estgio em que o problema a ser
     solucionado  estabelecido e a melhor soluo  proposta, criao de
     diagramas esquemticos relativos  melhor soluo proposta.
   * Codificao do algoritmo, o que consiste em escrever o programa
     em alguma linguagem de programao; linguagem assembly neste caso
     especfico, tomando como base a soluo proposta no passo anterior.
   * A transformao para a linguagem de mquina, ou seja, a criao
     do programa objeto, escrito como uma seqncia de zeros e uns que podem
     ser interpretados pelo processador.
   * O ltimo estgio  a eliminao de erros detectados no programa
     na fase de teste. A correo normalmente requer a repetio de todos os
     passos, com observao atenta.


              
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.  importante observar isso, pois deste modo os programas .COM
no so relocveis.

Os principais comandos do programa debug so:

A Montar instrues simblicas em cdigo de mquina
D Mostrar o contedo de uma rea da memria
E Entrar dados na memria, iniciando num endereo especfico
G Rodar um programa executvel na memria
N Dar nome a um programa
P Proceder, ou executar um conjunto de instrues relacionadas
Q Sair do programa debug
R Mostrar o contedo de um ou mais registradores
T Executar passo a passo as instrues
U Desmontar o cdigo de mquina em instrues simblicas
W Gravar um programa em disco

 possvel visualizar os valores dos registradores internos da CPU usando o
programa Debug. Debug  um programa que faz parte do pacote do DOS, e pode
ser encontrado normalmente no diretrio C:\DOS. Para inici-lo, basta
digitar Debug na linha de comando:

C:/>Debug [Enter]
-

Voc notar ento a presena de um hfen no canto inferior esquerdo da tela.
No se espante, este  o prompt do programa. Para visualizar o contedo dos
registradores, experimente:

-r[Enter]

AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0D62  ES=0D62  SS=0D62  CS=0D62  IP=0100   NV UP EI PL NZ NA PO NC
0D62:0100 2E            CS:
0D62:0101 803ED3DF00    CMP     BYTE PTR [DFD3],00                 CS:DFD3=03

 mostrado o contedo de todos os registradores internos da CPU; um modo
alternativo para visualizar um nico registrador  usar o camando "r"
seguido do parmetro que faz referncia ao nome do registrador:

-rbx
BX 0000
:

Esta instruo mostrar o contedo do registrador BX e mudar o indicador do
Debug de "-" para ":"

Quando o prompt assim se tornar, significa que  possvel, embora no
obrigatria, a mudana do valor contido no registrador, bastando digitar o
novo valor e pressionar [Enter]. Se voc simplesmente pressionar [Enter] o
valor antigo se mantm.


2.3.4.Estrutura Assembly.

Nas linhas do cdigo em Linguagem Assembly h duas partes: a primeira  o
nome da instruo a ser executada; a segunda, os parmetros do comando. Por
exemplo:

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

No exemplo acima, estamos usando a instruo mov, que significa mover o
valor 25 para o registrador al.

O nome das instrues nesta linguagem  constitudo de 2, 3 ou 4 letras.
Estas instrues so chamadas mnemnicos ou cdigos de operao,
representando a funo que o processador executar.

s vezes instrues aparecem assim:

add al,[170]

Os colchetes no segundo parmetro indica-nos que vamos trabalhar com o
contedo da clula de memria de nmero 170, ou seja, com o valor contido no
endereo 170 da memria e no com o valor 170, isto  conhecido como
"endereamento direto".


                                   
2.3.5.Criando um programa simples em assembly.

No nos responsabilizaremos pela m execuo ou possveis danos causados por
quaisquer exemplos que de agora em diante aparecero, uma vez que os mesmos,
apesar de testados, so de carter didtico. Vamos, ento, criar um programa
para ilustrar o que vimos at agora. Adicionaremos dois valores:

O primeiro passo  iniciar o Debug, o que j vimos como fazer anteriormente.

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 mov ax,0002
0D62:0103 mov bx,0004
0D62:0106 add ax,bx
0D62:0108 nop
0D62:0109

Entramos com o comando "t" para executar passo a passo as instrues:

-t

AX=0002  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0D62  ES=0D62  SS=0D62  CS=0D62  IP=0103   NV UP EI PL NZ NA PO NC
0D62:0103 BB0400        MOV     BX,0004

Vemos o valor 0002 no registrador AX. Teclamos "t" para executar a segunda
instruo:

-t

AX=0002  BX=0004  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0D62  ES=0D62  SS=0D62  CS=0D62  IP=0106   NV UP EI PL NZ NA PO NC
0D62:0106 01D8          ADD     AX,BX

Teclando "t" novamente para ver o resultado da instruo add:

-t

AX=0006  BX=0004  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0D62  ES=0D62  SS=0D62  CS=0D62  IP=0108   NV UP EI PL NZ NA PE NC
0D62:0108 90            NOP

A possibilidade dos registradores conterem valores diferentes existe, mas AX
e BX devem conter os mesmos valores acima descritos.

Para sair do Debug usamos o comando "q" (quit).

                                   

2.3.6.Armazenando e carregando os programas.

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.

Eis os passos para salvar um programa que j esteja na memria:

      * Obter o tamnho do programa subtraindo o endereo final do
        endereo inicial, naturalmente que no sistema hexadecimal.
      * Dar um nome ao programa.
      * Colocar o tamanho do programa no registrador CX.
      * Mandar o debug gravar o programa em disco.

Usando como exemplo o seguinte programa, vamos clarear a idia de como
realizar os passos acima descritos:

0C1B:0100 mov ax,0002
0C1B:0103 mov bx,0004
0C1B:0106 add ax,bx
0C1B:0108 int 20
0C1B:010A

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 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

Para construirmos os programas com o TASM, devemos estruturar o fonte de
forma diferenciada ao que fazamos com o programa debug.

 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 fazer comentrios em programas assembly
.MODEL SMALL ;modelo de memria
.STACK       ;espao de memria para instrues do programa na pilha
.CODE        ;as linhas seguintes so instrues do programa
  mov ah,01h ;move o valor 01h para o registrador ah
  mov cx,07h ;move o valor 07h para o registrador cx
  int 10h    ;interrupo 10h
  mov ah,4ch ;move o valor 4ch para o registrador ah
  int 21h    ;interrupo 21h
END          ;finaliza o cdigo do programa

Este programa assembly muda o tamanho do cursor.

Segundo passo

Salvar o arquivo com o seguinte nome: exam1.asm
No esquecer de salv-lo no formato ASCII.

Terceiro passo

Usar o programa TASM para construir o programa objeto.

Exemplo:

C:\>tasm exam1.asm
Turbo Assembler  Version 2.0  Copyright (c) 1988, 1990 Borland International

Assembling file:   exam1.asm
Error messages:    None
Warning messages:  None
Passes:            1
Remaining memory:  471k

O TASM s pode criar programas no formato .OBJ, que ainda no pode ser
executado...

Quarto passo

Usar o programa TLINK para criar o programa executvel.

Exemplo:

C:\>tlink exam1.obj
Turbo Link  Version 3.0 Copyright (c) 1987, 1990 Borland International

C:\>

Onde exam1.obj  o nome do programa intermedirio, .OBJ. O comando acima
gera diretamente o arquivo com o nome do programa intermedirio e a extenso
.EXE.  opcional a colocao da extenso .obj no comando.

Quinto passo

Executar o programa executvel criado.

C:\>exam1[enter]

Lembre-se, este programa assembly muda o tamanho do cursor no DOS.


			--------------- // ---------------
                          
3.2.Processo Assembly.

3.2.1.Segmentos
3.2.2.Tabela de equivalncia

                                 
3.2.1.SEGMENTOS

A arquitetura dos processadores x86 fora-nos a usar segmentos de memria
para gerenciar a informao, o tamanho destes segmentos  de 64Kb.

A razo de ser destes segmentos  que, considerando que o tamanho mximo de
um nmero que o processador pode gerenciar  dado por uma palavra de 16 bits
ou registrador, assim no seria possvel 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  Copyright (c) 1988, 1990 Borland International

Assembling file:   exam2.asm
Error messages:    None
Warning messages:  None
Passes:            1
Remaining memory:  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.

 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.

                                   
3.4.2.OPERAES LGICAS E ARITMTICAS

As instrues de operaes lgicas so: and, not, or e xor. Elas trabalham a
nvel de bits em seus operadores.

Para verificar o resultado das operaes usamos as instrues cmp e test.

As instrues usadas para operaes algbricas so: para adio add, para
subtrao sub, para multiplicao mul e para diviso div.

Quase todas as instrues de comparao so baseadas na informao contida
no registrador de flag. Normalmente os flags do registrador que podem ser
manuseados diretamente pelo programador so os da direo de dados DF, usado
para definir as operaes sobre cadeias. Uma outro que pode tambm ser
manuseado  o flag IF atravs das instrues sti e cli, para ativar e
desativar as interrupes.

                                   
3.4.3.SALTOS, LOOPS E PROCEDIMENTOS

Saltos incondicionais na escrita de programas em linguagem assembly so
dados pela instruo jmp; um salto  usado para modificar a seqncia da
execuo das instrues de um programa, enviando o controle ao endereo
indicado, ou seja, o registrador contador de programa recebe este novo
endereo.

Um loop, tambm conhecido como interao,  a repetio de um processo um
certo nmero de vezes at atingir a condio de parada.


*****************************************************************************

                           CAPTULO 4: INSTRUES ASSEMBLY

Contedo:

4.1.Instrues de operao de dados
4.2.Instrues lgicas e aritmticas
4.3.Instrues de controle de processos

			--------------- // ---------------
         
4.1. Instrues de operao de dados

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

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: memria.                  Fonte: acumulador
*Destino: acumulador.               Fonte: memria
*Destino: registrador de segmento.  Fonte: memria/registrador
*Destino: memria/regitrador.       Fonte: registrador de segmento
*Destino: registrador.              Fonte: registrador
*Destino: registrador.              Fonte: memria
*Destino: memria.                  Fonte: registrador
*Destino: registrador.              Fonte: dado imediato
*Destino: memria.                  Fonte: dado imediato

Exemplo:

  MOV AX,0006h
  MOV BX,AX
  MOV AX,4C00h
  INT 21h

Este pequeno programa move o valor 0006h para o registrador AX, ento ele
move o contedo de AX (0006h) para o registrador BX, e finalmente move o
valor 4C00h para o registrador AX para terminar a execuo com a opo 4C da
interrupo 21h.

                                   

INSTRUES MOVS (MOVSB) (MOVSW)

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:

MOV SI, OFFSET VAR1
MOV DI, OFFSET VAR2
MOVS

Primeiro inicializamos os valores de SI e DI com os endereos das variveis
VAR1 e VAR2 respectivamente, ento aps a execuo de MOVS o contedo de
VAR1  copiado para VAR2.

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.

So instrues especficas para registradores, usadas para carregar bytes ou
cadeias de bytes num registrador.

 LODS (LODSB) (LODSW)
 LAHF
 LDS
 LEA
 LES

                                 

 INSTRUES LODS (LODSB) (LODSW)

Propsito: Carregar cadeias de um byte ou uma palavra para o acumulador.

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.

MOV SI, OFFSET VAR1
LODS

Na primeira linha vemos a carga do endereo de VAR1 em SI e na segunda 
tomado o contedo daquele local para o regiustrador AL.

Os comandos LODSB e LODSW so usados do mesmo modo, o primeiro carrega um
byte e o segundo uma palavra (usa todo o registrador AX).

                                   

 INSTRUO LAHF

Propsito: Transferir o contedo dos flags para o registrador AH.

Sintaxe:

LAHF

Esta instruo  til para verificar o estado dos flags durante a execuo
do nosso programa.

Os flags so deixados na seguinte ordem dentro do registrador:

SF ZF ?? AF ?? PF ?? CF

O "??" significa que haver um valor indefinido naqueles bits.

                                   

 INSTRUO LDS

Propsito: Carregar o registrador de segmento de dados.

Sintaxe:

LDS destino,fonte

O operador fonte deve ser uma double word na memria. A palavra associada
com o maior endereo  transferida para DS, em outras palavras isto  tomado
como o endereo de segmento. A palavra associada com o menor endereo  o
endereo de deslocamento e  depositada no registrador indicado como
destino.

                                   

 INSTRUO LEA

Propsito: Carregar o endereo do operador fonte.

Sintaxe:

LEA destino,fonte

O operador fonte deve estar localizado na memria, e seu deslocamento 
colocado no registrador de ndice ou ponteiro especificado no destino.

Para ilustrar uma das facilidades que temos com este comando, vejamos:

MOV SI,OFFSET VAR1

 equivalente a:

LEA SI,VAR1

 muito provvel que para o programador  muito mais fcil criar programas
grandes usando este ltimo formato.

                                   

 INSTRUO LES

Propsito: Carregar o registrador de segmento extra

Sintaxe:

LES destino,fonte

O operador fonte deve ser uma palavra dupla na memria. O contedo da
palavra com endereo maior  interpretado como o endereo do segmento e 
colocado em ES. A palavra com endereo menor  o endereo do deslocamento e
 colocada no registrador especificado no parmetro de destino.

                                   

 Instrues de manipulao da pilha.

Estas instrues permitem usar a pilha para armazenar ou recuperar dados.

 POP
 POPF
 PUSH
 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     CF
  2     PF
  4     AF
  6     ZF
  7     SF
  8     TF
  9     IF
 10     DF
 11     OF

Os locais dos bits so os mesmos para o uso da instruo PUSHF.

Uma vez feita a transferncia o registrador SP  incrementado de 2, conforme
vimos anteriormente.

                                   

 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.


			--------------- // ---------------

         
4.2. Instrues lgicas e aritmticas

Contedo:

4.2.1.Instrues lgicas
4.2.2.Instrues aritmticas
                                  

4.2.1.Instrues lgicas

So usadas para realizar operaes lgicas nos operadores.

 AND
 NEG
 NOT
 OR
 TEST
 XOR

                                   
INSTRUO AND

Propsito: Realiza a conjuno de operadores bit a bit.

Sintaxe:

AND destino,fonte

Com esta instruo a operao lgica "y" para ambos os operadores  usada
como na 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.

O resultado  armazenado no operador de destino.

                                   

 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.Instrues de controle de processos
                             
Contedo:

4.3.1.Instrues de salto
4.3.2.Instrues de laos: loop
4.3.3.Instrues de contagem
4.3.4.Instrues de comparao
4.3.5.Instrues de flag
                                   

4.3.1.Instrues de salto.

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 JAE (JNB)

Propsito: Salto condicional.

Sintaxe:

JAE smbolo

A instruo salta se est up, se est equal ou se est not down.

O salto  feito se CF est desativado.

                                   

 INSTRUO JB (JNAE)

Propsito: Salto condicional.

Sintaxe:

JB smbolo

A instruo salta se est down, se est not up ou se est equal.

O salto  feito se CF est ativado.

                                   

 INSTRUO JBE (JNA)

Propsito: Salto condicional.

Sintaxe:

JBE smbolo

A instruo salta se est down, se est equal ou se est not up.

O salto  feito se CF ou ZF esto ativados, ou seja, se um deles for 1.

                                   

 INSTRUO JE (JZ)

Propsito: Salto condicional.

Sintaxe:

JE smbolo

A instruo salta se est equal ou se est zero.

O salto  feito se ZF est ativado.

                                   

 INSTRUO JNE (JNZ)

Propsito: Salto condicional.

Sintaxe:

JNE smbolo

A instruo salta se est not equal ou se est zero.

O salto  feito se ZF est desativado.

                                   

 INSTRUO JG (JNLE)

Propsito: Salto condicional, e o sinal  tomado.

Sintaxe:

JG smbolo

A instruo salta se est larger, se est not larger ou se est equal.

O salto ocorre se ZF = 0 ou se OF = SF.

                                   

 INSTRUO JGE (JNL)

Propsito: Salto condicional, e o sinal  tomado.

Sintaxe:

JGE smbolo

A instruo salta se est larger, se est less than ou se est equal.

O salto  feito se SF = OF.

                                   

 INSTRUO JL (JNGE)

Propsito: Salto condicional, e o sinal  tomado.

Sintaxe:

JL smbolo

A instruo salta se est less than, se est not larger than ou se est
equal.

O salto  feito se SF  diferente de OF.

                                   

 INSTRUO JLE (JNG)

Propsito: Salto condicional, e o sinal  tomado.

Sintaxe:

JLE smbolo

A instruo salta se est less than, se est equal ou se est not larger.

O salto  feito se ZF = 1 ou se SF  diferente de OF.

                                   

 INSTRUO JC

Propsito: Salto condicional, e os flags so tomados.

Sintaxe:

JC smbolo

A instruo salta se h carry.

O salto  feito se CF = 1.

                                   

 INSTRUO JNC

Propsito: Salto condicional, e o estado dos flags  tomado.

Sintaxe:

JNC smbolo

A instruo salta se no h carry.

O salto  feito se CF = 0.

                                   

 INSTRUO JNO

Propsito: Salto condicional, e o estado dos flags  tomado.

Sintaxe:

JNO smbolo

A instruo salta se no h overflow

O salto  feito se OF = 0.

                                   

 INSTRUO JNP (JPO)

Propsito: Salto condicional, e o estado dos flags  tomado.

Sintaxe:

JNP smbolo

A instruo salta se no h paridade ou se a paridade  mpar.

O salto  feito se PF = 0.

                                   

 INSTRUO JNS

Propsito: Salto condicional, e o estado dos flags  tomado.

Sintaxe:

JNP smbolo

A instruo salta se o sinal est desativado.

O salto  feito se SF = 0.

                                   

 INSTRUO JO

Propsito: Salto condicional, e o estado dos flags  tomado.

Sintaxe:

JO smbolo

A instruo salta se h overflow.

O salto  feito se OF = 1.

                                   

 INSTRUO JP (JPE)

Propsito: Salto condicional, e o estado dos flags  tomado.

Sintaxe:

JP smbolo

A instruo salta se h paridade ou se a paridade  par.

O salto  feito se PF = 1.

                                   

 INSTRUO JS

Propsito: Salto condicional, e o estado dos flags  tomado.

Sintaxe:

JS smbolo

A instruo salta se o sinal est ativado.

O salto  feito se SF =1.


			--------------- // ---------------

                               
4.3.2.Instrues para laos: LOOP.

Estas instrues transferem a execuo do processo, condicional ou
incondicionalmente, para um destino, repetindo a ao at o contador ser
zero.

 LOOP
 LOOPE
 LOOPNE


                                  
 INSTRUO LOOP

Propsito: Gerar um lao no programa.

Sintaxe:

LOOP smbolo

A instruo LOOP decrementa CX de 1 e transfere a execuo do programa para
o smbolo que  dado como operador, caso CX ainda no seja 1.

                                   

 INSTRUO LOOPE

Propsito: Gerar um lao no programa, considerando o estado de ZF.

Sintaxe:

LOOPE smbolo

Esta instruo decrementa CX de 1. Se CX  diferente de zero e ZF  igual a
1, ento a execuo do programa  transferida para o smbolo indicado como
operador.

                                   

 INSTRUO LOOPNE

Propsito: Gerar um lao no programa, considerando o estado de ZF.

Sintaxe:

LOOPNE smbolo

Esta instruo decrementa CX de 1 e transfere a execuo do programa apenas
se ZF  diferente de 0.

                                   

			--------------- // ---------------

4.3.3.Instrues contadoras.

Estas instrues so usadas para decrementar ou incrementar o contedo de
contadores.

 DEC
 INC


                                  
 DEC INSTRUCTION

Propsito: Decrementar o operador.

Sintaxe:

DEC destino

Esta instruo subtrai 1 do operador destino e armazena o novo valor no
mesmo operador.

                                   

 INSTRUO INC

Propsito: Incrementar o operador.

Sintaxe:

INC destino

Esta instruo adiciona 1 ao operador destino e mantm o resultado no mesmo
operador.


			--------------- // ---------------
                                 
4.3.4.Instrues de comparao.

Estas instrues so usadas para comparar os operadores, e elas afetam o
contedo dos flags.

 CMP
 CMPS (CMPSB) (CMPSW)


                                  
 INSTRUO CMP

Propsito: Comparar os operadores.

Sintaxe:

CMP destino,fonte

Esta instruo subtrai o operador fonte do destino, mas no armazena o
resultado da operao, apenas afeta o estado dos flags.

                                   

 INSTRUO CMPS (CMPSB) (CMPSW)

Propsito: Comparar cadeias de um byte ou uma palavra.

Sintaxe:

CMP destino,fonte

Esta instruo compara efetuando uma subtrao entre o byte ou palavra
endereado por DI, dentro do segmento extra de dados, e o byte ou palavra
endereado por SI dentro do segmento de dados, afetando o registrador de
flags, mas sem devolver o resultado da subtrao.

A instruo automaticamente incrementa ou decrementa os registradores de
ndice SI e DI, dependendo do valor do flag DF, de modo a indicar os
prximos dois elementos a serem comparados. O valor de incremento ou
decremento  uma de uma ou duas unidades, dependendo da natureza da
operao.

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.

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 de hardware interno
5.1.2.Interrupes de hardware externo
5.1.3.Interrupes de software
5.1.4.Interrupes mais comuns
                                   

5.1.1.Interrupes de hardware interno

Interrupes internas so geradas por certos eventos que ocorrem durante a
execuo de um programa.

Este tipo de interrupes so gerenciadas, na sua totalidade, pelo hardware
e no  possvel modific-las.

Um exemplo claro deste tipo de interrupes  a que atualiza o contador do
clock interno do computador, o hardware chama esta interrupo muitas vezes
durante um segundo.

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.2.Interrupes de hardware externo

Interrupes externas so geradas atravs de dispositivos perifricos, tais
como teclados, impressoras, placas de comunicao, entre outros. So tambm
geradas por co-processadores.

No  possvel desativar interrupes externas.

Estas interrupes no so enviadas diretamente para a CPU, mas, de uma
forma melhor, so enviadas para um circuito integrado cuja funo exclusiva
 manusear este tipo de interrupo. O circuito, chamado PIC8259A, 
controlado pela CPU atravs de uma srie de comunicao chamada paths.


			--------------- // ---------------
                               
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.Interrupes mais comuns
                            
                                  
Contedo

5.1.4.1.Int 21H (Interrupo do DOS)
		Mltiplas chamadas  funes DOS.

5.1.4.2.Int 10H (Interrupo do BIOS)
		Entrada e Sada de Vdeo.

5.1.4.3.Int 16H (Interrupo do BIOS)
		Entrada e Sada do Teclado.

5.1.4.4.Int 17H (Interrupo do BIOS)
		Entrada e Sada da Impressora.

                                  
			--------------- // ---------------

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 Abertura de arquivo
     14H Leitura seqencial
     15H Escrita seqencial
     16H Criao de arquivo
     21H Leitura randmica
     22H Escrita randmica

Handles

     3CH Criao de arquivo
     3DH Abertura de arquivo
     3EH Fechamento de arquivo
     3FH Leitura de arquivo/dispositivo
     40H Escrita de arquivo/dispositivo
     42H 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
armazenado no registrador DL, e no modifica nenhum registrador.

O uso da funo 40H  recomendado ao invs desta funo.

                                   

 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.

 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

 muito fcil ler um caracter do teclado com esta funo, o cdigo
hexadecimal do caracter lido  armazenado no registrador AL. Nos caso de
teclas especiais, como as de funo F1, F2, alm de outras, o registrador AL
conter o valor 1, sendo necessrio chamar a funo novamente para obter o
cdigo daquele caracter.

                                   

 FUNO 0AH

Uso:

Ler caracteres do teclado e armazen-los num buffer.

Registradores de chamada:

AH = 0AH
DS:DX = Endereo inicial da rea de armazenamento
BYTE 0 = Quantidade de bytes na rea
BYTE 1 = Quantidade de bytes lidos
do BYTE 2 at BYTE 0 + 2 = caracteres lidos

Registradores de retorno:

Nenhum.

Os caracteres so lidos e armazenados num espao de memria que foi
definido. A estrutura deste espao indica que o primeiro byte representar a
quantidade mxima de caracteres que pode ser lida. O segundo, a quantidade
de caracteres lidos e, no terceiro byte, o inicio onde eles so armazenados.

Quando se atinge a quantidade mxima permitida, ouve-se o som do speaker e
qualquer caracter adicional  ignorado. Para finalizar a entrada, basta
digitar [ENTER].

                                   

 FUNO 3FH

Uso:

Ler informao de um dispositivo ou de um arquivo.

Registradores de chamada:

AH = 3FH
BX = Nmero do handle
CX = Nmero de bytes a ler
DS:DX = rea para receber o dado

Registradores de retorno:

CF = 0 se no h erro e AX = nmero de bytes lidos.
CF = 1 se h erro e AX conter o cdigo de erro.

                                   

 FUNO 0FH

Uso:

Abrir um arquivo FCB.

Registradores de chamada:

AH = 0FH
DS:DX = Ponteiro para um FCB

Registradores de retorno:

AL = 00H se no h problemas, de outra forma retorna 0FFH

                                   

 FUNO 14H

Uso:

Leitura 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:

AL = 00H se no h erros, de outra forma conter o cdigo de erro:  1 disco cheio ou
arquivo somente de leitura, 2 erro na formao ou na especificao do FCB.

A funo 15H atualiza o FCB aps a escrita do registro para o presente
bloco.

                                   

 FUNO 16H

Uso:

Criar um arquivo FCB. Registradores de chamada:

AH = 16H
DS:DX = Ponteiro para um FCB j aberto.

Registradores de retorno:

AL = 00H se no h erros, de outra forma conter o valor 0FFH.

 baseada na informao advinda de um FCB para criar um arquivo num disco.

                                   

 FUNO 21H

Uso:

Ler de modo randmico um arquivo FCB.

Registradores de chamada:

AH = 21H
DS:DX = Ponteiro para FCB aberto.

Registradores de retorno:

A = 00H se no h erro, de outra forma AH conter o cdigo de erro:
1 se  o fim do arquivo, 2 se h um erro de especificao no FCB e 3 se um registro foi
lido parcialmente ou o ponteiro de arquivo est no fim do mesmo.

Esta funo l o registro especificado pelos campos do bloco atual e
registro de um FCB aberto e coloca a informao na DTA, rea de
Transferncia do Disco.

                                   

 FUNO 22H

Uso:

Escrita randmica num arquivo FCB.

Registradores de chamada:

AH = 22H
DS:DX = Ponteiro para um FCB aberto.

Registradores de retorno:

AL = 00H se no h erro, de outra forma conter o cdigo de erro:
1 se o disco est cheio ou o arquivo  apenas de leitura e 2 se h um erro na especificao FCB.

Escreve o registro especificado pelos campos do bloco atual e registro de um
FCB aberto. Esta informao  do contedo da DTA.

                                   

 FUNO 3CH

Uso:

Criar um arquivo se no existe ou deix-lo com 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           Atributos
         00H              Normal
         02H              Hidden
         04H              System
         06H              Hidden e System

O arquivo  criado com permisso de leitura e escrita. No  possvel a
criao de diretrios atravs desta funo.

                                   

 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
       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:

Fecha um arquivo (handle).

Registradores de chamada:

AH = 3EH
BX = Nmero do handle associado

Registradores de retorno:

CF = 0 se no h erros, ou CF ser 1 e AX conter o cdigo de erro: 06H se o handle  invlido.

Esta funo atualiza o arquivo e libera o handle que estava usando.

 FUNO 3FH

Uso:

Ler uma quantidade especfica de bytes de um arquivo aberto e armazen-los
num buffer especfico.


			--------------- // ---------------
                                   
5.1.4.2.Interrupo 10h

Propsito: Chamar uma diversidade de funes do BIOS

Sintaxe:

Int 10H

Esta interrupo tem vrias funes, todas para entrada e sada de vdeo.
Para acessar cada uma delas  necessrio colocar o nmero da funo
correspondente no registrador AH.

Veremos apenas as funes mais comuns da interrupo 10H.

Funo 02H, seleciona a posio do cursor
Funo 09H, exibe um caracter e o atributo na posio do cursor
Funo 0AH, exibe um caracter na posio do cursor
Funo 0EH, modo alfanumrico de exibio de caracteres

                                   

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 = 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:

Exibe um caracter na posio atual do cursor.

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.

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 = 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.

                                   

Funes da interrupo 16h

Funo 00H, l um caracter do teclado.
Funo 01H, l o estado atual do teclado.

Funo 00H Uso:

Ler um caracter do teclado.

Registradores de chamada:

AH = 00H

Registradores de retorno:

AH = Cdigo da tecla pressionada

AL = Valor ASCII do caracter

Quando se usa esta interrupo, os programas executam at que uma tecla seja
pressionada. Se  um valor ASCII,  armazenado no registrador AH. Caso
contrrio, o cdigo  armazenado no registrador AL e AH=0.

Este valor de AL pode ser utilizado quando queremos detectar teclas que no
esto diretamente representadas pelo seu valor ASCII, tais como
[ALT][CONTROL].

                                   

Funo 01h

Uso:

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
teclado 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 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

Funo 02h

Uso:

Obter o status da impressora.

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 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



			--------------- // ---------------
                               
5.2. Gerenciamento de Arquivos
                                   
Contedo:

5.2.1.Modos de trabalhar com arquivos
5.2.2.Mtodo FCB
5.2.3.Mtodos de canais de comunicao
                                   

5.2.1.Modos de trabalhar com arquivos.

H dois modos de trabalhar com arquivos. O primeiro  atravs de FCB (
blocos de controle de arquivo), o segundo  atravs de canais de
comunicao, tambm conhecidos como handles.

O primeiro modo de manusear arquivos tem sido usado desde o sistema
operacional CPM, predecessor do DOS, logo permite certas compatibilidades
com muitos arquivos velhos do CPM bem como com a verso 1.0 do DOS, alm
deste mtodo permitir-nos ter um nmero ilimitado de arquivos abertos ao
mesmo tempo. Se voc quiser criar um volume para o disco, a nica forma 
atravs deste mtodo.

Depois de considerarmos as vantagens de FCB, o uso do mtodo de Canais de
Comunicao  muito simples e permite-nos um melhor manuseio de erros.

Para uma melhor facilidade, daqui por diante nos referiremos aos Blocos de
Controle de Arquivo como FCBs e aos Canais de Comunicao como handles.


			--------------- // ---------------
                                 
5.2.2.Mtodo FCB.

5.2.2.1.Introduo
5.2.2.2.Abertura de arquivo
5.2.2.3.Criar um novo arquivo
5.2.2.4.Escrita seqencial
5.2.2.5.Leitura seqencial
5.2.2.6.Leitura e escrita randmica
5.2.2.7.Fechar um arquivo


			--------------- // ---------------

5.2.2.1.INTRODUO

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    COMPRIMENTO   SIGNIFICADO
    00H         1 Byte       Drive
    01H         8 Bytes      Nome do arquivo
    09H         3 Bytes      Extenso
    0CH         2 Bytes      Nmero do bloco
    0EH         2 Bytes      Tamanho do registro
    10H         4 Bytes      Tamanho do arquivo
    14H         2 Bytes      Data de criao
    16H         2 Bytes      Hora de criao
    18H         8 Bytes      Reservado
    20H         1 Bytes      Registro corrente
    21H         4 Bytes      Registro randmico

Para selecionar o drive de trabalho, assuma: drive A = 1; drive B = 2; etc.
Se for usado 0, o drive que est sendo usado no momento ser tomado como
opo.

O nome do arquivo deve ser justificado  esquerda e  necessrio preencher
com espaos os bytes remanescentes, a extenso  colocada do mesmo modo.

O bloco corrente e o registro corrente dizem ao computador que registro ser
acessado nas operaes de leitura e escrita. Um bloco  um grupo de 128
registros. O primeiro bloco de arquivo  o bloco 0. O primeiro registro  o
registro 0, logo o ltimo registro do primeiro bloco deve ser o 127, uma vez
que a numerao  iniciada com 0 e o bloco pode conter 128 registradores no
total.

			--------------- // ---------------
                                
5.2.2.2.ABERTURA DE ARQUIVO

Para abrir um arquivo FCB  usada a funo 0FH da interrupo 21h.
A unidade, o nome e a extenso do arquivo devem ser inicializadas antes da
abertura.

O registrador DX deve apontar para o bloco. Se o valor FFH  retornado no
registrador AH quando da chamada da interrupo, ento o arquivo no foi
encontrado. Se tudo der certo, o valor 0  retornado.

Se o arquivo  aberto, ento o DOS inicializa o bloco corrente em 0, o
tamanho do registro para 128 bytes. O tamanho do arquivo e a sua data so
preenchidos com as informaes encontradas no diretrio.

			--------------- // ---------------
                                  
5.2.2.3.CRIAR UM NOVO ARQUIVO

Para a criao de arquivos  usada a funo 16H da interrupo 21h.

O registrador DX deve apontar para uma estrutura de controle cujo os
requisitos so de que pelo menos a unidade lgica, o nome e a extenso do
arquivo sejam definidas.

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

Antes de conseguirmos realizar escrita para o disco,  necessrio definir a
rea de transferncia de dados usando, para tanto, a funo 1AH da
interrupo 21h.

A funo 1AH no retorna qualquer estado do disco nem da operao. Mas a
funo 15H, que usaremos para escrever para o disco, faz isso no registrador
AL. Se este for igual a zero, ento no h erro e os campos de registro
corrente e de bloco so atualizados.

                                   
			--------------- // ---------------

5.2.2.5.LEITURA SEQENCIAL

Antes de tudo, devemos definir a rea de transferncia de arquivo ou DTA.
Para a leitura seqencial usaremos a funo 14H da interrupo 21h.

O registro a ser lido  definido pelos campos registro e bloco corrente. O
registrador AL retorna o estado da operao. Se AL contm o valor 1 ou 3,
significa que foi atingido o fim do arquivo. Um valor 2, por sua vez,
significa que o FCB est estruturado erroneamente.

Caso no ocorra erro, AL conter o valor 0 e os campos de registro e bloco
corrente so atualizados.

			--------------- // ---------------
                                   
5.2.2.6.LEITURA E ESCRITA RANDMICA

A funo 21H e a funo 22H da insterrupo 21h so usadas  realizao,
respectivamente, da escrita e leitura randmica.

O nmero de registro randmico e o bloco corrente so usados para calcular a
posio relativa do registro a ser lido ou escrito.

O registrador AL retorna a mesma informao do que par a escrita e leitura
seqencial. A informao a ser lida ser retornada na rea de transferncia
do disco, bem como a informao a ser escrita retorna na DTA.

			--------------- // ---------------
                                   
5.2.2.7.FECHAR UM ARQUIVO

Para fechar um arquivo usamos a funo 10H da interrupo 21h.

Se aps invocar esta funo, o 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.

5.2.3.1.Trabalhando com handles
5.2.3.2.Funes para usar handles

                                   
5.2.3.1.TRABALHANDO COM HANDLES

O uso de handles para gerenciar arquivos traz grandes facilidades na criao
de arquivos e o programador pode concentrar-se em outros aspectos da
programao sem preocupar-se com detalhes que podem ser manuseados pelo
sistema operacional.

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.

Quando usamos este mtodo para trabalhar com arquivos, no h distino
entre acesso seqencial ou randmico, o arquivo  simplesmente tomado como
uma rede de bytes.

			--------------- // ---------------
                                  
5.2.3.2.FUNES PARA USAR HANDLES

As funes usadas para o manuseio de arquivos atravs de handles so
descritas na pgina sobre: Interrupes, na seo dedicada  interrupo 21h.
        

*****************************************************************************

                       CAPTULO 6: MACROS E PROCEDIMENTOS

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

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    ; Declarao do Procedimento
Mov BX, 0         ; Contedo do Procedimento...
Mov BL, AH
Mov AH, 00
Add BX, AX
Ret               ; Diretiva de retorno
Soma EndP         ; Fim do Procedimento

Na declarao, a primeira palavra, Soma, corresponde ao nome do
procedimento. Proc declara-o e a palavra Near indica que o procedimento  do
tipo intrasegment, ou seja, no mesmo segmento. A diretiva Ret carrega IP com
o endereo armazenado na pilha para retornar ao programa que chamou.
Finalmente, Soma EndP indica o 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, 02H
  MOV DH, Linha
  MOV DL, Coluna
  MOV BH, 0
  INT 10H
  POP DX
  POP BX
  POP AX
ENDM

Para usar uma macro basta cham-la pelo seu nome, tal como se fosse qualquer
instruo na linguagem assembly:

Pos 8, 6

			--------------- // ---------------
                                
6.2.3.Biblioteca de Macros

Uma das facilidades oferecidas pelo uso de macros  a criao de
bibliotecas, que so grupo de macros, podendo ser includas num programa
originrias de arquivos diferentes.

A criao destas bibliotecas  muito simples. Criamos um arquivo com todas
as macros que sero necessrias e o salvamos como um arquivo texto.

Para incluir uma biblioteca num programa, basta colocar a seguinte instruo
Include NomedoArquivo na parte inicial do programa, antes da declarao do
modelo de memria.

Supondo que o arquivo de macros tenha sido salvo com o nome de MACROS.TXT, a
instruo Include seria utilizada do seguinte modo:

  ;Incio do programa
        Include MACROS.TXT
        .MODEL SMALL
        .DATA
          ;Os dados vo aqui
        .CODE
        Inicio:
          ;O cdigo do programa comea aqui
        .STACK
          ;A pilha  declarada
        End Inicio
          ;Fim do programa


*****************************************************************************

                           CAPTULO 7: EXEMPLOS DE PROGRAMAS
                           
                               
Contedo:

7.1.Exemplos de Programas com Debug
7.2.Exemplos de Programas com TASM                         

			--------------- // ---------------

7.1.Exemplos de Programas com Debug

Nesta seo forneceremos alguns programas feitos no debug do DOS.
Voc pode executar cada programa assembly usando o comando "g" (go), para
ver o que cada programa faz.

Procedimento

Primeiro passo

Carregar o programa exemplo

Por exemplo:

C:\>debug
-n one.com
-l
-u 100 109
0D80:0100 B80600        MOV     AX,0006
0D80:0103 BB0400        MOV     BX,0004
0D80:0106 01D8          ADD     AX,BX
0D80:0108 CD20          INT     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
-

                                   

Exemplos de programas no Debug

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

Este programa mostra 15 vezes na tela a string de caracteres.

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

Este programa muda o formato do cursor.

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

Este programa mostra na tela um nmero binrio atravs de um ciclo
condicional (LOOP) usando a rotao do byte.

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

Este programa imprime um valor zero em dgitos hexadecimais.

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

Este programa  usado para imprimir dois dgitos hexadecimais.

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

Este programa imprime o primeiro de dois dgitos hexadecimais.

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

297D:011D     CMP     DL,3A   ;Compara Dl com 3A
297D:0120     JL      0125    ;Salta ao endereo 0125, se menor
297D:0122     ADD     DL,07   ;Adiciona 07 a DL
297D:0125     INT     21      ;Chama interrupo do DOS
297D:0127     INT     20      ;Finaliza o programa

Este programa imprime o segundo de dois dgitos hexadecimais.

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

Este programa pode ler dois dgitos hexadecimais.

Dcimo primeiro exemplo

-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

Este programa se mantm lendo caracteres at receber um que possa ser
convertido para um nmero hexadecimal.


			--------------- // ---------------

7.2.Exemplos de Programas com TASM                         

Nesta seo forneceremos a voc vrios exemplos de programas a serem
montados fazendo uso do TASM da Borland.

Procedimento:

Para mont-los, siga os seguintes passos:

Primeiro passo

Montar o programa
Por exemplo:

C:\>tasm one.asm
Turbo Assembler  Version 2.0  Copyright (c) 1988, 1990 Borland International

Assembling file:   one.asm
Error messages:    None
Warning messages:  None
Passes:            1
Remaining memory:  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.

                                   

Exemplos de Programas Assembly

Primeiro exemplo

;nome do programa: one.asm
;
.model small
.stack
.code
   mov AH,1h       ;Funo 1 do DOS
   Int 21h         ;l o caracter e returna o cdigo ASCII ao registrador AL
   mov DL,AL       ;move o cdigo ASCII para o registrador DL
   sub DL,30h      ;subtrai de 30h para converter a um dgito de 0 a 9
   cmp DL,9h       ;compara se o dgito est entre 0 e 9
   jle digit1      ;se verdadeiro obtm o primeiro nmero (4 bits)
   sub DL,7h       ;se falso, subtrai de 7h para converter a uma letra A-F
digit1:
   mov CL,4h       ;prepara para multiplicar por 16
   shl DL,CL       ;multiplica para converter dentro dos 4 bits mais altos
   int 21h         ;obtm o prximo caracter
   sub AL,30h      ;repete a operao de converso
   cmp AL,9h       ;compara o valor 9h com o contedo do registrador AL
   jle digit2      ;se verdadeiro, obtm o segundo dgito
   sub AL,7h       ;se falso, subtrai de 7h
digit2:
   add DL,AL       ;adiciona o segundo dgito
   mov AH,4Ch      ;funo 4Ch do DOS (exit)
   Int 21h         ;interrupo 21h
   End             ;finaliza o programa

Este programa l dois caracteres e os imprime na tela

Segundo exemplo

;nome do programa: two.asm
.model small
.stack
.code
PRINT_A_J       PROC
     MOV DL,'A'      ;move o character A para o registrador DL
     MOV CX,10       ;move o valor decimal 10 para o registrador CX
                     ;este valor  usado para fazer lao com 10 interaes
PRINT_LOOP:
     CALL WRITE_CHAR ;Imprime o caracter em DL
     INC DL          ;Incrementa o valor do registrador DL
     LOOP PRINT_LOOP ;Lao para imprimir 10 caracteres
     MOV AH,4Ch      ;Funo 4Ch, para sair ao DOS
     INT 21h         ;Interrupo 21h
PRINT_A_J       ENDP ;Finaliza o procedimento

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

Este programa mostra os caracteres ABCDEFGHIJ na tela.

Terceiro exemplo

;nome do programa: three.asm
.model small
.STACK
.code

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

      END TEST_WRITE_HEX ;Finaliza o programa

Quarto exemplo

;nome do programa: four.asm
.model small
.stack
.code

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

      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       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

      END  PRINT_ASCII  ;Finaliza o programa

Este programa mostra na tela o valor dos 256 caracteres do cdigo ASCII.



*****************************************************************************

                           CAPTULO 8: BIBLIOGRAFIA

Crditos:

Monico Briseo C., Engenheiro
     Idia Original
     Desenvolvimento e Implementao da edio 1996

Hugo Eduardo Prez P.
     Desenvolvimento e Implementao da edio 1995

Vctor Hugo Avila B.
     Verso Inglesa

Jeferson Botelho do Amaral
     Verso Portuguesa

Ana Mara Peraza
     Programadora de Linguagem Assembly

Graciela Salcedo Mancilla
     Programadora Tcl/Tk

Juan Olmos Monroy
     Designer Grfico

                                   

Referncias Bibliogrficas:

Assembly Language For IBM Microcomputers
     J. Terry Godfrey
     Prentice Hall Hispanoamericana, S.A.
     Mexico

Basic Assembler
     A. Rojas
     Ed Computec Editores S.A. de C.V.
     Mexico

IBM Personal Computer Assembly Language Tutorial
     Joshua Auerbach
     Yale University

Organizao Estruturada de Computadores
     Andrew S. Tanenbaum
     Prentice Hall do Brasil

Guia do Programador para as Placas EGA e VGA
     Richard F. Ferraro
     Ed. Cincia Moderna

Programando em Assembler 8086/8088
     Jeremias R. D. Pereira dos Santos
     Edison Raymundi Junior
     McGraw-Hill

Assembly IBM PC - Tcnicas de Programao
     Alan R. Miller
     EBRAS, Editora Brasileira

Linguagem Assembly para IBM PC
     Peter Norton
     John Socha
     Editora Campus

C - Caixa de Ferramentas
     Carlos Augusto P. Gomes
     Antonio Carlos Barbosa
     Editora rica

Interrupes MS-DOS, ROM-BIOS
     Eurico Soalheiro Brs
     McGraw-Hill

Desenvolvimento de Software Bsico
     Leland L. Beck
     Editora Campus

Programao Assembly 80386 - Guia Prtico para Programadores
     Ross P. Nelson
     McGraw-Hill
