University of Guadalajara Information Sistems General Coordination.

Culture and Entertainment Web June 12th 1995 Copyright(C)1995-1996 ***************************************************************************** * Este tutorial foi traduzido para o Portugu�s 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 provided that: whole or in part,

(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 ----------------Conte�do: 1.Introdu��o 2.Conceitos B�sicos 3.Programa��o Assembly 4.Instru��es Assembly 5.Interrup��es e ger�ncia de arquivos 6.Macros e procedimentos 7.Exemplos de programas 8.Bibliografia ***************************************************************************** CAP�TULO 1: INTRODU��O Conte�do: 1.1.O que h� de novo neste material 1.2.Apresenta��o 1.3.Por que aprender Assembly? 1.4.N�s precisamos da sua opini�o --------------- // --------------1.1.O que h� de novo neste material: A S S E M B L Y ---------------

Ap�s um ano da realiza��o da primeira vers�o do tutorial, e atrav�s das opini�es recebidas por e-mail, resolvemos ter por disposi��o todos estes coment�rios e sugest�es. Esperamos que atrav�s deste novo material Assembly, as pessoas que se mostrarem interessadas possam aprender mais sobre o seu IBM PC. Esta nova edi��o do tutorial inclui: Uma se��o completa sobre como usar o programa debug. Mais exemplos de programas. Um motor de pesquisa, para qualquer t�pico ou item relacionado � esta nova vers�o. Consider�vel reorganiza��o e revis�o do material Assembly. Em cada se��o, h� um link para o Dicion�rio On-line de Computa��o de Dennis Howe. 1.2.Apresenta��o: 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 fam�lia Intel, e considerando que a base da linguagem � o funcionamento dos recursos internos do processador, os exemplos descritos n�o s�o compat�veis com qualquer outra arquitetura. As informa��es est�o dispostas em unidades ordenadas para permitir f�cil acesso a cada t�pico, bem como uma melhor navega��o pelo tutorial. Na se��o introdut�ria s�o mencionados alguns conceitos elementares sobre computadores e a Linguagem Assembly em si. 1.3.Por que aprender Assembly? A primeira raz�o 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 raz�o � que voc� pode ter um controle total sobre o PC ao fazer uso do assembler. Uma outra raz�o � que programas assembly s�o mais r�pidos, menores e mais poderosos do que os criados com outras linguagens. Ultimamente, o assembler (montador) permite uma otimiza��o ideal nos programas, seja no seu tamanho ou execu��o. 1.4.N�s precisamos da sua opini�o: Nosso intuito � oferecer um modo simples para que voc� consiga aprender Assembly por si mesmo. Por tanto, qualquer coment�rio ou sugest�o ser� bem-vinda. ***************************************************************************** CAP�TULO 2: CONCEITOS B�SICOS

Conte�do: 2.1.Descri��o b�sica de um sistema computacional. 2.2.Conceitos b�sicos da Linguagem Assembly 2.3.Usando o programa debug --------------- // --------------Esta se��o tem o prop�sito de fazer um breve coment�rio a respeito dos principais componentes de um sistema computacional, o que ir� permitir ao usu�rio uma melhor compreens�o dos conceitos propostos no decorrer do tutorial. 2.1.DESCRI��O DE UM SISTEMA COMPUTACIONAL Conte�do: 2.1.1.Processador Central 2.1.2.Mem�ria Principal 2.1.3.Unidades de Entrada e Sa�da 2.1.4.Unidades de Mem�ria Auxiliar Sistema Computacional. Chamamos de Sistema Computacional a completa configura��o de um computador, incluindo os perif�ricos e o sistema operacional. 2.1.1.Processador Central. � tamb�m conhecido por CPU ou Unidade Central de Processamento, que por sua vez � composta pela unidade de controle e unidade de l�gica e aritm�tica. Sua fun��o consiste na leitura e escrita do conte�do das c�lulas de mem�ria, regular o tr�fego de dados entre as c�lulas de mem�ria e registradores especiais, e decodificar e executar as instru��es de um programa. O processador tem uma s�rie de c�lulas de mem�ria usadas com freq��ncia e, dessa forma, s�o partes da CPU. Estas c�lulas s�o conhecidas com o nome de registradores. Um processador de um PC possui cerca de 14 registradores. Como os PCs tem sofrido evolu��o veremos que podemos manipular registradores de 16 ou 32 bits. A unidade de l�gica e aritm�tica da CPU realiza as opera��es relacionadas ao c�lculo simb�lico e num�rico. Tipicamente estas unidades apenas s�o capazes de realizar opera��es elementares, tais como: adi��o e subtra��o de dois n�meros inteiros, multiplica��o e divis�o de n�mero inteiro, manuseio de bits de registradores e compara��o do conte�do 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.Mem�ria Principal. � um grupo de c�lulas, agora sendo fabricada com semi-condutores, usada para

processamentos gerais, tais como a execu��o de programas e o armazenamento de informa��es para opera��es. Cada uma das c�lulas pode conter um valor num�rico e � capaz de ser endere�ada, isto �, pode ser identificada de forma singular em rela��o �s outras c�lulas pelo uso de um n�mero ou endere�o. O nome gen�rico destas mem�rias � Random Access Memory ou RAM. A principal desvantagem deste tipo de mem�ria � o fato de que seus circuitos integrados perdem a informa��o que armazenavam quando a energia el�trica for interrompida, ou seja, ela � vol�til. Este foi o motivo que levou � cria��o de um outro tipo de mem�ria cuja informa��o n�o � perdida quando o sistema � desligado. Estas mem�rias receberam o nome de Read Only Memory ou ROM. 2.1.3.Unidades de Entrada e Sa�da. Para que o computador possa ser �til para n�s se faz necess�rio que o processador se comunique com o exterior atrav�s de interfaces que permitem a entrada e a sa�da de informa��o entre ele e a mem�ria. Atrav�s do uso destas comunica��es � poss�vel introduzir informa��o a ser processada e mais tarde visualizar os dados processados. Algumas das mais comuns unidades de entrada s�o o teclado e o mouse. As mais comuns unidades de sa�da s�o a tela do monitor e a impressora. 2.1.4.Unidades de Mem�ria Auxiliar. Considerando o alto custo da mem�ria principal e tamb�m o tamanho das aplica��es atualmente, vemos que ela � muito limitada. Logo, surgiu a necessidade da cria��o de dispositivos de armazenamento pr�ticos e econ�micos. Estes e outros inconvenientes deram lugar �s unidades de mem�ria auxiliar, perif�ricos. As mais comuns s�o as fitas e os discos magn�ticos. A informa��o ali armazenada ser� dividida em arquivos. Um arquivo � feito de um n�mero vari�vel de registros, geralmente de tamanho fixo, podendo conter informa��o ou programas. --------------- // --------------2.2.CONCEITOS B�SICOS Conte�do: 2.2.1.Informa��es nos computadores 2.2.2.M�todos de representa��o de dados 2.2.1.Informa��o no computador: 2.2.1.1.Unidades de informa��o 2.2.1.2.Sistemas num�ricos 2.2.1.3.Convertendo n�meros bin�rios para decimais 2.2.1.4.Convertendo n�meros decimais para bin�rios

2.2.1.5.Sistema hexadecimal

2.2.1.1.Unidades de informa��o Para o PC processar a informa��o, � necess�rio que ela esteja em c�lulas especiais, chamadas registradores. Os registradores s�o grupos de 8 ou 16 flip-flops. Um flip-flop � um dispositivo capaz de armazenar 2 n�veis de voltagem, um baixo, geralmente 0.5 volts, e outro comumente de 5 volts. O n�vel baixo de energia no flip-flop � interpretado como desligado ou 0, e o n�vel alto, como ligado ou 1. Estes estados s�o geralmente conhecidos como bits, que s�o a menor unidade de informa��o 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 num�ricos O sistema num�rico que n�s usamos diariamente � o decimal, mas este sistema n�o � conveniente para m�quinas, pois ali as informa��es t�m que ser codificadas de modo a interpretar os estados da corrente (ligado-desligado); este modo de c�digo faz com que tenhamos que conhecer o c�lculo posicional que nos permitir� expressar um n�mero em qualquer base onde precisarmos dele. � poss�vel representar um determinado n�mero em qualquer base atrav�s da seguinte f�rmula: Onde n � a posi��o do d�gito, iniciando da direita para a esquerda e numerando de 0. D � o d�gito sobre o qual n�s operamos e B � a base num�rica usada. 2.2.1.3.Convertendo n�meros bin�rios para decimais Quando trabalhamos com a Linguagem Assembly encontramos por acaso a necessidade de converter n�meros de um sistema bin�rio, que � usado em computadores, para o sistema decimal usado pelas pessoas. O sistema bin�rio � baseado em apenas duas condi��es ou estados, estar ligado(1), ou desligado(0), portanto sua base � dois. Para a convers�o, podemos usar a f�rmula de valor posicional: Por exemplo, se tivermos o n�mero bin�rio 10011, tomamos cada d�gito da direita para a esquerda e o multiplicamos pela base, elevando � pot�ncia correspondente � sua posi��o relativa: Binary: Decimal: 1 1*2^0 1 0 0 1

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

=

1

+

2

+

0

+

0

+

16

= 19 decimal.

O caracter ^ � usado em computa��o como s�mbolo para pot�ncia e * para a multiplica��o. 2.2.1.4.Convertendo n�meros decimais para bin�rio H� v�rios m�todos para se converter n�meros decimais para bin�rio; apenas um ser� analizado aqui. Naturalmente a convers�o com uma calculadora cient�fica � muito mais f�cil, mas nem sempre podemos contar com isso, logo o mais conveniente �, ao menos, sabermos uma f�rmula para faz�-la. O m�todo resume-se na aplica��o de divis�es sucessivas por 2, mantendo o resto como o d�gito bin�rio e o resultado como o pr�ximo n�mero a ser dividido. Tomemos como exemplo o n�mero 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 bin�rio 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 d�gitos, que v�o de 0 a 9 e da letra A at� a F, estas letras representam os n�meros de 10 a 15. Portanto contamos: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E, e F. A convers�o entre n�meros bin�rios e hexadecimais � f�cil. A primeira coisa a fazer � dividir o n�mero bin�rio em grupos de 4 bits, come�ando da direita para a esquerda. Se no grupo mais � direita sobrarem d�gitos, completamos com zeros. Tomando como exemplo o n�mero bin�rio 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 n�mero independente e consideramos o seu valor decimal: 0010=2;1011=11 Entretanto, observa-se que n�o podemos representar este n�mero como 211, isto seria um erro, uma vez que os n�meros em hexa maiores que 9 e menores que 16 s�o representados pelas letras A,B,...,F. Logo, obtemos como resultado: 2Bh, onde o "h" representa a base hexadecimal.

Para a convers�o de um n�mero hexadecimal em bin�rio � apenas necess�rio inverter os passos: tomamos o primeiro d�gito hexadecimal e o convertemos para bin�rio, a seguir o segundo, e assim por diante. --------------- // --------------2.2.2.M�todos de representa��o de dados num computador. 2.2.2.1.C�digo ASCII 2.2.2.2.M�todo BCD 2.2.2.3.Representa��o de ponto flutuante

2.2.2.1.C�digo ASCII ASCII significa American Standard Code for Information Interchange. Este c�digo cont�m as letras do alfabeto, d�gitos decimais de 0 a 9 e alguns s�mbolos adicionais como um n�mero bin�rio de 7 bits, tendo o oitavo bit em 0, ou seja, desligado. Deste modo, cada letra, d�gito ou caracter especial ocupa 1 byte na mem�ria do computador. Podemos observar que este m�todo de representa��o de dados � muito ineficiente no aspecto num�rico, uma vez que no formato bin�rio 1 byte n�o � suficiente para representar n�meros de 0 a 255, com o ASCII podemos representar apenas um d�gito. Devido a esta inefici�ncia, o c�digo ASCII � usado, principalmente, para a representa��o de textos.

2.2.2.2.M�todo BCD BCD significa Binary Coded Decimal. Neste m�todo grupos de 4 bits s�o usados para representar cada d�gito decimal de 0 a 9. Com este m�todo podemos representar 2 d�gitos por byte de informa��o. Vemos que este m�todo vem a ser muito mais pr�tico para representa��o num�rica do que o c�digo ASCII. Embora ainda menos pr�tico do que o bin�rio, com o m�todo BCD podemos representar d�gitos de 0 a 99. Com o bin�rio, vemos que o alcance � maior, de 0 a 255. Este formato (BCD) � principalmente usado na representa��o de n�meros grandes, aplica��es comerciais, devido �s suas facilidades de opera��o. 2.2.2.3.Representa��o de ponto flutuante Esta representa��o � baseada em nota��o cient�fica, isto �, representar um n�mero em 2 partes: sua base e seu expoente.

Por exemplo o n�mero decimal 1234000, � representado como 1.234*10^6, observamos que o expoente ir� indicar o n�mero de casas que o ponto decimal deve ser movido para a direita, a fim de obtermos o n�mero original. O expoente negativo, por outro lado, indica o n�mero de casas que o ponto decimal deve se locomover para a esquerda.

--------------- // --------------2.3.PROGRAMA DEBUG Conte�do: 2.3.1.Processo de cria��o 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 cria��o de programas. Para a cria��o de programas s�o necess�rios os seguintes passos: * Desenvolvimento do algoritmo, est�gio em que o problema a ser solucionado � estabelecido e a melhor solu��o � proposta, cria��o de diagramas esquem�ticos relativos � melhor solu��o proposta. * Codifica��o do algoritmo, o que consiste em escrever o programa em alguma linguagem de programa��o; linguagem assembly neste caso espec�fico, tomando como base a solu��o proposta no passo anterior. * A transforma��o para a linguagem de m�quina, ou seja, a cria��o do programa objeto, escrito como uma seq��ncia de zeros e uns que podem ser interpretados pelo processador. * O �ltimo est�gio � a elimina��o de erros detectados no programa na fase de teste. A corre��o normalmente requer a repeti��o de todos os passos, com observa��o atenta.

2.3.2.Registradores da CPU. Para o prop�sito did�tico, vamos focar registradores de 16 bits. A CPU possui 4 registradores internos, cada um de 16 bits. S�o eles AX, BX, CX e DX. S�o registradores de uso geral e tamb�m podem ser usados como registradores de 8 bits. Para tanto devemos referenci�-los como, por exemplo, AH e AL, que s�o, respectivamente, o byte high e o low do registrador AX. Esta nomenclatura tamb�m 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 C�digo BP Registrador Apontador da Base SI Registrador de �ndice Fonte DI Registrador de �ndice Destino SP Registrador Apontador de Pilha IP Registrador Apontador da Pr�xima Instru��o F Registrador de Flag

2.3.3.Programa Debug. Para a cria��o de um programa em assembler existem 2 op��es: usar o TASM Turbo Assembler da Borland, ou o DEBUGGER. Nesta primeira se��o vamos usar o debug, uma vez que podemos encontr�-lo em qualquer PC com o MS-DOS. Debug pode apenas criar arquivos com a extens�o .COM, e por causa das caracter�sticas deste tipo de programa, eles n�o podem exceder os 64 Kb, e tamb�m devem iniciar no endere�o de mem�ria 0100H dentro do segmento espec�fico. � importante observar isso, pois deste modo os programas .COM n�o s�o reloc�veis. Os principais comandos do programa debug s�o: A D E G N P Q R T U W Montar instru��es simb�licas em c�digo de m�quina Mostrar o conte�do de uma �rea da mem�ria Entrar dados na mem�ria, iniciando num endere�o espec�fico Rodar um programa execut�vel na mem�ria Dar nome a um programa Proceder, ou executar um conjunto de instru��es relacionadas Sair do programa debug Mostrar o conte�do de um ou mais registradores Executar passo a passo as instru��es Desmontar o c�digo de m�quina em instru��es simb�licas Gravar um programa em disco

� poss�vel 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 diret�rio C:\DOS. Para inici�-lo, basta digitar Debug na linha de comando: C:/>Debug [Enter] Voc� notar� ent�o a presen�a de um h�fen no canto inferior esquerdo da tela. N�o se espante, este � o prompt do programa. Para visualizar o conte�do dos registradores, experimente: -r[Enter] AX=0000 BX=0000 DS=0D62 ES=0D62 0D62:0100 2E CX=0000 DX=0000 SS=0D62 CS=0D62 CS: SP=FFEE IP=0100 BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC

0D62:0101 803ED3DF00

CMP

BYTE PTR [DFD3],00

CS:DFD3=03

� mostrado o conte�do de todos os registradores internos da CPU; um modo alternativo para visualizar um �nico registrador � usar o camando "r" seguido do par�metro que faz refer�ncia ao nome do registrador: -rbx BX 0000 : Esta instru��o mostrar� o conte�do do registrador BX e mudar� o indicador do Debug de "-" para ":" Quando o prompt assim se tornar, significa que � poss�vel, embora n�o obrigat�ria, a mudan�a do valor contido no registrador, bastando digitar o novo valor e pressionar [Enter]. Se voc� simplesmente pressionar [Enter] o valor antigo se mant�m. 2.3.4.Estrutura Assembly. Nas linhas do c�digo em Linguagem Assembly h� duas partes: a primeira � o nome da instru��o a ser executada; a segunda, os par�metros do comando. Por exemplo: add ah bh Aqui "add" � o comando a ser executado, neste caso uma adi��o, e "ah" bem como "bh" s�o os par�metros. Por exemplo: mov al, 25 No exemplo acima, estamos usando a instru��o mov, que significa mover o valor 25 para o registrador al. O nome das instru��es nesta linguagem � constitu�do de 2, 3 ou 4 letras. Estas instru��es s�o chamadas mnem�nicos ou c�digos de opera��o, representando a fun��o que o processador executar�. �s vezes instru��es aparecem assim: add al,[170] Os colchetes no segundo par�metro indica-nos que vamos trabalhar com o conte�do da c�lula de mem�ria de n�mero 170, ou seja, com o valor contido no endere�o 170 da mem�ria e n�o com o valor 170, isto � conhecido como "endere�amento direto".

2.3.5.Criando um programa simples em assembly. N�o nos responsabilizaremos pela m� execu��o ou poss�veis danos causados por quaisquer exemplos que de agora em diante aparecer�o, uma vez que os mesmos, apesar de testados, s�o de car�ter did�tico. Vamos, ent�o, 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 endere�o inicial para o nosso programa como o par�metro, mas � opcional. No caso de omiss�o, o endere�o inicial � o especificado pelos registradores CS:IP, geralmente 0100h, o local em que programas com extens�o .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 n�o seja necess�rio darmos um par�metro ao comando "a", isso � recomend�vel para evitar problemas, logo: a 100[enter] mov ax,0002[enter] mov bx,0004[enter] add ax,bx[enter] nop[enter][enter] O que o programa faz? Move o valor 0002 para o registrador ax, move o valor 0004 para o registrador bx, adiciona o conte�do dos registradores ax e bx, guardando o resultado em ax e finalmente a instru��o nop (nenhuma opera��o) finaliza o programa. No programa debug, a tela se parecer� com: C:\>debug -a 100 0D62:0100 0D62:0103 0D62:0106 0D62:0108 0D62:0109

mov ax,0002 mov bx,0004 add ax,bx nop

Entramos com o comando "t" para executar passo a passo as instru��es: -t AX=0002 BX=0000 DS=0D62 ES=0D62 0D62:0103 BB0400 CX=0000 DX=0000 SP=FFEE SS=0D62 CS=0D62 IP=0103 MOV BX,0004 BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC

Vemos o valor 0002 no registrador AX. Teclamos "t" para executar a segunda instru��o: -t AX=0002 BX=0004 DS=0D62 ES=0D62 0D62:0106 01D8 CX=0000 DX=0000 SP=FFEE SS=0D62 CS=0D62 IP=0106 ADD AX,BX BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC

Teclando "t" novamente para ver o resultado da instru��o add: -t AX=0006 BX=0004 DS=0D62 ES=0D62 0D62:0108 90 CX=0000 DX=0000 SS=0D62 CS=0D62 NOP SP=FFEE IP=0108 BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PE NC

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. N�o seria pr�tico ter que digitar o programa cada vez que inici�ssemos o Debug. Ao inv�s disso, podemos armazen�-lo no disco. S� que o mais interessante nisso � que um simples comando de salvar cria um arquivo com a extens�o .COM, ou seja, execut�vel - sem precisarmos efetuar os processos de montagem e liga��o, como veremos posteriormente com o TASM. Eis os passos para salvar um programa que j� esteja na mem�ria: * Obter o tamnho do programa subtraindo o endere�o final do endere�o 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 id�ia de como realizar os passos acima descritos: 0C1B:0100 0C1B:0103 0C1B:0106 0C1B:0108 0C1B:010A mov mov add int ax,0002 bx,0004 ax,bx 20

Para obter o tamanho de um programa, o comando "h" � usado, j� que ele nos mostra a adi��o e subtra��o de dois n�meros em hexadecimal. Para obter o tamanho do programa em quest�o, damos como par�metro o valor do endere�o final do nosso programa (10A), e o endere�o inicial (100). O primeiro resultado mostra-nos a soma dos endere�os, o segundo, a subtra��o. -h 10a 100 020a 000a O comando "n" permite-nos nomear o programa. -n test.com O comando "rcx" permite-nos mudar o conte�do 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 s�o necess�rios: Dar o nome do arquivo a ser carregado. Carreg�-lo usando o comando "l" (load). Para obter o resultado correto destes passos, � necess�rio 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 mem�ria. O que ele faz � desmontar o c�digo e mostr�-lo em assembly. Os par�metros indicam ao Debug os endere�os inicial e final a serem desmontados. O Debug sempre carrega os programas na mem�ria no endere�o 100h, conforme j� comentamos. ***************************************************************************** CAP�TULO 3: PROGRAMA��O ASSEMBLY Conte�do: 3.1.Construindo programas em Assembly 3.2.Processo Assembly 3.3.Pequenos programas em Assembly 3.4.Tipos de instru��es --------------- // --------------3.1.Construindo programas em Assembly. 3.1.1.Software necess�rio 3.1.2.Programa��o Assembly 3.1.1.SOFTWARE NECESS�RIO 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 execut�vel 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, tamb�m da Borland.

N�s devemos criar os programas fonte com a extens�o .ASM para que o TASM reconhe�a e o transforme no programa objeto, um "formato intermedi�rio" do programa, assim chamado porque ainda n�o � um programa execut�vel e t�o pouco um programa fonte. O linker gera a partir de um programa .OBJ, ou da combina��o de v�rios deles, um programa execut�vel, cuja extens�o � normalmente .EXE, embora possa ser .COM dependendo da forma como for montado e ligado. 3.1.2.PROGRAMA��O ASSEMBLY Para construirmos os programas com o TASM, devemos estruturar o fonte de forma diferenciada ao que faz�amos com o programa debug. � importante incluir as seguintes diretivas assembly: .MODEL SMALL Define o melo de mem�ria a usar em nosso programa .CODE Define as instru��es do programa, relacionado ao segmento de c�digo .STACK Reserva espa�o de mem�ria para as instru��es de programa na pilha END Finaliza um programa assembly Vamos programar Primeiro passo Use qualquer editor para criar o programa fonte. Entre com as seguintes linhas: Primeiro exemplo ; use ; para .MODEL SMALL .STACK .CODE mov ah,01h mov cx,07h int 10h mov ah,4ch int 21h END fazer coment�rios em programas assembly ;modelo de mem�ria ;espa�o de mem�ria para instru��es do programa na pilha ;as linhas seguintes s�o instru��es do programa ;move o valor 01h para o registrador ah ;move o valor 07h para o registrador cx ;interrup��o 10h ;move o valor 4ch para o registrador ah ;interrup��o 21h ;finaliza o c�digo do programa

Este programa assembly muda o tamanho do cursor. Segundo passo Salvar o arquivo com o seguinte nome: exam1.asm N�o 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 Assembling file: Error messages: Warning messages: Passes: Remaining memory: exam1.asm None None 1 471k Copyright (c) 1988, 1990 Borland International

O TASM s� pode criar programas no formato .OBJ, que ainda n�o pode ser executado... Quarto passo Usar o programa TLINK para criar o programa execut�vel. Exemplo: C:\>tlink exam1.obj Turbo Link Version 3.0 Copyright (c) 1987, 1990 Borland International C:\> Onde exam1.obj � o nome do programa intermedi�rio, .OBJ. O comando acima gera diretamente o arquivo com o nome do programa intermedi�rio e a extens�o .EXE. � opcional a coloca��o da extens�o .obj no comando. Quinto passo Executar o programa execut�vel 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 equival�ncia 3.2.1.SEGMENTOS A arquitetura dos processadores x86 for�a-nos a usar segmentos de mem�ria para gerenciar a informa��o, o tamanho destes segmentos � de 64Kb. A raz�o de ser destes segmentos � que, considerando que o tamanho m�ximo de um n�mero que o processador pode gerenciar � dado por uma palavra de 16 bits ou registrador, assim n�o seria poss�vel acessar mais do que 65536 locais da mem�ria usando apenas um destes registradores. Mas agora, se a mem�ria do PC � dividida em grupos de segmentos, cada um com 65536 locais, e podemos usar

um endere�o ou registrador exclusivo para encontrar cada segmento, e ainda fazemos cada endere�o de um espec�fico slot com dois registradores, nos � poss�vel acessar a quantidade de 4294967296 bytes de mem�ria, que �, atualmente, a maior mem�ria que podemos instalar num PC. Desta forma, para que o montador seja capaz de gerenciar os dados, se faz necess�rio que cada informa��o ou instru��o se encontre na �rea correspondente ao seu segmento. O endere�o do segmento � fornecido ao montador pelos registradores DS, ES, SS e CS. Lembrando um programa no Debug, observe: 1CB0:0102 MOV AX,BX O primeiro n�mero 1CB0, corresponde ao segmento de mem�ria que est� sendo usado, o segundo � uma refer�ncia ao endere�o 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 n�mero de bytes que cada instru��o assembly precisa, j� que seria um desperd�cio de mem�ria usar segmentos inteiros. Por exemplo, se um programa precisa de apenas 10Kb para armazenar dados, o segmento de dados seria apenas de 10Kb e n�o de 64Kb, como poderia acontecer se feito manualmente. 3.2.2.TABELAS DE EQUIVAL�NCIA Cada uma das partes numa linha de c�digo assembly � conhecida como token, por exemplo: MOV AX,Var Aqui temos tr�s tokens, a instru��o MOV, o operador AX e o operador VAR. O que o montador faz para gerar o c�digo OBJ � ler cada um dos tokens e procurar a equival�ncia em c�digo de m�quina em tabelas correspondentes, seja de palavras reservadas, tabela de c�digos de opera��o, tabela de s�mbolos, tabela de literais, onde o significado dos mnem�nicos e os endere�os dos s�mbolos que usamos ser�o encontrados. A maioria dos montadores s�o de duas passagens. Em s�ntese na primeira passagem temos a defini��o dos s�mbolos, ou seja, s�o associados endere�os a todas as instru��es do programa. Seguindo este processo, o assembler l� MOV e procura-o na tabela de c�digos de opera��o para encontrar seu equivalente na linguagem de m�quina. 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 n�o � uma palavra reservada, ent�o procura na tabela de s�mbolos, l� encontrando-a ele designa o endere�o correspondente, mas se n�o encontrou ele a insere na tabela para que ela possa receber um endere�o na segunda passagem. Ainda na primeira passagem � executado parte do processamento das diretivas, � importante notar que as diretivas n�o criam c�digo objeto. Na passagem dois s�o montadas as instru��es, traduzindo os c�digos de opera��o e procurando os endere�os, e � gerado o c�digo objeto. H� s�mbolos que o montador n�o consegue encontrar, uma vez que podem ser declara��es externas. Neste caso o linker entra em a��o para criar a

estrutura necess�ria a fim de ligar as diversas poss�veis partes de c�digo, dizendo ao loader que o segmento e o token em quest�o s�o definidos quando o programa � carregado e antes de ser executado. --------------- // --------------3.3.Mais programas. Outro exemplo Primeiro passo 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 ;interrup��o 21h mov ah,4ch ;fun��o 4ch, sai para o sistema operacional int 21h ;interrup��o 21h end ;finaliza o programa Segundo passo Salvar o arquivo com o nome: exam2.asm N�o esquecer de salvar em formato ASCII. Terceiro passo Usar o programa TASM para construir o programa objeto. C:\>tasm exam2.asm Turbo Assembler Version 2.0 Assembling file: Error messages: Warning messages: Passes: Remaining memory: Quarto passo Usar o programa TLINK para criar o programa execut�vel. C:\>tlink exam2.obj Turbo Link Version 3.0 Copyright (c) 1987, 1990 Borland International C:\> Quinto passo Executar o programa: exam2.asm None None 1 471k Copyright (c) 1988, 1990 Borland International

C:\>exam2[enter] * C:\> Este programa imprime o caracter * na tela. Clique aqui para obter mais programas --------------- // --------------3.4.Tipos de instru��es. 3.4.1.Movimento de dados 3.4.2.Opera��es l�gicas e aritm�ticas 3.4.3.Saltos, la�os e procedimentos 3.4.1.MOVIMENTO DE DADOS Em qualquer programa h� necessidade de se mover dados na mem�ria e em registradores da CPU; h� v�rios modos de se faz�-lo: pode-se copiar os dados da mem�ria 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 restri��es, entre elas: *N�o � poss�vel mover dados de um local da mem�ria para outro diretamente; � necess�rio primeiro mover o dado do local de origem para um registrador e ent�o do registrador para o local de destino. *N�o � poss�vel mover uma constante diretamente para um registrador de segmento; primeiro deve-se mover para um registrador. � poss�vel mover blocos de dados atrav�s de instru��es movs, que copia uma cadeia de bytes ou palavras; movsb copia n bytes de um local para outro; e movsw copia n palavras. A �ltima das duas instru��es toma os valores dos endere�os definidos por DS:SI como o grupo de dados a mover e ES:DI como a nova localiza��o dos dados. Para mover dados h� tamb�m estruturas chamadas pilhas, onde o dado � introduzido com a instru��o push e � extra�do com a instru��o 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 � necess�rio seguir-se a ordem: POP CX POP BX POP AX Para a comunica��o com dispositivos externos o comando de sa�da � usado para

o envio de informa��es a uma porta e o comando de entrada � usado para receber informa��o de uma porta. A sintaxe do comando de sa�da: OUT DX,AX Onde DX cont�m o valor da porta que ser� usada para a comunica��o e AX cont�m a informa��o que ser� enviada. A sintaxe do comando de entrada: IN AX,DX Onde AX � o registrador onde a informa��o ser� armazenada e DX cont�m o endere�o da porta de onde chegar� a informa��o. 3.4.2.OPERA��ES L�GICAS E ARITM�TICAS As instru��es de opera��es l�gicas s�o: and, not, or e xor. Elas trabalham a n�vel de bits em seus operadores. Para verificar o resultado das opera��es usamos as instru��es cmp e test. As instru��es usadas para opera��es alg�bricas s�o: para adi��o add, para subtra��o sub, para multiplica��o mul e para divis�o div. Quase todas as instru��es de compara��o s�o baseadas na informa��o contida no registrador de flag. Normalmente os flags do registrador que podem ser manuseados diretamente pelo programador s�o os da dire��o de dados DF, usado para definir as opera��es sobre cadeias. Uma outro que pode tamb�m ser manuseado � o flag IF atrav�s das instru��es sti e cli, para ativar e desativar as interrup��es. 3.4.3.SALTOS, LOOPS E PROCEDIMENTOS Saltos incondicionais na escrita de programas em linguagem assembly s�o dados pela instru��o jmp; um salto � usado para modificar a seq��ncia da execu��o das instru��es de um programa, enviando o controle ao endere�o indicado, ou seja, o registrador contador de programa recebe este novo endere�o. Um loop, tamb�m conhecido como intera��o, � a repeti��o de um processo um certo n�mero de vezes at� atingir a condi��o de parada. ***************************************************************************** CAP�TULO 4: INSTRU��ES ASSEMBLY Conte�do: 4.1.Instru��es de opera��o de dados 4.2.Instru��es l�gicas e aritm�ticas 4.3.Instru��es de controle de processos

--------------- // --------------4.1. Instru��es de opera��o de dados Conte�do: 4.1.1.Instru��es de transfer�ncia 4.1.2.Instru��es de carga 4.1.3.Instru��es de pilha 4.1.1.Instru��es de transfer�ncia. S�o usadas para mover o conte�do dos operadores. Cada instru��o pode ser usada com diferentes modos de endere�amento. MOV MOVS (MOVSB) (MOVSW) INSTRU��O MOV Prop�sito: Transfer�ncia de dados entre c�lulas de mem�ria, 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 instru��o s�o: *Destino: *Destino: *Destino: *Destino: *Destino: *Destino: *Destino: *Destino: *Destino: Exemplo: MOV MOV MOV INT AX,0006h BX,AX AX,4C00h 21h mem�ria. acumulador. registrador de segmento. mem�ria/regitrador. registrador. registrador. mem�ria. registrador. mem�ria. Fonte: Fonte: Fonte: Fonte: Fonte: Fonte: Fonte: Fonte: Fonte: acumulador mem�ria mem�ria/registrador registrador de segmento registrador mem�ria registrador dado imediato dado imediato

Este pequeno programa move o valor 0006h para o registrador AX, ent�o ele move o conte�do de AX (0006h) para o registrador BX, e finalmente move o valor 4C00h para o registrador AX para terminar a execu��o com a op��o 4C da interrup��o 21h.

INSTRU��ES MOVS (MOVSB) (MOVSW) Prop�sito: Mover byte ou cadeias de palavra da fonte, endere�ada por SI, para o destino endere�ado por DI. Sintaxe: MOVS Este comando n�o necessita de par�metros uma vez que toma como endere�o fonte o conte�do do registrador SI e como destino o conte�do de DI. A seguinte seq��ncia de instru��es ilustra isso: MOV SI, OFFSET VAR1 MOV DI, OFFSET VAR2 MOVS Primeiro inicializamos os valores de SI e DI com os endere�os das vari�veis VAR1 e VAR2 respectivamente, ent�o ap�s a execu��o de MOVS o conte�do de VAR1 � copiado para VAR2. As instru��es MOVSB e MOVSW s�o usadas do mesmo modo que MOVS, a primeira move um byte e a segunda move uma palavra. Instru��es de carga. S�o instru��es espec�ficas para registradores, usadas para carregar bytes ou cadeias de bytes num registrador. LODS (LODSB) (LODSW) LAHF LDS LEA LES

INSTRU��ES LODS (LODSB) (LODSW) Prop�sito: Carregar cadeias de um byte ou uma palavra para o acumulador. Sintaxe: LODS Esta instru��o toma a cadeia encontrada no endere�o especificado por SI, a carrega para o registrador AL (ou AX) e adiciona ou subtrai, dependendo do estado de DF, para SI se � uma transfer�ncia de bytes ou de palavras. MOV SI, OFFSET VAR1 LODS Na primeira linha vemos a carga do endere�o de VAR1 em SI e na segunda � tomado o conte�do daquele local para o regiustrador AL. Os comandos LODSB e LODSW s�o usados do mesmo modo, o primeiro carrega um byte e o segundo uma palavra (usa todo o registrador AX).

INSTRU��O LAHF Prop�sito: Transferir o conte�do dos flags para o registrador AH. Sintaxe: LAHF Esta instru��o � �til para verificar o estado dos flags durante a execu��o do nosso programa. Os flags s�o deixados na seguinte ordem dentro do registrador: SF ZF ?? AF ?? PF ?? CF O "??" significa que haver� um valor indefinido naqueles bits.

INSTRU��O LDS Prop�sito: Carregar o registrador de segmento de dados. Sintaxe: LDS destino,fonte O operador fonte deve ser uma double word na mem�ria. A palavra associada com o maior endere�o � transferida para DS, em outras palavras isto � tomado como o endere�o de segmento. A palavra associada com o menor endere�o � o endere�o de deslocamento e � depositada no registrador indicado como destino.

INSTRU��O LEA Prop�sito: Carregar o endere�o do operador fonte. Sintaxe: LEA destino,fonte O operador fonte deve estar localizado na mem�ria, 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 prov�vel que para o programador � muito mais f�cil criar programas

grandes usando este �ltimo formato.

INSTRU��O LES Prop�sito: Carregar o registrador de segmento extra Sintaxe: LES destino,fonte O operador fonte deve ser uma palavra dupla na mem�ria. O conte�do da palavra com endere�o maior � interpretado como o endere�o do segmento e � colocado em ES. A palavra com endere�o menor � o endere�o do deslocamento e � colocada no registrador especificado no par�metro de destino.

Instru��es de manipula��o da pilha. Estas instru��es permitem usar a pilha para armazenar ou recuperar dados. POP POPF PUSH PUSHF

INSTRU��O POP Prop�sito: Recuperar uma parte de informa��o da pilha. Sintaxe: POP destino Esta instru��o 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 endere�o de mem�ria para o mais baixo, e a pilha trabalha apenas com palavras, 2 bytes, logo deve ser 2 o incremento de SP, na realidade 2 est� sendo subtra�do do tamanho real da pilha.

INSTRU��O POPF Prop�sito: 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 transfer�ncia � como se segue: BIT 0 2 4 6 7 8 9 10 11 FLAG CF PF AF ZF SF TF IF DF OF

Os locais dos bits s�o os mesmos para o uso da instru��o PUSHF. Uma vez feita a transfer�ncia o registrador SP � incrementado de 2, conforme vimos anteriormente.

INSTRU��O PUSH Prop�sito: Coloca uma palavra na pilha. Sintaxe: PUSH fonte A instru��o PUSH decrementa de dois o valor de SP e ent�o transfere o conte�do do operador fonte para o novo endere�o desultante no registrador rec�m modificado. O decremento no endere�o � duplo pelo fato de adicionados � pilha, que cresce do maior para subra�mos de 2 o registrador SP o que fazemos pilha em dois bytes, que � a �nica quantidade manusear em cada entrada e sa�da. que quando os valores s�o o menor endere�o, logo quando � incrementar o tamanho da de informa��o que a pilha pode

INSTRU��O PUSHF Prop�sito: Colocar os valores dos flags na pilha. Sintaxe: PUSHF Este comando decrementa de 2 o valor do registrador SP e ent�o o conte�do do registrador de flag � transferido para a pilha, no endere�o indicado por SP. Os flags s�o armazenados na mem�ria da mesma forma que o comando POPF. --------------- // ---------------

4.2. Instru��es l�gicas e aritm�ticas Conte�do: 4.2.1.Instru��es l�gicas 4.2.2.Instru��es aritm�ticas 4.2.1.Instru��es l�gicas S�o usadas para realizar opera��es l�gicas nos operadores. AND NEG NOT OR TEST XOR INSTRU��O AND Prop�sito: Realiza a conjun��o de operadores bit a bit. Sintaxe: AND destino,fonte Com esta instru��o a opera��o l�gica "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 opera��o � armazenado no operador de destino. INSTRU��O NEG Prop�sito: Gera o complemento de 2. Sintaxe: NEG destino Esta instru��o gera o complemento de 2 do operador destino e o armazena no mesmo operador. Por exemplo, if AX armazena o valor 1234H, ent�o: NEG AX Isto far� com o que o valor EDCCH fque armazenado no registrador AX.

INSTRU��O NOT Prop�sito: Faz a nega��o do operador de destino bit a bit. Sintaxe: NOT destino O resultado � armazenado no mesmo operador de destino.

INSTRU��O OR Prop�sito: Realiza um OU l�gico. Sintaxe: OR destino,fonte A instru��o OR, faz uma disjun��o l�gica bit a bit dos dois operadores: Fonte Destino | Destino ----------------------------------1 1 | 1 1 0 | 1 0 1 | 1 0 0 | 0

INSTRU��O TEST Prop�sito: Compara logicamente os operadores. Sintaxe: TEST destino,fonte Realiza uma conjun��o, bit a bit, dos operadores, mas difere da instru��o AND, uma vez que n�o coloca o resultado no operador de destino. Tem efeito sobre o registrador de flag.

INSTRU��O XOR Prop�sito: Realiza um OU exclusivo. Sintaxe: XOR destino,fonte Esta instru��o realizxa uma disjun��o 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.Instru��es aritm�ticas. S�o usadas para realizar opera��es aritm�ticas nos operadores. ADC ADD DIV IDIV MUL IMUL SBB SUB

INSTRU��O ADC Prop�sito: Efetuar a soma entre dois operandos com carry. Sintaxe: ADC destino,fonte Esta instru��o efetua a soma entre dois operandos, mais o valor do flag CF, existente antes da opera��o. Apenas o operando destino e os flags s�o afetados. O resultado � armazenado no operador de destino.

INSTRU��O ADD Prop�sito: Adi��o de dois operadores. Sintaxe: ADD destino,fonte Esta instru��o adiciona dois operadores e armazena o resultado no operador destino.

INSTRU��O DIV Prop�sito: Divis�o sem sinal. Sintaxe:

DIV fonte O divisor pode ser um byte ou uma palavra e � o operador que � dado na instru��o. 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, ent�o o quociente ser� armazenado no registrador AL e o resto em AH. Se for uma palavra, ent�o o quociente � armazenado em AX e o resto em DX.

INSTRU��O IDIV Prop�sito: Divis�o com sinal. Sintaxe: IDIV fonte Consiste basicamente como a instru��o DIV, diferencia-se apenas por realizar a opera��o com sinal. Para os resultados s�o usados os mesmos registradores da instru��o DIV.

INSTRU��O MUL Prop�sito: Multiplica��o com sinal. Sintaxe: MUL fonte Esta instru��o realiza uma multiplica��o n�o sinalizada entre o conte�do do acumulador AL ou AX pelo operando-fonte, devolvendo o resultado no acumulador AX caso a opera��o tenha envolvido AL com um operando de 8 bits, ou em DX e AX caso a opera��o tenha envolvido AX e um operando de 16 bits.

INSTRU��O IMUL Prop�sito: Multiplic��o de dois n�meros inteiros com sinal. Sintaxe: IMUL fonte Esta instru��o faz o mesmo que a anterior, difere apenas pela inclus�o do sinal. Os resultados s�o mantidos nos mesmos registradores usados pela instru��o MUL.

INSTRU��O SBB Prop�sito: Subtra��o com carry. Sintaxe: SBB destino,fonte Esta instru��o subtrai os operadores e subtrai um do resultado se CF est� ativado. O operador fonte � sempre subtra�do do destino. Este tipo de subtra��o � usado quando se trabalha com quantidades de 32 bits.

INSTRU��O SUB Prop�sito: Subtra��o. Sintaxe: SUB destino,fonte Esta instru��o subtrai o operador fonte do destino.

--------------- // --------------4.3.Instru��es de controle de processos Conte�do: 4.3.1.Instru��es 4.3.2.Instru��es 4.3.3.Instru��es 4.3.4.Instru��es 4.3.5.Instru��es de de de de de salto la�os: loop contagem compara��o flag

4.3.1.Instru��es de salto. Usadas para transferir o processo de execu��o 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

INSTRU��O JMP Prop�sito: Salto incondicional. Sintaxe: JMP destino Esta instru��o � usada par adesviar o curso do programa sem tomar em conta as condi��es atuais dos flags ou dos dados.

INSTRU��O JA (JNBE) Prop�sito: Salto condicional. Sintaxe: JA s�mbolo Ap�s uma compara��o este comando salta se n�o � igual. Isto quer dizer que o salto s� � feito se o flag CF ou o flag ZF est�o desativados, ou seja, se um dos dois for zero.

INSTRU��O JAE (JNB) Prop�sito: Salto condicional. Sintaxe: JAE s�mbolo A instru��o salta se est� up, se est� equal ou se est� not down. O salto � feito se CF est� desativado.

INSTRU��O JB (JNAE) Prop�sito: Salto condicional.

Sintaxe: JB s�mbolo A instru��o salta se est� down, se est� not up ou se est� equal. O salto � feito se CF est� ativado.

INSTRU��O JBE (JNA) Prop�sito: Salto condicional. Sintaxe: JBE s�mbolo A instru��o salta se est� down, se est� equal ou se est� not up. O salto � feito se CF ou ZF est�o ativados, ou seja, se um deles for 1.

INSTRU��O JE (JZ) Prop�sito: Salto condicional. Sintaxe: JE s�mbolo A instru��o salta se est� equal ou se est� zero. O salto � feito se ZF est� ativado.

INSTRU��O JNE (JNZ) Prop�sito: Salto condicional. Sintaxe: JNE s�mbolo A instru��o salta se est� not equal ou se est� zero. O salto � feito se ZF est� desativado.

INSTRU��O JG (JNLE) Prop�sito: Salto condicional, e o sinal � tomado. Sintaxe:

JG s�mbolo A instru��o salta se est� larger, se est� not larger ou se est� equal. O salto ocorre se ZF = 0 ou se OF = SF.

INSTRU��O JGE (JNL) Prop�sito: Salto condicional, e o sinal � tomado. Sintaxe: JGE s�mbolo A instru��o salta se est� larger, se est� less than ou se est� equal. O salto � feito se SF = OF.

INSTRU��O JL (JNGE) Prop�sito: Salto condicional, e o sinal � tomado. Sintaxe: JL s�mbolo A instru��o salta se est� less than, se est� not larger than ou se est� equal. O salto � feito se SF � diferente de OF.

INSTRU��O JLE (JNG) Prop�sito: Salto condicional, e o sinal � tomado. Sintaxe: JLE s�mbolo A instru��o 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.

INSTRU��O JC Prop�sito: Salto condicional, e os flags s�o tomados. Sintaxe:

JC s�mbolo A instru��o salta se h� carry. O salto � feito se CF = 1.

INSTRU��O JNC Prop�sito: Salto condicional, e o estado dos flags � tomado. Sintaxe: JNC s�mbolo A instru��o salta se n�o h� carry. O salto � feito se CF = 0.

INSTRU��O JNO Prop�sito: Salto condicional, e o estado dos flags � tomado. Sintaxe: JNO s�mbolo A instru��o salta se n�o h� overflow O salto � feito se OF = 0.

INSTRU��O JNP (JPO) Prop�sito: Salto condicional, e o estado dos flags � tomado. Sintaxe: JNP s�mbolo A instru��o salta se n�o h� paridade ou se a paridade � �mpar. O salto � feito se PF = 0.

INSTRU��O JNS Prop�sito: Salto condicional, e o estado dos flags � tomado. Sintaxe: JNP s�mbolo

A instru��o salta se o sinal est� desativado. O salto � feito se SF = 0.

INSTRU��O JO Prop�sito: Salto condicional, e o estado dos flags � tomado. Sintaxe: JO s�mbolo A instru��o salta se h� overflow. O salto � feito se OF = 1.

INSTRU��O JP (JPE) Prop�sito: Salto condicional, e o estado dos flags � tomado. Sintaxe: JP s�mbolo A instru��o salta se h� paridade ou se a paridade � par. O salto � feito se PF = 1.

INSTRU��O JS Prop�sito: Salto condicional, e o estado dos flags � tomado. Sintaxe: JS s�mbolo A instru��o salta se o sinal est� ativado. O salto � feito se SF =1. --------------- // --------------4.3.2.Instru��es para la�os: LOOP. Estas instru��es transferem a execu��o do processo, condicional ou incondicionalmente, para um destino, repetindo a a��o at� o contador ser zero. LOOP LOOPE

LOOPNE

INSTRU��O LOOP Prop�sito: Gerar um la�o no programa. Sintaxe: LOOP s�mbolo A instru��o LOOP decrementa CX de 1 e transfere a execu��o do programa para o s�mbolo que � dado como operador, caso CX ainda n�o seja 1.

INSTRU��O LOOPE Prop�sito: Gerar um la�o no programa, considerando o estado de ZF. Sintaxe: LOOPE s�mbolo Esta instru��o decrementa CX de 1. Se CX � diferente de zero e ZF � igual a 1, ent�o a execu��o do programa � transferida para o s�mbolo indicado como operador.

INSTRU��O LOOPNE Prop�sito: Gerar um la�o no programa, considerando o estado de ZF. Sintaxe: LOOPNE s�mbolo Esta instru��o decrementa CX de 1 e transfere a execu��o do programa apenas se ZF � diferente de 0.

--------------- // --------------4.3.3.Instru��es contadoras. Estas instru��es s�o usadas para decrementar ou incrementar o conte�do de contadores. DEC INC

DEC INSTRUCTION

Prop�sito: Decrementar o operador. Sintaxe: DEC destino Esta instru��o subtrai 1 do operador destino e armazena o novo valor no mesmo operador.

INSTRU��O INC Prop�sito: Incrementar o operador. Sintaxe: INC destino Esta instru��o adiciona 1 ao operador destino e mant�m o resultado no mesmo operador. --------------- // --------------4.3.4.Instru��es de compara��o. Estas instru��es s�o usadas para comparar os operadores, e elas afetam o conte�do dos flags. CMP CMPS (CMPSB) (CMPSW)

INSTRU��O CMP Prop�sito: Comparar os operadores. Sintaxe: CMP destino,fonte Esta instru��o subtrai o operador fonte do destino, mas n�o armazena o resultado da opera��o, apenas afeta o estado dos flags.

INSTRU��O CMPS (CMPSB) (CMPSW) Prop�sito: Comparar cadeias de um byte ou uma palavra. Sintaxe: CMP destino,fonte Esta instru��o compara efetuando uma subtra��o entre o byte ou palavra endere�ado por DI, dentro do segmento extra de dados, e o byte ou palavra

endere�ado por SI dentro do segmento de dados, afetando o registrador de flags, mas sem devolver o resultado da subtra��o. A instru��o automaticamente incrementa ou decrementa os registradores de �ndice SI e DI, dependendo do valor do flag DF, de modo a indicar os pr�ximos dois elementos a serem comparados. O valor de incremento ou decremento � uma de uma ou duas unidades, dependendo da natureza da opera��o. Diante desta instru��o, pode-se usar um prefixo para repeti��o, de modo a comparar dois blocos de mem�ria entre si, repetindo a instru��o de compara��o at� que ambos se tornem iguais ou desiguais.

--------------- // --------------4.3.5.Instru��es de flag. Estas instru��es afetam diretamente o conte�do dos flags. CLC CLD CLI CMC STC STD STI

INSTRU��O CLC Prop�sito: Limpar o flag de carry. Sintaxe: CLC Esta instru��o desliga o bit correspondente ao flag de carry. Em outras palavras, ela o ajusta para zero.

INSTRU��O CLD Prop�sito: Limpar o flag de endere�o. Sintaxe: CLD Esta instru��o desliga o bit correspondente ao flag de endere�o.

INSTRU��O CLI

Prop�sito: Limpar o flag de interrup��o. Sintaxe: CLI Esta instru��o desliga o flag de interrup��es, desabilitando, deste modo, interrup��es mascar�veis. Uma interrup��o mascar�vel � aquela cujas fun��es s�o desativadas quando IF=0.

INSTRU��O CMC Prop�sito: Complementar o flag de carry. Sintaxe: CMC Esta instru��o complementa o estado do flag CF. Se CF = 0 a instru��o o iguala a 1. Se CF = 1, a instru��o o iguala a 0. Poder�amos dizer que ela apenas inverte o valor do flag.

INSTRU��O STC Prop�sito: Ativar o flag de carry. Sintaxe: STC Esta instru��o ajusta para 1 o flag CF.

INSTRU��O STD Prop�sito: Ativar o flag de endere�o. Sintaxe: STD Esta instru��o ajusta para 1 o flag DF.

INSTRU��O STI Prop�sito: Ativar o flag de insterrup��o. Sintaxe:

STI Esta instru��o ativa o flag IF, e habilita interrup��es externas mascar�veis (que s� funcionam quando IF = 1).

***************************************************************************** CAP�TULO 5: INTERRUP��ES E GER�NCIA DE ARQUIVOS Conte�do: 5.1.Interrup��es 5.2.Gerenciamento de arquivos --------------- // --------------Conte�do 5.1.1.Interrup��es 5.1.2.Interrup��es 5.1.3.Interrup��es 5.1.4.Interrup��es de hardware interno de hardware externo de software mais comuns

5.1.1.Interrup��es de hardware interno Interrup��es internas s�o geradas por certos eventos que ocorrem durante a execu��o de um programa. Este tipo de interrup��es s�o gerenciadas, na sua totalidade, pelo hardware e n�o � poss�vel modific�-las. Um exemplo claro deste tipo de interrup��es � a que atualiza o contador do clock interno do computador, o hardware chama esta interrup��o muitas vezes durante um segundo. N�o nos � permitido gerenciar diretamente esta interrup��o, uma vez que n�o se pode controlar a hora atualizada por software. Mas podemos usar seus efeitos no computador para o nosso benef�cio, por exemplo para criar um virtual clock atualizado continuamente pelo contador interno de clock. Para tanto, precisamos apenas ler o valor atual do contador e o transformar num formato compreens�vel pelo usu�rio.

--------------- // --------------5.1.2.Interrup��es de hardware externo Interrup��es externas s�o geradas atrav�s de dispositivos perif�ricos, tais como teclados, impressoras, placas de comunica��o, entre outros. S�o tamb�m geradas por co-processadores. N�o � poss�vel desativar interrup��es externas.

Estas interrup��es n�o s�o enviadas diretamente para a CPU, mas, de uma forma melhor, s�o enviadas para um circuito integrado cuja fun��o exclusiva � manusear este tipo de interrup��o. O circuito, chamado PIC8259A, � controlado pela CPU atrav�s de uma s�rie de comunica��o chamada paths. --------------- // --------------5.1.3.Interrup��es de software Interrup��es de software podem ser ativadas diretamente por nossos programas assembly, invocando o n�mero da interrup��o desejada com a instru��o INT. O uso das interrup��es facilita muito a cria��o dos programas, torna-os menores. Al�m disso, � f�cil compreend�-las e geram boa performance. Este tipo de interrup��es podem ser separadas em duas categorias: Interrup��es do Sistema Operacional DOS e interrup��es do BIOS. A diferen�a entre ambas � que as interrup��es do sistema operacional s�o mais f�ceis de usar, mas tamb�m s�o mais lentas, uma vez que acessam os servi�os do BIOS. Por outro lado, interrup��es do BIOS s�o muito mais r�pidas, mas possuem a desvantagem de serem parte do hardware, o que significa serem espec�ficas � arquitetura do computador em quest�o. A escolha sobre qual o tipo de interrup��o usar ir� depender somente das caracter�sticas que voc� deseja dar ao seu programa: velocidade (use BIOS), portabilidade (use DOS). --------------- // --------------5.1.4.Interrup��es mais comuns Conte�do 5.1.4.1.Int 21H (Interrup��o do DOS) M�ltiplas chamadas � fun��es DOS. 5.1.4.2.Int 10H (Interrup��o do BIOS) Entrada e Sa�da de V�deo. 5.1.4.3.Int 16H (Interrup��o do BIOS) Entrada e Sa�da do Teclado. 5.1.4.4.Int 17H (Interrup��o do BIOS) Entrada e Sa�da da Impressora. --------------- // --------------5.1.4.1.Interrup��o 21H Prop�sito: Chamar uma diversidade de fun��es DOS.

Sintaxe: Int 21H Nota: Quando trabalhamos com o programa TASM � necess�rio especificar que o valor que estamos usando est� em hexadecimal. Esta interrup��o tem muitas fun��es, para acessar cada uma delas � necess�rio que o n�mero correspondente da fun��o esteja no registrador AH no momento da chamada da interrup��o. Fun��es para mostrar informa��es no v�deo. 02H Exibe um caracter 09H Exibe uma cadeia de caracteres 40H Escreve num dispositivo/arquivo Fun��es para ler informa��es do teclado. 01H Entrada do teclado 0AH Entrada do teclado usando buffer 3FH Leitura de um dispositivo/arquivo Fun��es para trabalhar com arquivos. Nesta se��o s�o apenas especificadas as tarefas de cada fun��o, para uma refer�ncia acerca dos conceitos usados, veja Introdu��o ao gerenciamento de arquivos. M�todo FCB 0FH 14H 15H 16H 21H 22H Handles 3CH 3DH 3EH 3FH 40H 42H Cria��o de arquivo Abertura de arquivo Fechamento de arquivo Leitura de arquivo/dispositivo Escrita de arquivo/dispositivo Move ponteiro de leitura/escrita num arquivo Abertura de arquivo Leitura seq�encial Escrita seq�encial Cria��o de arquivo Leitura rand�mica Escrita rand�mica

FUN��O 02H Uso: Mostra um caracter na tela. Registradores de chamada: AH = 02H

DL = Valor de caracter a ser mostrado. Registradores de retorno: Nenhum. Esta fun��o mostra o caracter cujo c�digo hexadecimal corresponde ao valor armazenado no registrador DL, e n�o modifica nenhum registrador. O uso da fun��o 40H � recomendado ao inv�s desta fun��o.

FUN��O 09H Uso: Mostra uma cadeia de caracteres na tela. Registradores de chamada: AH = 09H DS:DX = Endere�o de in�cio da cadeia de caracteres. Registradores de retorno: Nenhum. Esta fun��o mostra os caracteres, um por um, a partir do endere�o indicado nos registradores DS:DX at� encontrar um caracter $, que � interpretado como fim da cadeia. � recomendado usar a fun��o 40H ao inv�s desta.

FUN��O 40H Uso: Escrever num dispositivo ou num arquivo. Registradores de chamada: AH = 40H BX = N�mero do handle CX = Quantidade de bytes a gravar DS:DX = �rea onde est� o dado Registradores de retorno: CF = 0 se n�o houve erro AX = N�mero de bytes escrito CF = 1 se houve erro AX = C�digo de erro

Para usar esta fun��o para mostrar a informa��o na tela, fa�a o registrador BX ser igual a 1, que � o valor default para o v�deo no DOS.

FUN��O 01H Uso: Ler um caracter do teclado e mostr�-lo. Registradores de chamada AH = 01H Registradores de retorno: AL = Caracter lido � muito f�cil ler um caracter do teclado com esta fun��o, o c�digo hexadecimal do caracter lido � armazenado no registrador AL. Nos caso de teclas especiais, como as de fun��o F1, F2, al�m de outras, o registrador AL conter� o valor 1, sendo necess�rio chamar a fun��o novamente para obter o c�digo daquele caracter.

FUN��O 0AH Uso: Ler caracteres do teclado e armazen�-los num buffer. Registradores de chamada: AH = 0AH DS:DX = Endere�o inicial da �rea de armazenamento BYTE 0 = Quantidade de bytes na �rea BYTE 1 = Quantidade de bytes lidos do BYTE 2 at� BYTE 0 + 2 = caracteres lidos Registradores de retorno: Nenhum. Os caracteres s�o lidos e armazenados num espa�o de mem�ria que foi definido. A estrutura deste espa�o indica que o primeiro byte representar� a quantidade m�xima de caracteres que pode ser lida. O segundo, a quantidade de caracteres lidos e, no terceiro byte, o inicio onde eles s�o armazenados. Quando se atinge a quantidade m�xima permitida, ouve-se o som do speaker e qualquer caracter adicional � ignorado. Para finalizar a entrada, basta digitar [ENTER].

FUN��O 3FH

Uso: Ler informa��o de um dispositivo ou de um arquivo. Registradores de chamada: AH = 3FH BX = N�mero do handle CX = N�mero de bytes a ler DS:DX = �rea para receber o dado Registradores de retorno: CF = 0 se n�o h� erro e AX = n�mero de bytes lidos. CF = 1 se h� erro e AX conter� o c�digo de erro.

FUN��O 0FH Uso: Abrir um arquivo FCB. Registradores de chamada: AH = 0FH DS:DX = Ponteiro para um FCB Registradores de retorno: AL = 00H se n�o h� problemas, de outra forma retorna 0FFH

FUN��O 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 n�o h� erros, de outra forma o c�digo correspondente de erro retornar�: 1 erro no fim do arquivo, 2 erro na estrutura FCB e 3 erro de leitura parcial. O que esta fun��o faz � ler o pr�ximo bloco de informa��es do endere�o dado por DS:DX, e atualizar este registro.

FUN��O 15H

Uso: Escrita sequencial e arquivo FCB. Registradores de chamada: AH = 15H DS:DX = Ponteiro para um FCB ja aberto. Registradores de retorno: AL = 00H se n�o h� erros, de outra forma conter� o c�digo de erro: 1 disco cheio ou arquivo somente de leitura, 2 erro na forma��o ou na especifica��o do FCB. A fun��o 15H atualiza o FCB ap�s a escrita do registro para o presente bloco.

FUN��O 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 n�o h� erros, de outra forma conter� o valor 0FFH. � baseada na informa��o advinda de um FCB para criar um arquivo num disco.

FUN��O 21H Uso: Ler de modo rand�mico um arquivo FCB. Registradores de chamada: AH = 21H DS:DX = Ponteiro para FCB aberto. Registradores de retorno: A = 00H se n�o h� erro, de outra forma AH conter� o c�digo de erro: 1 se � o fim do arquivo, 2 se h� um erro de especifica��o no FCB e 3 se um registro foi lido parcialmente ou o ponteiro de arquivo est� no fim do mesmo. Esta fun��o l� o registro especificado pelos campos do bloco atual e registro de um FCB aberto e coloca a informa��o na DTA, �rea de

Transfer�ncia do Disco.

FUN��O 22H Uso: Escrita rand�mica num arquivo FCB. Registradores de chamada: AH = 22H DS:DX = Ponteiro para um FCB aberto. Registradores de retorno: AL = 00H se n�o h� erro, de outra forma conter� o c�digo de erro: 1 se o disco est� cheio ou o arquivo � apenas de leitura e 2 se h� um erro na especifica��o FCB. Escreve o registro especificado pelos campos do bloco atual e registro de um FCB aberto. Esta informa��o � do conte�do da DTA.

FUN��O 3CH Uso: Criar um arquivo se n�o 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 n�mero do handle se n�o h� erro. Se caso houver erro, CF ser� 1 e AX conter� o c�digo de erro: 3 caminho n�o encontrado, 4 n�o h� handles dispon�veis e 5 acesso negado. Esta fun��o substitui a fun��o 16H. O nome do arquivo � especificado numa cadeia ASCII de bytes terminados pelo caracter 0. O arquivo criado conter� os atributos definidos no registrador CX, do seguinte modo: Valor 00H 02H 04H 06H Atributos Normal Hidden System Hidden e System

O arquivo � criado com permiss�o de leitura e escrita. N�o � poss�vel a

cria��o de diret�rios atrav�s desta fun��o.

FUN��O 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 = n�mero do handle se n�o h� erros, de outra forma CF = 1 e AX = c�digo de erro: 01H se a fun��o n�o � v�lida, 02H se o arquivo n�o foi encontrado, 03H se o caminho n�o foi encontrado, 04H se n�o h� handles dispon�veis, 05H acesso negado, e 0CH se o c�digo de acesso n�o � v�lido. O handle retornado � de 16 bits. O c�digo de acesso � especificado da seguinte maneira: BITS 7 6 5 . . . . . . . . . . . . 4 . . . x 3 0 0 0 . 2 0 0 1 . 1 0 1 0 . Apenas leitura Apenas escrita Leitura/Escrita RESERVADO

FUN��O 3EH Uso: Fecha um arquivo (handle). Registradores de chamada: AH = 3EH BX = N�mero do handle associado Registradores de retorno: CF = 0 se n�o h� erros, ou CF ser� 1 e AX conter� o c�digo de erro: 06H se o handle � inv�lido. Esta fun��o atualiza o arquivo e libera o handle que estava usando.

FUN��O 3FH Uso: Ler uma quantidade espec�fica de bytes de um arquivo aberto e armazen�-los num buffer espec�fico. --------------- // --------------5.1.4.2.Interrup��o 10h Prop�sito: Chamar uma diversidade de fun��es do BIOS Sintaxe: Int 10H Esta interrup��o tem v�rias fun��es, todas para entrada e sa�da de v�deo. Para acessar cada uma delas � necess�rio colocar o n�mero da fun��o correspondente no registrador AH. Veremos apenas as fun��es mais comuns da interrup��o 10H. Fun��o Fun��o Fun��o Fun��o 02H, 09H, 0AH, 0EH, seleciona a posi��o do cursor exibe um caracter e o atributo na posi��o do cursor exibe um caracter na posi��o do cursor modo alfanum�rico de exibi��o de caracteres

Fun��o 02h Uso: Move o cursor na tela do computador usando o modo texto. Registradores de chamada: AH = 02H BH = P�gina de v�deo onde o cursor est� posicionado. DH = linha DL = coluna Registradores de retorno: Nenhum. A posi��o do cursor � definida pelas suas coordenadas, iniciando-se na posi��o 0,0 at� a posi��o 79,24. Logo os valores poss�veis para os registradores DH e DL s�o: de 0 a 24 para linhas e de 0 a 79 para colunas.

Fun��o 09h

Uso: Mostra um determinado caracter v�rias vezes na tela do computador com um atributo definido, iniciando pela posi��o atual do cursor. Registradores de chamada: AH AL BH BL CX = = = = = 09H Caracter a exibir P�gina de v�deo, onde o caracter ser� mostrado Atributo do caracter N�mero de repeti��es.

Registradores de retorno: Nenhum Esta fun��o mostra um caracter na tela v�rias vezes, de acordo com o n�mero especificado no registrador CX, mas sem mudar a posi��o do cursor na tela.

Fun��o 0Ah Uso: Exibe um caracter na posi��o atual do cursor. Registradores de chamada: AH AL BH BL CX = = = = = 0AH Caracter a exibir P�gina de v�deo onde o caracter ser� exibido Cor do caracter (apenas em modo gr�fico) N�mero de repeti��es

Registradores de retorno: Nenhum. A principal diferen�a entre esta fun��o e a anterior � permitir mudan�a nos atributos, bem como mudar a posi��o do cursor.

Fun��o 0EH Uso: Exibir um caracter na tela do computador atualizando a posi��o do cursor. Registradores de chamada: AH AL BH BL = = = = 0EH Caracter a exibir P�gina de v�deo onde o caracter ser� exibido Cor a usar (apenas em modo gr�fico)

Registradores de retorno: Nenhum --------------- // --------------5.1.4.3.Interrup��o 16H Veremos duas fun��es da interrup��o 16H. A exemplo das demais interrup��es, usa-se o registrador AH para cham�-las.

Fun��es da interrup��o 16h Fun��o 00H, l� um caracter do teclado. Fun��o 01H, l� o estado atual do teclado. Fun��o 00H Uso: Ler um caracter do teclado. Registradores de chamada: AH = 00H Registradores de retorno: AH = C�digo da tecla pressionada AL = Valor ASCII do caracter Quando se usa esta interrup��o, os programas executam at� que uma tecla seja pressionada. Se � um valor ASCII, � armazenado no registrador AH. Caso contr�rio, o c�digo � armazenado no registrador AL e AH=0. Este valor de AL pode ser utilizado quando queremos detectar teclas que n�o est�o diretamente representadas pelo seu valor ASCII, tais como [ALT][CONTROL].

Fun��o 01h Uso: Ler o estado do teclado Registradores de chamada: AH = 01H Registradores de retorno: Se o registrador de flag � zero, significa que h� informa��o no buffer de teclado na mem�ria. Caso contr�rio, o buffer est� vazio. Portanto o valor do

registrador AH ser� o valor da tecla armazenada no buffer. --------------- // --------------5.1.4.4.Interrup��o 17H Prop�sito: Manusear a entrada e sa�da da impressora. Sintaxe: Int 17H Esta interrup��o � usada para enviar caracteres, setar ou ler o estado de uma impressora. Fun��es da interrup��o 17h Fun��o 00H, imprime um valor ASCII Fun��o 01H, seta a impressora Fun��o 02H, l� estado da impressora Fun��o 00H Uso: Imprimir um caracter numa impressora. Registradores de chamada: AH = 00H AL = Caracter a imprimir DX = Porta de conex�o Registradores de retorno: AH = Estado da impressora Os valores da porta a colocar no registrador DX s�o: 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 sa�da 4 1 Impressora selecionada 5 1 Fim de papel 6 1 Reconhecimento de comunica��o 7 1 A impressora est� pronta para o uso Os bits 1 e 2 bits n�o s�o relevantes A maioria dos BIOS suportam 3 portas paralelas, havendo alguns que suportam

4. Fun��o 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 sa�da 4 1 Impressora selecionada 5 1 Fim de papel 6 1 Reconhecimento de comunica��o 7 1 A impressora est� pronta para o uso Os bits 1 e 2 bits n�o s�o relevantes Fun��o 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 4 5 6 7

1 1 1 1 1

Erro de entrada e sa�da Impressora selecionada Fim de papel Reconhecimento de comunica��o A impressora est� pronta para o uso

Os bits 1 e 2 bits n�o s�o relevantes

--------------- // --------------5.2. Gerenciamento de Arquivos Conte�do: 5.2.1.Modos de trabalhar com arquivos 5.2.2.M�todo FCB 5.2.3.M�todos de canais de comunica��o 5.2.1.Modos de trabalhar com arquivos. H� dois modos de trabalhar com arquivos. O primeiro � atrav�s de FCB ( blocos de controle de arquivo), o segundo � atrav�s de canais de comunica��o, tamb�m 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 vers�o 1.0 do DOS, al�m deste m�todo permitir-nos ter um n�mero ilimitado de arquivos abertos ao mesmo tempo. Se voc� quiser criar um volume para o disco, a �nica forma � atrav�s deste m�todo. Depois de considerarmos as vantagens de FCB, o uso do m�todo de Canais de Comunica��o � 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 Comunica��o como handles. --------------- // --------------5.2.2.M�todo FCB. 5.2.2.1.Introdu��o 5.2.2.2.Abertura de arquivo 5.2.2.3.Criar um novo arquivo 5.2.2.4.Escrita seq�encial 5.2.2.5.Leitura seq�encial 5.2.2.6.Leitura e escrita rand�mica 5.2.2.7.Fechar um arquivo --------------- // ---------------

5.2.2.1.INTRODU��O 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 refer�ncia ao tipo normal (37 bytes). O FCB � composto de informa��es dadas pelo programador e por informa��es que ele toma diretamente do sistema operacional. Quando estes tipos de arquivos s�o usados, s� � poss�vel se trabalhar no diret�rio corrente, pois FCBs n�o fornecem suporte ao sistema de organiza��o de arquivos atrav�s de diret�rios do DOS. FCB � composto pelos seguintes campos: POSI��O 00H 01H 09H 0CH 0EH 10H 14H 16H 18H 20H 21H COMPRIMENTO 1 Byte 8 Bytes 3 Bytes 2 Bytes 2 Bytes 4 Bytes 2 Bytes 2 Bytes 8 Bytes 1 Bytes 4 Bytes SIGNIFICADO Drive Nome do arquivo Extens�o N�mero do bloco Tamanho do registro Tamanho do arquivo Data de cria��o Hora de cria��o Reservado Registro corrente Registro rand�mico

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 op��o. O nome do arquivo deve ser justificado � esquerda e � necess�rio preencher com espa�os os bytes remanescentes, a extens�o � colocada do mesmo modo. O bloco corrente e o registro corrente dizem ao computador que registro ser� acessado nas opera��es 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 numera��o � 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 fun��o 0FH da interrup��o 21h. A unidade, o nome e a extens�o 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 interrup��o, ent�o o arquivo n�o foi encontrado. Se tudo der certo, o valor 0 � retornado. Se o arquivo � aberto, ent�o o DOS inicializa o bloco corrente em 0, o tamanho do registro para 128 bytes. O tamanho do arquivo e a sua data s�o preenchidos com as informa��es encontradas no diret�rio. --------------- // ---------------

5.2.2.3.CRIAR UM NOVO ARQUIVO Para a cria��o de arquivos � usada a fun��o 16H da interrup��o 21h. O registrador DX deve apontar para uma estrutura de controle cujo os requisitos s�o de que pelo menos a unidade l�gica, o nome e a extens�o 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 SEQ�ENCIAL Antes de conseguirmos realizar escrita para o disco, � necess�rio definir a �rea de transfer�ncia de dados usando, para tanto, a fun��o 1AH da interrup��o 21h. A fun��o 1AH n�o retorna qualquer estado do disco nem da opera��o. Mas a fun��o 15H, que usaremos para escrever para o disco, faz isso no registrador AL. Se este for igual a zero, ent�o n�o h� erro e os campos de registro corrente e de bloco s�o atualizados. --------------- // --------------5.2.2.5.LEITURA SEQ�ENCIAL Antes de tudo, devemos definir a �rea de transfer�ncia de arquivo ou DTA. Para a leitura seq�encial usaremos a fun��o 14H da interrup��o 21h. O registro a ser lido � definido pelos campos registro e bloco corrente. O registrador AL retorna o estado da opera��o. Se AL cont�m 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 n�o ocorra erro, AL conter� o valor 0 e os campos de registro e bloco corrente s�o atualizados. --------------- // --------------5.2.2.6.LEITURA E ESCRITA RAND�MICA A fun��o 21H e a fun��o 22H da insterrup��o 21h s�o usadas � realiza��o, respectivamente, da escrita e leitura rand�mica. O n�mero de registro rand�mico e o bloco corrente s�o usados para calcular a posi��o relativa do registro a ser lido ou escrito. O registrador AL retorna a mesma informa��o do que par a escrita e leitura seq�encial. A informa��o a ser lida ser� retornada na �rea de transfer�ncia do disco, bem como a informa��o a ser escrita retorna na DTA. --------------- // --------------5.2.2.7.FECHAR UM ARQUIVO

Para fechar um arquivo usamos a fun��o 10H da interrup��o 21h. Se ap�s invocar esta fun��o, o regisatrador AL conter o valor FFH, significa que o arquivo foi mudado de posi��o, o disco foi mudado ou h� erro de acesso a disco. --------------- // --------------5.2.3.Canais de comunica��o. 5.2.3.1.Trabalhando com handles 5.2.3.2.Fun��es para usar handles 5.2.3.1.TRABALHANDO COM HANDLES O uso de handles para gerenciar arquivos traz grandes facilidades na cria��o de arquivos e o programador pode concentrar-se em outros aspectos da programa��o 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 necess�rio definirmos o nome do mesmo e o n�mero de handle a usar, todo o resto da informa��o � manuseada internamente pelo DOS. Quando usamos este m�todo para trabalhar com arquivos, n�o h� distin��o entre acesso seq�encial ou rand�mico, o arquivo � simplesmente tomado como uma rede de bytes. --------------- // --------------5.2.3.2.FUN��ES PARA USAR HANDLES As fun��es usadas para o manuseio de arquivos atrav�s de handles s�o descritas na p�gina sobre: Interrup��es, na se��o dedicada � interrup��o 21h. ***************************************************************************** CAP�TULO 6: MACROS E PROCEDIMENTOS Conte�do 6.1.Procedimentos 6.2.Macros 6.1.Procedimentos 6.1.1.Defini��o de procedimento 6.1.2.Sintaxe de um procedimento --------------- // --------------6.1.1.Defini��o de um procedimento Um procedimento � uma cole��o de instru��es para as quais � poss�vel

direcionar o curso de nosso programa, e uma vez que a execu��o destas instru��es do procedimento tenha acabado, o controle retorna para linha que segue � que chamou o procedimento. Procedimentos nos ajudam a criar programas leg�veis e f�ceis de modificar. Quando se invoca um procedimento, o endere�o da pr�xima instru��o 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 instru��o que o chama, e os inter segments, que podem se localizar em diferentes segmentos de mem�ria. Quando os procedimentos intrasegments s�o usados, o valor de IP � armazenado na pilha e quando os procedimentos inter segments s�o usados o valor de CS:IP � armazenado. Lembre-se que o registrador CS indica qual o segmento de c�digo. A diretiva que chama um procedimento � como segue: CALL NomedoProcedimento As partes que comp�em um procedimento s�o as seguintes: Declara��o do procedimento C�digo do procedimento Diretiva de retorno T�rmino do procedimento Por exemplo, se quisermos uma rotina que soma dois bytes armazenados em AH e AL, e o resultado da soma em BX: Soma Proc Near Mov BX, 0 Mov BL, AH Mov AH, 00 Add BX, AX Ret Soma EndP ; Declara��o do Procedimento ; Conte�do do Procedimento...

; Diretiva de retorno ; Fim do Procedimento

Na declara��o, 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 endere�o 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 id�ntico: Call Soma

Macros oferecem uma grande flexibilidade na programa��o, comparadas aos procedimentos. --------------- // --------------6.2.Macros 6.2.1.Defini��o de uma Macro 6.2.2.Sintaxe de uma Macro 6.2.3.Bibliotecas de Macros 6.2.1.Defini��o de uma Macro Uma macro � um grupo de instru��es repetitivas em um programa que s�o codificadas apenas uma vez e, assim, poupam espa�o, podendo ser utilizadas tantas vezes quantas forem necess�rio. A principal diferen�a entre uma macro e um procedimento � que numa macro � poss�vel a passagem de par�metros e num procedimento n�o. No momento em que a macro � executada, cada par�metro � substitu�do pelo nome ou valor especificado na hora da chamada. Podemos dizer, desta forma, que um procedimento � uma extens�o de um determinado programa, enquanto que uma macro � um m�dulo que especifica fun��es que podem ser utilizadas por diferentes programas. Uma outra diferen�a entre uma macro e um procedimento � o modo de chamada de cada um. Para chamar um procedimento, se faz necess�rio a diretiva CALL, por outro lado, para chamada de macros � feita com se fosse uma instru��o normal da linguagem assembly. --------------- // --------------6.2.2.Sintaxe de uma Macro As partes que comp�em uma macro s�o as seguintes: Declara��o da macro C�digo da macro Diretiva de t�rmino da macro A declara��o da macro � feita como se segue: NomeMacro MACRO [par�metro1, par�metro2...] Do mesmo modo que temos a funcionalidade dos par�metros, � poss�vel tamb�m a cria��o de uma macro que n�o os possua. A diretiva de t�rmino da macro �: ENDM Um exemplo de uma macro para colocar o cursor numa determinada posi��o da tela: Pos MACRO PUSH AX PUSH BX PUSH DX Linha, Coluna

MOV MOV MOV MOV INT POP POP POP ENDM

AH, DH, DL, BH, 10H DX BX AX

02H Linha Coluna 0

Para usar uma macro basta cham�-la pelo seu nome, tal como se fosse qualquer instru��o na linguagem assembly: Pos 8, 6 --------------- // --------------6.2.3.Biblioteca de Macros Uma das facilidades oferecidas pelo uso de macros � a cria��o de bibliotecas, que s�o grupo de macros, podendo ser inclu�das num programa origin�rias de arquivos diferentes. A cria��o destas bibliotecas � muito simples. Criamos um arquivo com todas as macros que ser�o necess�rias e o salvamos como um arquivo texto. Para incluir uma biblioteca num programa, basta colocar a seguinte instru��o Include NomedoArquivo na parte inicial do programa, antes da declara��o do modelo de mem�ria. Supondo que o arquivo de macros tenha sido salvo com o nome de MACROS.TXT, a instru��o Include seria utilizada do seguinte modo: ;In�cio do programa Include MACROS.TXT .MODEL SMALL .DATA ;Os dados v�o aqui .CODE Inicio: ;O c�digo do programa come�a aqui .STACK ;A pilha � declarada End Inicio ;Fim do programa ***************************************************************************** CAP�TULO 7: EXEMPLOS DE PROGRAMAS Conte�do: 7.1.Exemplos de Programas com Debug 7.2.Exemplos de Programas com TASM --------------- // ---------------

7.1.Exemplos de Programas com Debug Nesta se��o 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 0D80:0103 BB0400 0D80:0106 01D8 0D80:0108 CD20 Nota: -n one.com Dar nome ao programa a ser carregado -l Carreg�-lo -u 100 109 Desmontar o c�digo do endere�o inicial ao final especificado Segundo passo Digite o comando g Por exemplo: -g Program terminated normally -

MOV MOV ADD INT

AX,0006 BX,0004 AX,BX 20

Exemplos de programas no Debug Primeiro exemplo -a0100 297D:0100 297D:0103 MOV MOV AX,0006 BX,0004 ;P�e o valor 0006 no registrador AX ;P�e o valor 0004 no registrador BX

297D:0106 297D:0108

ADD INT

AX,BX 20

;Adiciona BX ao conte�do de AX ;Finaliza o Programa

A �nica coisa que este programa faz � salvar dois valores em dois registradores e adicionar o valor de um ao outro. Segundo exemplo - a100 0C1B:0100 jmp 125 ;Salta para o endere�o 125h 0C1B:0102 [Enter] - e 102 'Hello, How are you ?' 0d 0a '$' - a125 0C1B:0125 MOV DX,0102 ;Copia a string para registrador DX 0C1B:0128 MOV CX,000F ;Quantas vezes a string ser� mostrada 0C1B:012B MOV AH,09 ;Copia o valor 09 para registrador AH 0C1B:012D INT 21 ;Mostra a string 0C1B:012F DEC CX ;Subtrai 1 de CX 0C1B:0130 JCXZ 0134 ;Se CX � igual a 0 salta para o endere�o 0134 0C1B:0132 JMP 012D ;Salta ao endere�o 012D 0C1B:0134 INT 20 ;Finaliza o programa Este programa mostra 15 vezes na tela a string de caracteres. Terceiro exemplo -a100 297D:0100 297D:0102 297D:0105 297D:0107 MOV MOV INT INT AH,01 CX,0007 10 20 ;Fun��o para mudar o cursor ;Formata o cursor ;Chama interrup��o do BIOS ;Finaliza o programa

Este programa muda o formato do cursor. Quarto exemplo -a100 297D:0100 297D:0102 297D:0104 297D:0106 297D:0108 297D:010A 297D:010C 297D:010E MOV INT CMP JNZ MOV MOV INT INT AH,01 21 AL,0D 0100 AH,02 DL,AL 21 20 ;Fun��o 1 (l� caractere do teclado) ;Chama interrup��o do DOS ;Compara se o caractere lido � um ENTER ;Se n�o �, l� um outro caractere ;Fun��o 2 (escreve um caractere na tela) ;Character to write on AL ;Chama interrup��o do DOS ;Finaliza o programa

Este programa usa a interrup��o 21h do DOS. Usa duas fun��es da mesma: a primeira l� um caractere do teclado (fun��o 1) e a segundo escreve um caractere na tela. O programa l� caracteres do teclado at� encontrar um ENTER. Quinto exemplo -a100 297D:0100 297D:0102 297D:0105 297D:0107 MOV MOV MOV RCL AH,02 CX,0008 DL,00 BL,1 ;Fun��o 2 (escreve um caractere na tela) ;P�e o valor 0008 no registrador CX ;P�e o valor 00 no registrador DL ;Rotaciona o byte em BL um bit para a esquerda

297D:0109 297D:010C 297D:010E 297D:0110

ADC INT LOOP INT

DL,30 21 0105 20

;Converte o registrador de flag para 1 ;Chama interrup��o do DOS ;Salta se CX > 0 para o endere�o 0105 ;Finaliza o programa

Este programa mostra na tela um n�mero bin�rio atrav�s de um ciclo condicional (LOOP) usando a rota��o do byte. Sexto exemplo -a100 297D:0100 297D:0102 297D:0104 297D:0107 afet�-lo carry 297D:010A 297D:010C 297D:010F 297D:0111 MOV MOV ADD CMP AH,02 DL,BL DL,30 DL,3A ;Fun��o 2 (escreve um caractere na tela) ;P�e o valor de BL em DL ;Adiciona o valor 30 a DL ;Compara o valor 3A com o conte�do de DL sem ;seu valor apenas modifica o estado do flag de JL ADD INT INT 010F DL,07 21 20 ;salta ao endere�o 010f, se for menor ;Adiciona o valor 07 a DL ;Chama interrup��o do DOS ;Finaliza o programa

Este programa imprime um valor zero em d�gitos hexadecimais. S�timo exemplo -a100 297D:0100 297D:0102 297D:0104 297D:0107 297D:010A 297D:010D 297D:010F 297D:0112 297D:0114 MOV MOV AND ADD CMP JL ADD INT INT AH,02 DL,BL DL,0F DL,30 DL,3A 0112 DL,07 21 20 ;Fun��o 2 (escreve um caractere na tela) ;P�e o valor de BL em DL ;Transporta fazendo AND dos n�meros bit a bit ;Adiciona 30 a Dl ;Compara Dl com 3A ;Salta ao endere�o 0112, se menor ;Adiciona 07 a DL ;Chama interrup��o do DOS ;Finaliza o programa

Este programa � usado para imprimir dois d�gitos hexadecimais. Oitavo exemplo -a100 297D:0100 MOV 297D:0102 MOV 297D:0104 MOV 297D:0106 SHR mais � direita 297D:0108 ADD 297D:010B CMP 297D:010E JL 297D:0110 ADD 297D:0113 INT 297D:0115 INT AH,02 DL,BL CL,04 DL,CL DL,30 DL,3A 0113 DL,07 21 20 ;Fun��o 2 (escreve ;P�e o valor de BL ;P�e o valor 04 em ;Desloca os 4 bits um caractere na tela) em DL CL mais altos do n�mero ao nibble

;Adiciona 30 a DL ;Compara Dl com 3A ;Salta ao endere�o 0113, se menor ;Adiciona 07 a DL ;Chama interrup��o do DOS ;Finaliza o programa

Este programa imprime o primeiro de dois d�gitos hexadecimais. Nono exemplo

-a100 297D:0100 MOV 297D:0102 MOV 297D:0104 MOV 297D:0106 SHR mais � direita 297D:0108 ADD 297D:010B CMP 297D:010E JL 297D:0110 ADD 297D:0113 INT 297D:0115 MOV 297D:0117 AND 297D:011A ADD 297D:011D 297D:0120 297D:0122 297D:0125 297D:0127 CMP JL ADD INT INT

AH,02 DL,BL CL,04 DL,CL DL,30 DL,3A 0113 DL,07 21 DL,BL DL,0F DL,30 DL,3A 0125 DL,07 21 20

;Fun��o 2 (escreve ;P�e o valor de BL ;P�e o valor 04 em ;Desloca os 4 bits

um caractere na tela) em DL CL mais altos do n�mero ao nibble

;Adiciona 30 a DL ;Compara Dl com 3A ;Salta ao endere�o 0113, se menor ;Adiciona 07 a DL ;Chama interrup��o do DOS ;P�e o valor de BL em DL ;Transporta fazendo AND dos n�meros bit a bit ;Adiciona 30 a DL ;Compara Dl com 3A ;Salta ao endere�o 0125, se menor ;Adiciona 07 a DL ;Chama interrup��o do DOS ;Finaliza o programa

Este programa imprime o segundo de dois d�gitos hexadecimais. D�cimo exemplo -a100 297D:0100 297D:0102 297D:0104 297D:0106 297D:0109 297D:010C 297D:010E 297D:0111 297D:0113 297D:0115 297D:0117 297D:0119 297D:011B 297D:011D 297D:011F 297D:0121 MOV INT MOV SUB CMP JLE SUB MOV SHL INT SUB CMP JLE SUB ADD INT AH,01 21 DL,AL DL,30 DL,09 0111 DL,07 CL,04 DL,CL 21 AL,30 AL,09 011F AL,07 DL,AL 20 ;Fun��o 1 (l� caractere do teclado) ;Chama interrup��o do DOS ;P�e o valor de AL em DL ;Subtrai 30 de DL ;Compara DL com 09 ;Salta ao endere�o 0111, se menor ou igual ;Subtrai 07 de DL ;P�e o valor 04 em CL ;Insere zeros � direita ;Chama interrup��o do DOS ;Subtrai 30 de AL ;Compara AL com 09 ;Salta ao endere�o 011f, se menor ou igual ;Subtrai 07 de AL ;Adiciona AL a DL ;Finaliza o programa

Este programa pode ler dois d�gitos hexadecimais. D�cimo primeiro exemplo -a100 297D:0100 297D:0103 -a200 297D:0200 297D:0201 297D:0203 297D:0205 297D:0207 CALL INT PUSH MOV INT CMP JB 0200 20 DX AH,08 21 AL,30 0203 ;Chama um procedimento ;Finaliza o programa ;P�e o valor de DX na pilha ;Fun��o 8 ;Chama interrup��o do DOS ;Compara AL com 30 ;Salta se CF � ativado ao endere�o 0203

297D:0209 297D:020B 297D:020D 297D:020F 297D:0211 297D:0213 297D:0215 297D:0217 297D:0219 297D:021A 297D:021B 297D:021D 297D:021F 297D:022 297D:0223 297D:0225 297D:0227 297D:0228

CMP JA CMP JA MOV MOV INT SUB POP RET CMP JB MOV MOV INT SUB POP RET

AL,46 0203 AL,39 021B AH,02 DL,AL 21 AL,30 DX AL,41 0203 AH,02 DL,AL 21 AL,37 DX

;Compara AL com 46 ;Salta ao endere�o 0203, se diferente ;Compara AL com 39 ;Salta ao endere�o 021B, se diferente ;Fun��o 2 (escreve um caractere na tela) ;P�e o valor de AL em DL ;Chama interrup��o do DOS ;Subtrai 30 de AL ;Extrai o valor de DX da pilha ;Retorna o controle ao programa principal ;Compara AL com 41 ;Salta se CF � ativado ao endere�o 0203 ;Fun��o 2 (escreve um caractere na tela) ;P�e o valor AL em DL ;Chama interrup��o do DOS ;Subtrai 37 de AL ;Extrai o valor de DX da pilha ;Retorna o controle ao programa principal

Este programa se mant�m lendo caracteres at� receber um que possa ser convertido para um n�mero hexadecimal. --------------- // --------------7.2.Exemplos de Programas com TASM Nesta se��o forneceremos a voc� v�rios 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 Assembling file: Error messages: Warning messages: Passes: Remaining memory: C:\> Isto criar� um programa objeto com o mesmo nome do fonte, neste caso: one.obj Segundo passo Criar o programa execut�vel Por exemplo: one.asm None None 1 471k Copyright (c) 1988, 1990 Borland International

C:\>tlink one.obj Turbo Link Version 3.0 Copyright (c) 1987, 1990 Borland International C:\> Isto cria o programa execut�vel com o mesmo nome do objeto e com extens�o diferente, one.exe Terceiro passo Rodar o programa execut�vel. Basta digitar o nome do programa criado.

Exemplos de Programas Assembly Primeiro exemplo ;nome do programa: ; .model small .stack .code mov AH,1h Int 21h mov DL,AL sub DL,30h cmp DL,9h jle digit1 sub DL,7h digit1: mov CL,4h shl DL,CL int 21h sub AL,30h cmp AL,9h jle digit2 sub AL,7h digit2: add DL,AL mov AH,4Ch Int 21h End one.asm

;Fun��o 1 do DOS ;l� o caracter e returna o c�digo ASCII ao registrador AL ;move o c�digo ASCII para o registrador DL ;subtrai de 30h para converter a um d�gito de 0 a 9 ;compara se o d�gito est� entre 0 e 9 ;se verdadeiro obt�m o primeiro n�mero (4 bits) ;se falso, subtrai de 7h para converter a uma letra A-F ;prepara para multiplicar por 16 ;multiplica para converter dentro dos 4 bits mais altos ;obt�m o pr�ximo caracter ;repete a opera��o de convers�o ;compara o valor 9h com o conte�do do registrador AL ;se verdadeiro, obt�m o segundo d�gito ;se falso, subtrai de 7h ;adiciona o segundo d�gito ;fun��o 4Ch do DOS (exit) ;interrup��o 21h ;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 la�o com 10 intera��es PRINT_LOOP: CALL WRITE_CHAR ;Imprime o caracter em DL

INC DL LOOP PRINT_LOOP MOV AH,4Ch INT 21h PRINT_A_J ENDP WRITE_CHAR PROC MOV AH,2h INT 21h RET WRITE_CHAR ENDP END PRINT_A_J

;Incrementa o valor do registrador DL ;La�o para imprimir 10 caracteres ;Fun��o 4Ch, para sair ao DOS ;Interrup��o 21h ;Finaliza o procedimento ;Fun��o 2h, imprime caracter ;Imprime o caracter que est� em DL ;Retorna o controle ao procedimento que chamou ;Finaliza o procedimento ;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 ;Fun��o 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 d�gito ; ;Use:WRITE_HEX_DIGIT ; ;........................................................; WRITE_HEX PROC PUSH CX PUSH DX MOV DH,DL MOV CX,4 SHR DL,CL CALL WRITE_HEX_DIGIT MOV DL,DH AND DL,0Fh CALL WRITE_HEX_DIGIT POP DX POP CX RET WRITE_HEX ENDP ;coloca ;coloca ;move o ;move o na pilha o valor do registrador CX na pilha o valor do registrador DX valor do registrador DL para o registrador DH valor 4 para o registrador CX

;mostra na tela o primeiro n�mero hexadecimal ;move o valor do registrador DH para o registrador DL ;mostra na ;retira da ;retira da ;Retorna o tela o segundo n�mero hexadecimal pilha o valor do registrador DX pilha o valor do registrador CX controle ao procedimento que chamou

PUBLIC WRITE_HEX_DIGIT ;......................................................................; ;Este procediento converte os 4 bits mais baixos do registrador DL ; ;para um n�mero hexadecimal e o mostrana tela do computador ; ;Use: WRITE_CHAR ; ;......................................................................;

WRITE_HEX_DIGIT PROC PUSH DX CMP DL,10 JAE HEX_LETTER ADD DL,"0" JMP Short WRITE_DIGIT HEX_LETTER: ADD DL,"A"-10 WRITE_DIGIT: CALL WRITE_CHAR POP DX RET WRITE_HEX_DIGIT ENDP

;coloca na pilha o valor de DX ;compara se o n�mero de bits � menor do que 10 ;se n�o, salta para HEX_LETER ;se sim, converte para n�mero ;escreve o caracter ;converte um caracter para hexadecimal ;imprime o caracter na tela ;Retorna o valor inicial do registrador DX ;para o registrador DL ;Retorna o controle ao procedimento que chamou

PUBLIC WRITE_CHAR ;......................................................................; ;Este procedimento imprime um caracter na tela usando o D.O.S. ; ;......................................................................; WRITE_CHAR PROC PUSH AX MOV AH,2 INT 21h POP AX RET WRITE_CHAR ENDP ;Coloca na pilha o valor do registarador AX ;Fun��o 2h ;Interrup��o 21h ;Extrai da pilha o valor de AX ;Retorna o controle ao procedimento que chamou

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 ;Fun��o 4Ch INT 21h ;Interrup��o 21h TEST_WRITE_DECIMAL ENDP ;Finaliza o procedimento PUBLIC WRITE_DECIMAL ;.................................................................; ;Este procedimento escreve um n�mero de 16 bit como um n�mero ; ;sem sinal em nota��o decimal ; ;Use: WRITE_HEX_DIGIT ; ;.................................................................; WRITE_DECIMAL PUSH AX PUSH CX PUSH DX PUSH SI MOV AX,DX MOV SI,10 PROC ;P�e na ;P�e na ;P�e na ;P�e na ;move o ;move o pilha pilha pilha pilha valor valor o valor do registrador AX o valor do registrador CX o valor do registrador DX o valor do registrador SI do registrador DX para AX 10 para o registrador SI

XOR CX,CX ;zera o registrador CX NON_ZERO: XOR DX,DX ;zera o registrador CX DIV SI ;diviz�o entre SI PUSH DX ;P�e na pilha o valor do registrador DX INC CX ;incrementa CX OR AX,AX ;n�o 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 POP DX ;retira da pilha o valor do registrador POP CX ;retira da pilha o valor do registrador POP AX ;retira da pilha o valor do registrador RET ;Retorna o controle ao procedimento que WRITE_DECIMAL ENDP ;Finaliza o procedimento

SI DX CX AX chamou

PUBLIC WRITE_HEX_DIGIT ;......................................................................; ; ; ;Este procedimento converte os 4 bits mais baixos do registrador DL ; ;num n�mero hexadecimal e os imprime ; ;Use: WRITE_CHAR ; ;......................................................................; WRITE_HEX_DIGIT PROC PUSH DX ;P�e na pilha o valor do registrador DX CMP DL,10 ;Compara o valor 10 com o valor do registrador DL JAE HEX_LETTER ;se n�o, salta para HEX_LETER ADD DL,"0" ;se �, converte em d�gito num�rico JMP Short WRITE_DIGIT ;escreve o caracter HEX_LETTER: ADD DL,"A"-10 ;converte um caracter para um n�mero hexadecimal WRITE_DIGIT: CALL WRITE_CHAR ;mostra o caracter na tela 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 fun��o D.O.S.; ;......................................................................; WRITE_CHAR PROC PUSH AX ;P�e na pilha o valor do registrador AX MOV AH,2h ;Fun��o 2h INT 21h ;Interrup��o 21h POP AX ;Retira da pilha o valor inicial do registrador AX RET ;Retorna o controle ao procedimento que chamou WRITE_CHAR ENDP END TEST_WRITE_DECIMAL ;finaliza o programa Este programa mostra na tela os n�meros 12345

Quinto exemplo ;nome do programa: five.asm .model small .stack .code PRINT_ASCII MOV DL,00h MOV CX,255 PROC ;move o valor 00h para o registrador DL ;move o valor decimal 255 para o registrador CX ;usado para fazer um la�o com 255 intera��es ;Chama o procedimento que imprime ;Incrementa o valor do registrador DL ;Loop para imprimir 10 caracteres ;Fun��o 4Ch ;Interrup��o 21h ;Finaliza o procedimento ;Fun��o 2h para imprimir um caracter ;Imprime o caracter que est� em DL ;Retorna o controle ao procediemento que chamou ;Finaliza o procedimento ;Finaliza o programa

PRINT_LOOP: CALL WRITE_CHAR INC DL LOOP PRINT_LOOP MOV AH,4Ch INT 21h PRINT_ASCII ENDP WRITE_CHAR PROC MOV AH,2h INT 21h RET WRITE_CHAR ENDP END PRINT_ASCII

Este programa mostra na tela o valor dos 256 caracteres do c�digo ASCII.

***************************************************************************** CAP�TULO 8: BIBLIOGRAFIA Cr�ditos: Monico Brise�o C., Engenheiro Id�ia Original Desenvolvimento e Implementa��o da edi��o 1996 Hugo Eduardo P�rez P. Desenvolvimento e Implementa��o da edi��o 1995 V�ctor Hugo Avila B. Vers�o Inglesa Jeferson Botelho do Amaral Vers�o Portuguesa Ana Mar�a Peraza Programadora de Linguagem Assembly Graciela Salcedo Mancilla Programadora Tcl/Tk Juan Olmos Monroy

Designer Gr�fico

Refer�ncias Bibliogr�ficas: 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 Organiza��o Estruturada de Computadores Andrew S. Tanenbaum Prentice Hall do Brasil Guia do Programador para as Placas EGA e VGA Richard F. Ferraro Ed. Ci�ncia Moderna Programando em Assembler 8086/8088 Jeremias R. D. Pereira dos Santos Edison Raymundi Junior McGraw-Hill Assembly IBM PC - T�cnicas de Programa��o 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 Interrup��es MS-DOS, ROM-BIOS Eurico Soalheiro Br�s McGraw-Hill Desenvolvimento de Software B�sico Leland L. Beck Editora Campus Programa��o Assembly 80386 - Guia Pr�tico para Programadores Ross P. Nelson McGraw-Hill