Você está na página 1de 95

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.

TXT

University of Guadalajara Information Sistems General Coordination. Culture and Entertainment Web June 12th 1995 Copyright(C)1995-1996 ***************************************************************************** * Este tutorial foi traduzido para o Portugus por Jeferson Amaral. * * e-mail: amaral@inf.ufsm.br * ***************************************************************************** Este tutorial tem o intuito de apenas introduzir o leitor ao mundo da programacao em Linguagem Assembly, nao tem, portanto e de forma alguma, plano de esgotar o assunto. Copyright (C) 1995-1996, Hugo Perez Perez. Anyone may reproduce this document, in whole or in part, provided that: (1) any copy or republication of the entire document must show University of Guadalajara as the source, and must include this notice; and (2) any other use of this material must reference this manual and University of Guadalajara, and the fact that the material is copyright by Hugo Perez and is used by permission. **************************************************************************** TUTORIAL DE LINGUAGEM ASSEMBLY --------------- --- ----------------- --------------Contedo: 1.Introduo 2.Conceitos B sicos 3.Programao Assembly 4.Instrues Assembly 5.Interrupes e gerncia de arquivos 6.Macros e procedimentos 7.Exemplos de programas 8.Bibliografia

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (1 of 95)28/09/2004 17:10:34

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

***************************************************************************** CAPTULO 1: INTRODUO Contedo: 1.1.O que h de novo neste material 1.2.Apresentao 1.3.Por que aprender Assembly? 1.4.Ns precisamos da sua opinio --------------- // --------------1.1.O que h de novo neste material: Aps um ano da realizao da primeira verso do tutorial, e atravs das opinies recebidas por e-mail, resolvemos ter por disposio todos estes coment rios e sugestes. Esperamos que atravs deste novo material Assembly, as pessoas que se mostrarem interessadas possam aprender mais sobre o seu IBM PC. Esta nova edio do tutorial inclui: Uma seo completa sobre como usar o programa debug. Mais exemplos de programas. Um motor de pesquisa, para qualquer tpico ou item relacionado esta nova verso. Consider vel reorganizao e reviso do material Assembly. Em cada seo, h um link para o Dicion rio On-line de Computao de Dennis Howe.

1.2.Apresentao: Este tutorial destina-se quelas pessoas que nunca tiveram contato com a Linguagem Assembly. O tutorial est completamente focado em computadores com processadores 80x86 da famlia Intel, e considerando que a base da linguagem o funcionamento dos recursos internos do processador, os exemplos descritos no so compatveis com qualquer outra arquitetura. As informaes esto dispostas em unidades ordenadas para permitir f cil acesso a cada tpico, bem como uma melhor navegao pelo tutorial.
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (2 of 95)28/09/2004 17:10:34

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

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

1.3.Por que aprender Assembly? A primeira razo para se trabalhar com o assembler a oportunidade de conhecer melhor o funcionamento do seu PC, o que permite o desenvolvimento de programas de forma mais consistente. A segunda razo que voc pode ter um controle total sobre o PC ao fazer uso do assembler. Uma outra razo que programas assembly so mais r pidos, menores e mais poderosos do que os criados com outras linguagens. Ultimamente, o assembler (montador) permite uma otimizao ideal nos programas, seja no seu tamanho ou execuo.

1.4.Ns precisamos da sua opinio: Nosso intuito oferecer um modo simples para que voc consiga aprender Assembly por si mesmo. Por tanto, qualquer coment rio ou sugesto ser bem-vinda.

***************************************************************************** CAPTULO 2: CONCEITOS BSICOS Contedo: 2.1.Descrio b sica de um sistema computacional. 2.2.Conceitos b sicos da Linguagem Assembly 2.3.Usando o programa debug --------------- // --------------Esta seo tem o propsito de fazer um breve coment rio a respeito dos principais componentes de um sistema computacional, o que ir permitir ao usu rio uma melhor compreenso dos conceitos propostos no decorrer do tutorial.
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (3 of 95)28/09/2004 17:10:34

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

2.1.DESCRIO DE UM SISTEMA COMPUTACIONAL Contedo: 2.1.1.Processador Central 2.1.2.Memria Principal 2.1.3.Unidades de Entrada e Sada 2.1.4.Unidades de Memria Auxiliar

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

2.1.1.Processador Central. tambm conhecido por CPU ou Unidade Central de Processamento, que por sua vez composta pela unidade de controle e unidade de lgica e aritmtica. Sua funo consiste na leitura e escrita do contedo das clulas de memria, regular o tr fego de dados entre as clulas de memria e registradores especiais, e decodificar e executar as instrues de um programa. O processador tem uma srie de clulas de memria usadas com freqncia e, dessa forma, so partes da CPU. Estas clulas so conhecidas com o nome de registradores. Um processador de um PC possui cerca de 14 registradores. Como os PCs tem sofrido evoluo veremos que podemos manipular registradores de 16 ou 32 bits. A unidade de lgica e aritmtica da CPU realiza as operaes relacionadas ao c lculo simblico e numrico. Tipicamente estas unidades apenas so capazes de realizar operaes elementares, tais como: adio e subtrao de dois nmeros inteiros, multiplicao e diviso de nmero inteiro, manuseio de bits de registradores e comparao do contedo de dois registradores. Computadores pessoais podem ser classificados pelo que conhecido como tamanho da palavra, isto , a quantidade de bits que o processador capaz de manusear de uma s vez.

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (4 of 95)28/09/2004 17:10:34

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

2.1.2.Memria Principal. um grupo de clulas, agora sendo fabricada com semi-condutores, usada para processamentos gerais, tais como a execuo de programas e o armazenamento de informaes para operaes. Cada uma das clulas pode conter um valor numrico e capaz de ser endereada, isto , pode ser identificada de forma singular em relao s outras clulas pelo uso de um nmero ou endereo. O nome genrico destas memrias Random Access Memory ou RAM. A principal desvantagem deste tipo de memria o fato de que seus circuitos integrados perdem a informao que armazenavam quando a energia eltrica for interrompida, ou seja, ela vol til. Este foi o motivo que levou criao de um outro tipo de memria cuja informao no perdida quando o sistema desligado. Estas memrias receberam o nome de Read Only Memory ou ROM.

2.1.3.Unidades de Entrada e Sada. Para que o computador possa ser til para ns se faz necess rio que o processador se comunique com o exterior atravs de interfaces que permitem a entrada e a sada de informao entre ele e a memria. Atravs do uso destas comunicaes possvel introduzir informao a ser processada e mais tarde visualizar os dados processados. Algumas das mais comuns unidades de entrada so o teclado e o mouse. As mais comuns unidades de sada so a tela do monitor e a impressora.

2.1.4.Unidades de Memria Auxiliar. Considerando o alto custo da memria principal e tambm o tamanho das aplicaes atualmente, vemos que ela muito limitada. Logo, surgiu a necessidade da criao de dispositivos de armazenamento pr ticos e econmicos. Estes e outros inconvenientes deram lugar s unidades de memria auxiliar, perifricos. As mais comuns so as fitas e os discos magnticos. A informao ali armazenada ser dividida em arquivos. Um arquivo feito de um nmero vari vel de registros, geralmente de tamanho fixo, podendo conter informao ou programas.
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (5 of 95)28/09/2004 17:10:34

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

--------------- // --------------2.2.CONCEITOS BSICOS Contedo: 2.2.1.Informaes nos computadores 2.2.2.Mtodos de representao de dados

2.2.1.Informao no computador: 2.2.1.1.Unidades de informao 2.2.1.2.Sistemas numricos 2.2.1.3.Convertendo nmeros bin rios para decimais 2.2.1.4.Convertendo nmeros decimais para bin rios 2.2.1.5.Sistema hexadecimal

2.2.1.1.Unidades de informao Para o PC processar a informao, necess rio que ela esteja em clulas especiais, chamadas registradores. Os registradores so grupos de 8 ou 16 flip-flops. Um flip-flop um dispositivo capaz de armazenar 2 nveis de voltagem, um baixo, geralmente 0.5 volts, e outro comumente de 5 volts. O nvel baixo de energia no flip-flop interpretado como desligado ou 0, e o nvel alto, como ligado ou 1. Estes estados so geralmente conhecidos como bits, que so a menor unidade de informao num computador. Um grupo de 16 bits conhecido como palavra; uma palavra pode ser dividida em grupos de 8 bits chamados bytes, e grupos de 4 bits chamados nibbles.

2.2.1.2.Sistemas numricos O sistema numrico que ns usamos diariamente o decimal, mas este sistema
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (6 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

no conveniente para m quinas, pois ali as informaes tm que ser codificadas de modo a interpretar os estados da corrente (ligado-desligado); este modo de cdigo faz com que tenhamos que conhecer o c lculo posicional que nos permitir expressar um nmero em qualquer base onde precisarmos dele. possvel representar um determinado nmero em qualquer base atravs da seguinte frmula:

Onde n a posio do dgito, iniciando da direita para a esquerda e numerando de 0. D o dgito sobre o qual ns operamos e B a base numrica usada.

2.2.1.3.Convertendo nmeros bin rios para decimais Quando trabalhamos com a Linguagem Assembly encontramos por acaso a necessidade de converter nmeros de um sistema bin rio, que usado em computadores, para o sistema decimal usado pelas pessoas. O sistema bin rio baseado em apenas duas condies ou estados, estar ligado(1), ou desligado(0), portanto sua base dois. Para a converso, podemos usar a frmula de valor posicional: Por exemplo, se tivermos o nmero bin rio 10011, tomamos cada dgito da direita para a esquerda e o multiplicamos pela base, elevando potncia correspondente sua posio relativa: Binary: Decimal: = 1 1 1 0 0 1

1*2^0 + 1*2^1 + 0*2^2 + 0*2^3 + 1*2^4 + 2 + 0 + 0 + 16 = 19 decimal.

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

2.2.1.4.Convertendo nmeros decimais para bin rio H v rios mtodos para se converter nmeros decimais para bin rio; apenas um
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (7 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

ser analizado aqui. Naturalmente a converso com uma calculadora cientfica muito mais f cil, mas nem sempre podemos contar com isso, logo o mais conveniente , ao menos, sabermos uma frmula para faz-la. O mtodo resume-se na aplicao de divises sucessivas por 2, mantendo o resto como o dgito bin rio e o resultado como o prximo nmero a ser dividido. Tomemos como exemplo o nmero decimal 43. 43/2=21 e o resto 1; 21/2=10 e o resto 1; 10/2=5 e o resto 0; 5/2=2 e o resto 1; 2/2=1 e o resto 0; 1/2=0 e o resto 1. Para construir o equivalente 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 dgitos, que vo de 0 a 9 e da letra A at a F, estas letras representam os nmeros de 10 a 15. Portanto contamos: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E, e F. A converso entre nmeros bin rios e hexadecimais f cil. A primeira coisa a fazer dividir o nmero bin rio em grupos de 4 bits, comeando da direita para a esquerda. Se no grupo mais direita sobrarem dgitos, completamos com zeros. Tomando como exemplo o nmero 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 nmero independente e consideramos o seu valor decimal: 0010=2;1011=11 Entretanto, observa-se que no podemos representar este nmero como 211,
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (8 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

isto seria um erro, uma vez que os nmeros em hexa maiores que 9 e menores que 16 so representados pelas letras A,B,...,F. Logo, obtemos como resultado: 2Bh, onde o "h" representa a base hexadecimal. Para a converso de um nmero hexadecimal em bin rio apenas necess rio inverter os passos: tomamos o primeiro dgito hexadecimal e o convertemos para bin rio, a seguir o segundo, e assim por diante.

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

2.2.2.Mtodos de representao de dados num computador. 2.2.2.1.Cdigo ASCII 2.2.2.2.Mtodo BCD 2.2.2.3.Representao de ponto flutuante

2.2.2.1.Cdigo ASCII ASCII significa American Standard Code for Information Interchange. Este cdigo contm as letras do alfabeto, dgitos decimais de 0 a 9 e alguns smbolos adicionais como um nmero bin rio de 7 bits, tendo o oitavo bit em 0, ou seja, desligado. Deste modo, cada letra, dgito ou caracter especial ocupa 1 byte na memria do computador. Podemos observar que este mtodo de representao de dados muito ineficiente no aspecto numrico, uma vez que no formato bin rio 1 byte no suficiente para representar nmeros de 0 a 255, com o ASCII podemos representar apenas um dgito. Devido a esta ineficincia, o cdigo ASCII usado, principalmente, para a representao de textos.

2.2.2.2.Mtodo BCD
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (9 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

BCD significa Binary Coded Decimal. Neste mtodo grupos de 4 bits so usados para representar cada dgito decimal de 0 a 9. Com este mtodo podemos representar 2 dgitos por byte de informao. Vemos que este mtodo vem a ser muito mais pr tico para representao numrica do que o cdigo ASCII. Embora ainda menos pr tico do que o bin rio, com o mtodo BCD podemos representar dgitos de 0 a 99. Com o bin rio, vemos que o alcance maior, de 0 a 255. Este formato (BCD) principalmente usado na representao de nmeros grandes, aplicaes comerciais, devido s suas facilidades de operao.

2.2.2.3.Representao de ponto flutuante Esta representao baseada em notao cientfica, isto , representar um nmero em 2 partes: sua base e seu expoente. Por exemplo o nmero decimal 1234000, representado como 1.234*10^6, observamos que o expoente ir indicar o nmero de casas que o ponto decimal deve ser movido para a direita, a fim de obtermos o nmero original. O expoente negativo, por outro lado, indica o nmero de casas que o ponto decimal deve se locomover para a esquerda.

--------------- // --------------2.3.PROGRAMA DEBUG Contedo: 2.3.1.Processo de criao de programas 2.3.2.Registradores da CPU 2.3.3.Programa debug 2.3.4.Estrutura Assembly 2.3.5.Criando um programa assembly simples 2.3.6.Armazenando e carregando os programas

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (10 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

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

2.3.2.Registradores da CPU. Para o propsito did tico, vamos focar registradores de 16 bits. A CPU possui 4 registradores internos, cada um de 16 bits. So eles AX, BX, CX e DX. So registradores de uso geral e tambm podem ser usados como registradores de 8 bits. Para tanto devemos referenci -los como, por exemplo, AH e AL, que so, respectivamente, o byte high e o low do registrador AX. Esta nomenclatura tambm se aplica para os registradores BX, CX e DX. Os registradores, segundo seus respectivos nomes: AX Registrador Acumulador BX Registrador Base CX Registrador Contador DX Registrador de Dados DS Registrador de Segmento de Dados ES Registrador de Segmento Extra SS Registrador de Segmento de Pilha CS Registrador de Segmento de Cdigo BP Registrador Apontador da Base SI Registrador de ndice Fonte
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (11 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

DI Registrador de ndice Destino SP Registrador Apontador de Pilha IP Registrador Apontador da Prxima Instruo F Registrador de Flag

2.3.3.Programa Debug. Para a criao de um programa em assembler existem 2 opes: usar o TASM Turbo Assembler da Borland, ou o DEBUGGER. Nesta primeira seo vamos usar o debug, uma vez que podemos encontr -lo em qualquer PC com o MS-DOS. Debug pode apenas criar arquivos com a extenso .COM, e por causa das caractersticas deste tipo de programa, eles no podem exceder os 64 Kb, e tambm devem iniciar no endereo de memria 0100H dentro do segmento especfico. importante observar isso, pois deste modo os programas .COM no so reloc veis. Os principais comandos do programa debug so: A Montar instrues simblicas em cdigo de m quina D Mostrar o contedo de uma rea da memria E Entrar dados na memria, iniciando num endereo especfico G Rodar um programa execut vel na memria N Dar nome a um programa P Proceder, ou executar um conjunto de instrues relacionadas Q Sair do programa debug R Mostrar o contedo de um ou mais registradores T Executar passo a passo as instrues U Desmontar o cdigo de m quina em instrues simblicas W Gravar um programa em disco possvel visualizar os valores dos registradores internos da CPU usando o programa Debug. Debug um programa que faz parte do pacote do DOS, e pode ser encontrado normalmente no diretrio C:\DOS. Para inici -lo, basta digitar Debug na linha de comando: C:/>Debug [Enter] Voc notar ento a presena de um hfen no canto inferior esquerdo da tela. No se espante, este o prompt do programa. Para visualizar o contedo dos
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (12 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

registradores, experimente: -r[Enter] AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0D62 ES=0D62 SS=0D62 CS=0D62 IP=0100 NV UP EI PL NZ NA PO NC 0D62:0100 2E CS: 0D62:0101 803ED3DF00 CMP BYTE PTR [DFD3],00 CS:DFD3=03 mostrado o contedo de todos os registradores internos da CPU; um modo alternativo para visualizar um nico registrador usar o camando "r" seguido do parmetro que faz referncia ao nome do registrador: -rbx BX 0000 : Esta instruo mostrar o contedo do registrador BX e mudar o indicador do Debug de "-" para ":" Quando o prompt assim se tornar, significa que possvel, embora no obrigatria, a mudana do valor contido no registrador, bastando digitar o novo valor e pressionar [Enter]. Se voc simplesmente pressionar [Enter] o valor antigo se mantm.

2.3.4.Estrutura Assembly. Nas linhas do cdigo em Linguagem Assembly h duas partes: a primeira o nome da instruo a ser executada; a segunda, os parmetros do comando. Por exemplo: add ah bh Aqui "add" o comando a ser executado, neste caso uma adio, e "ah" bem como "bh" so os parmetros. Por exemplo: mov al, 25 No exemplo acima, estamos usando a instruo mov, que significa mover o valor 25 para o registrador al.
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (13 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

O nome das instrues nesta linguagem constitudo de 2, 3 ou 4 letras. Estas instrues so chamadas mnemnicos ou cdigos de operao, representando a funo que o processador executar . s vezes instrues aparecem assim: add al,[170] Os colchetes no segundo parmetro indica-nos que vamos trabalhar com o contedo da clula de memria de nmero 170, ou seja, com o valor contido no endereo 170 da memria e no com o valor 170, isto conhecido como "endereamento direto".

2.3.5.Criando um programa simples em assembly. No nos responsabilizaremos pela m execuo ou possveis danos causados por quaisquer exemplos que de agora em diante aparecero, uma vez que os mesmos, apesar de testados, so de car ter did tico. Vamos, ento, criar um programa para ilustrar o que vimos at agora. Adicionaremos dois valores: O primeiro passo iniciar o Debug, o que j vimos como fazer anteriormente. Para montar um programa no Debug, usado o comando "a" (assemble); quando usamos este comando, podemos especificar um endereo inicial para o nosso programa como o parmetro, mas opcional. No caso de omisso, o endereo inicial o especificado pelos registradores CS:IP, geralmente 0100h, o local em que programas com extenso .COM devem iniciar. E ser este o local que usaremos, uma vez que o Debug s pode criar este tipo de programa. Embora neste momento no seja necess rio darmos um parmetro 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 contedo dos registradores ax e bx,
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (14 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

guardando o resultado em ax e finalmente a instruo nop (nenhuma operao) finaliza o programa. No programa debug, a tela se parecer com: C:\>debug -a 100 0D62:0100 mov ax,0002 0D62:0103 mov bx,0004 0D62:0106 add ax,bx 0D62:0108 nop 0D62:0109 Entramos com o comando "t" para executar passo a passo as instrues: -t AX=0002 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0D62 ES=0D62 SS=0D62 CS=0D62 IP=0103 NV UP EI PL NZ NA PO NC 0D62:0103 BB0400 MOV BX,0004 Vemos o valor 0002 no registrador AX. Teclamos "t" para executar a segunda instruo: -t AX=0002 BX=0004 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0D62 ES=0D62 SS=0D62 CS=0D62 IP=0106 NV UP EI PL NZ NA PO NC 0D62:0106 01D8 ADD AX,BX Teclando "t" novamente para ver o resultado da instruo add: -t AX=0006 BX=0004 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0D62 ES=0D62 SS=0D62 CS=0D62 IP=0108 NV UP EI PL NZ NA PE NC 0D62:0108 90 NOP A possibilidade dos registradores conterem valores diferentes existe, mas AX e BX devem conter os mesmos valores acima descritos. Para sair do Debug usamos o comando "q" (quit).

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (15 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

2.3.6.Armazenando e carregando os programas. No seria pr tico ter que digitar o programa cada vez que inici ssemos o Debug. Ao invs disso, podemos armazen -lo no disco. S que o mais interessante nisso que um simples comando de salvar cria um arquivo com a extenso .COM, ou seja, execut vel - sem precisarmos efetuar os processos de montagem e ligao, como veremos posteriormente com o TASM. Eis os passos para salvar um programa que j esteja na memria: * Obter o tamnho do programa subtraindo o endereo final do endereo inicial, naturalmente que no sistema hexadecimal. * Dar um nome ao programa. * Colocar o tamanho do programa no registrador CX. * Mandar o debug gravar o programa em disco. Usando como exemplo o seguinte programa, vamos clarear a idia de como realizar os passos acima descritos: 0C1B:0100 mov ax,0002 0C1B:0103 mov bx,0004 0C1B:0106 add ax,bx 0C1B:0108 int 20 0C1B:010A Para obter o tamanho de um programa, o comando "h" usado, j que ele nos mostra a adio e subtrao de dois nmeros em hexadecimal. Para obter o tamanho do programa em questo, damos como parmetro o valor do endereo final do nosso programa (10A), e o endereo inicial (100). O primeiro resultado mostra-nos a soma dos endereos, o segundo, a subtrao. -h 10a 100 020a 000a O comando "n" permite-nos nomear o programa. -n test.com O comando "rcx" permite-nos mudar o contedo do registrador CX para o valor obtido como tamanho do arquivo com o comando "h", neste caso 000a.

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (16 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

-rcx CX 0000 :000a Finalmente, o comando "w" grava nosso programa no disco, indicando quantos bytes gravou. -w Writing 000A bytes Para j salvar um arquivo quando carreg -lo, 2 passos so 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 memria. O que ele faz desmontar o cdigo e mostr -lo em assembly. Os parmetros indicam ao Debug os endereos inicial e final a serem desmontados. O Debug sempre carrega os programas na memria no endereo 100h, conforme j comentamos.

***************************************************************************** CAPTULO 3: PROGRAMAO ASSEMBLY Contedo:

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (17 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

3.1.Construindo programas em Assembly 3.2.Processo Assembly 3.3.Pequenos programas em Assembly 3.4.Tipos de instrues --------------- // --------------3.1.Construindo programas em Assembly. 3.1.1.Software necess rio 3.1.2.Programao Assembly

3.1.1.SOFTWARE NECESSRIO Para que possamos criar um programa, precisamos de algumas ferramentas: Primeiro de um editor para criar o programa fonte. Segundo de um montador, um programa que ir transformar nosso fonte num programa objeto. E, terceiro, de um linker (ligador) que ir gerar o programa 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, tambm da Borland. Ns devemos criar os programas fonte com a extenso .ASM para que o TASM reconhea e o transforme no programa objeto, um "formato intermedi rio" do programa, assim chamado porque ainda no um programa execut vel e to pouco um programa fonte. O linker gera a partir de um programa .OBJ, ou da combinao de v rios deles, um programa execut vel, cuja extenso normalmente .EXE, embora possa ser .COM dependendo da forma como for montado e ligado.

3.1.2.PROGRAMAO ASSEMBLY Para construirmos os programas com o TASM, devemos estruturar o fonte de forma diferenciada ao que fazamos com o programa debug. importante incluir as seguintes diretivas assembly: .MODEL SMALL Define o melo de memria a usar em nosso programa
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (18 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

.CODE Define as instrues do programa, relacionado ao segmento de cdigo .STACK Reserva espao de memria para as instrues de programa na pilha END Finaliza um programa assembly Vamos programar Primeiro passo Use qualquer editor para criar o programa fonte. Entre com as seguintes linhas: Primeiro exemplo ; use ; para fazer coment rios em programas assembly .MODEL SMALL ;modelo de memria .STACK ;espao de memria para instrues do programa na pilha .CODE ;as linhas seguintes so instrues do programa mov ah,01h ;move o valor 01h para o registrador ah mov cx,07h ;move o valor 07h para o registrador cx int 10h ;interrupo 10h mov ah,4ch ;move o valor 4ch para o registrador ah int 21h ;interrupo 21h END ;finaliza o cdigo do programa Este programa assembly muda o tamanho do cursor. Segundo passo Salvar o arquivo com o seguinte nome: exam1.asm No esquecer de salv -lo no formato ASCII. Terceiro passo Usar o programa TASM para construir o programa objeto. Exemplo:

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (19 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

C:\>tasm exam1.asm Turbo Assembler Version 2.0 Copyright (c) 1988, 1990 Borland International Assembling file: exam1.asm Error messages: None Warning messages: None Passes: 1 Remaining memory: 471k O TASM s pode criar programas no formato .OBJ, que ainda no pode ser executado... Quarto passo Usar o programa TLINK para criar o programa 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 extenso .EXE. opcional a colocao da extenso .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 equivalncia

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (20 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

3.2.1.SEGMENTOS A arquitetura dos processadores x86 fora-nos a usar segmentos de memria para gerenciar a informao, o tamanho destes segmentos de 64Kb. A razo de ser destes segmentos que, considerando que o tamanho m ximo de um nmero que o processador pode gerenciar dado por uma palavra de 16 bits ou registrador, assim no seria possvel acessar mais do que 65536 locais da memria usando apenas um destes registradores. Mas agora, se a memria do PC dividida em grupos de segmentos, cada um com 65536 locais, e podemos usar um endereo ou registrador exclusivo para encontrar cada segmento, e ainda fazemos cada endereo de um especfico slot com dois registradores, nos possvel acessar a quantidade de 4294967296 bytes de memria, que , atualmente, a maior memria que podemos instalar num PC. Desta forma, para que o montador seja capaz de gerenciar os dados, se faz necess rio que cada informao ou instruo se encontre na rea correspondente ao seu segmento. O endereo do segmento fornecido ao montador pelos registradores DS, ES, SS e CS. Lembrando um programa no Debug, observe: 1CB0:0102 MOV AX,BX O primeiro nmero 1CB0, corresponde ao segmento de memria que est sendo usado, o segundo uma referncia ao endereo dentro do segmento, um deslocamento dentro do segmento offset. O modo usado para indicar ao montador com quais segmentos vamos trabalhar fazendo uso das diretivas .CODE, .DATA e .STACK. O montador ajusta o tamanho dos segmentos tomando como base o nmero de bytes que cada instruo assembly precisa, j que seria um desperdcio de memria usar segmentos inteiros. Por exemplo, se um programa precisa de apenas 10Kb para armazenar dados, o segmento de dados seria apenas de 10Kb e no de 64Kb, como poderia acontecer se feito manualmente.

3.2.2.TABELAS DE EQUIVALNCIA Cada uma das partes numa linha de cdigo assembly conhecida como token, por exemplo:

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (21 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

MOV AX,Var Aqui temos trs tokens, a instruo MOV, o operador AX e o operador VAR. O que o montador faz para gerar o cdigo OBJ ler cada um dos tokens e procurar a equivalncia em cdigo de m quina em tabelas correspondentes, seja de palavras reservadas, tabela de cdigos de operao, tabela de smbolos, tabela de literais, onde o significado dos mnemnicos e os endereos dos smbolos que usamos sero encontrados. A maioria dos montadores so de duas passagens. Em sntese na primeira passagem temos a definio dos smbolos, ou seja, so associados endereos a todas as instrues do programa. Seguindo este processo, o assembler l MOV e procura-o na tabela de cdigos de operao para encontrar seu equivalente na linguagem de 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 no uma palavra reservada, ento procura na tabela de smbolos, l encontrando-a ele designa o endereo correspondente, mas se no encontrou ele a insere na tabela para que ela possa receber um endereo na segunda passagem. Ainda na primeira passagem executado parte do processamento das diretivas, importante notar que as diretivas no criam cdigo objeto. Na passagem dois so montadas as instrues, traduzindo os cdigos de operao e procurando os endereos, e gerado o cdigo objeto. H smbolos que o montador no consegue encontrar, uma vez que podem ser declaraes externas. Neste caso o linker entra em ao para criar a estrutura necess ria a fim de ligar as diversas possveis partes de cdigo, dizendo ao loader que o segmento e o token em questo so definidos quando o programa carregado e antes de ser executado.

--------------- // --------------3.3.Mais programas. Outro exemplo Primeiro passo Use qualquer editor e crie o seguinte: ;exemplo2 .model small
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (22 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

.stack .code mov ah,2h ;move o valor 2h para o registrador ah mov dl,2ah ;move o valor 2ah para o registrador dl ;( o valor ASCII do caractere *) int 21h ;interrupo 21h mov ah,4ch ;funo 4ch, sai para o sistema operacional int 21h ;interrupo 21h end ;finaliza o programa Segundo passo Salvar o arquivo com o nome: exam2.asm No esquecer de salvar em formato ASCII. Terceiro passo Usar o programa TASM para construir o programa objeto. C:\>tasm exam2.asm Turbo Assembler Version 2.0 Copyright (c) 1988, 1990 Borland International Assembling file: exam2.asm Error messages: None Warning messages: None Passes: 1 Remaining memory: 471k Quarto passo Usar o programa TLINK para criar o programa execut vel. C:\>tlink exam2.obj Turbo Link Version 3.0 Copyright (c) 1987, 1990 Borland International C:\> Quinto passo Executar o programa: C:\>exam2[enter] *
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (23 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

C:\> Este programa imprime o caracter * na tela. Clique aqui para obter mais programas

--------------- // --------------3.4.Tipos de instrues. 3.4.1.Movimento de dados 3.4.2.Operaes lgicas e aritmticas 3.4.3.Saltos, laos e procedimentos

3.4.1.MOVIMENTO DE DADOS Em qualquer programa h necessidade de se mover dados na memria e em registradores da CPU; h v rios modos de se faz-lo: pode-se copiar os dados da memria para algum registrador, de registrador para registrador, de um registrador para a pilha, da pilha para um registrador, transmitir dados para um dispositivo externo e vice-versa. Este movimento de dados sujeito a regras e restries, entre elas: *No possvel mover dados de um local da memria para outro diretamente; necess rio primeiro mover o dado do local de origem para um registrador e ento do registrador para o local de destino. *No possvel mover uma constante diretamente para um registrador de segmento; primeiro deve-se mover para um registrador. possvel mover blocos de dados atravs de instrues movs, que copia uma cadeia de bytes ou palavras; movsb copia n bytes de um local para outro; e movsw copia n palavras. A ltima das duas instrues toma os valores dos endereos definidos por DS:SI como o grupo de dados a mover e ES:DI como a nova localizao dos dados. Para mover dados h tambm estruturas chamadas pilhas, onde o dado introduzido com a instruo push e extrado com a instruo pop Numa pilha o primeiro dado a entrar o ltimo a sair, por exemplo:
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (24 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

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 comunicao com dispositivos externos o comando de sada usado para o envio de informaes a uma porta e o comando de entrada usado para receber informao de uma porta. A sintaxe do comando de sada: OUT DX,AX Onde DX contm o valor da porta que ser usada para a comunicao e AX contm a informao que ser enviada. A sintaxe do comando de entrada: IN AX,DX Onde AX o registrador onde a informao ser armazenada e DX contm o endereo da porta de onde chegar a informao.

3.4.2.OPERAES LGICAS E ARITMTICAS As instrues de operaes lgicas so: and, not, or e xor. Elas trabalham a nvel de bits em seus operadores. Para verificar o resultado das operaes usamos as instrues cmp e test. As instrues usadas para operaes algbricas so: para adio add, para subtrao sub, para multiplicao mul e para diviso div. Quase todas as instrues de comparao so baseadas na informao contida no registrador de flag. Normalmente os flags do registrador que podem ser
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (25 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

manuseados diretamente pelo programador so os da direo de dados DF, usado para definir as operaes sobre cadeias. Uma outro que pode tambm ser manuseado o flag IF atravs das instrues sti e cli, para ativar e desativar as interrupes.

3.4.3.SALTOS, LOOPS E PROCEDIMENTOS Saltos incondicionais na escrita de programas em linguagem assembly so dados pela instruo jmp; um salto usado para modificar a seqncia da execuo das instrues de um programa, enviando o controle ao endereo indicado, ou seja, o registrador contador de programa recebe este novo endereo. Um loop, tambm conhecido como interao, a repetio de um processo um certo nmero de vezes at atingir a condio de parada.

***************************************************************************** CAPTULO 4: INSTRUES ASSEMBLY Contedo: 4.1.Instrues de operao de dados 4.2.Instrues lgicas e aritmticas 4.3.Instrues de controle de processos --------------- // --------------4.1. Instrues de operao de dados Contedo: 4.1.1.Instrues de transferncia 4.1.2.Instrues de carga 4.1.3.Instrues de pilha

4.1.1.Instrues de transferncia. So usadas para mover o contedo dos operadores. Cada instruo pode ser usada com diferentes modos de endereamento.
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (26 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

MOV MOVS (MOVSB) (MOVSW)

INSTRUO MOV Propsito: Transferncia de dados entre clulas de memria, registradores e o acumulador. Sintaxe: MOV Destino,Fonte Destino o lugar para onde o dado ser movido e Fonte o lugar onde o dado est . Os diferentes movimentos de dados permitidos para esta instruo so: *Destino: memria. Fonte: acumulador *Destino: acumulador. Fonte: memria *Destino: registrador de segmento. Fonte: memria/registrador *Destino: memria/regitrador. Fonte: registrador de segmento *Destino: registrador. Fonte: registrador *Destino: registrador. Fonte: memria *Destino: memria. Fonte: registrador *Destino: registrador. Fonte: dado imediato *Destino: memria. Fonte: dado imediato Exemplo: MOV AX,0006h MOV BX,AX MOV AX,4C00h INT 21h Este pequeno programa move o valor 0006h para o registrador AX, ento ele move o contedo de AX (0006h) para o registrador BX, e finalmente move o valor 4C00h para o registrador AX para terminar a execuo com a opo 4C da interrupo 21h.

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (27 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

INSTRUES MOVS (MOVSB) (MOVSW) Propsito: Mover byte ou cadeias de palavra da fonte, endereada por SI, para o destino endereado por DI. Sintaxe: MOVS Este comando no necessita de parmetros uma vez que toma como endereo fonte o contedo do registrador SI e como destino o contedo de DI. A seguinte seqncia de instrues ilustra isso: MOV SI, OFFSET VAR1 MOV DI, OFFSET VAR2 MOVS Primeiro inicializamos os valores de SI e DI com os endereos das vari veis VAR1 e VAR2 respectivamente, ento aps a execuo de MOVS o contedo de VAR1 copiado para VAR2. As instrues MOVSB e MOVSW so usadas do mesmo modo que MOVS, a primeira move um byte e a segunda move uma palavra.

Instrues de carga. So instrues especficas para registradores, usadas para carregar bytes ou cadeias de bytes num registrador. LODS (LODSB) (LODSW) LAHF LDS LEA LES

INSTRUES LODS (LODSB) (LODSW) Propsito: Carregar cadeias de um byte ou uma palavra para o acumulador. Sintaxe:
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (28 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

LODS Esta instruo toma a cadeia encontrada no endereo especificado por SI, a carrega para o registrador AL (ou AX) e adiciona ou subtrai, dependendo do estado de DF, para SI se uma transferncia de bytes ou de palavras. MOV SI, OFFSET VAR1 LODS Na primeira linha vemos a carga do endereo de VAR1 em SI e na segunda tomado o contedo daquele local para o regiustrador AL. Os comandos LODSB e LODSW so usados do mesmo modo, o primeiro carrega um byte e o segundo uma palavra (usa todo o registrador AX).

INSTRUO LAHF Propsito: Transferir o contedo dos flags para o registrador AH. Sintaxe: LAHF Esta instruo til para verificar o estado dos flags durante a execuo do nosso programa. Os flags so deixados na seguinte ordem dentro do registrador: SF ZF ?? AF ?? PF ?? CF O "??" significa que haver um valor indefinido naqueles bits.

INSTRUO LDS Propsito: Carregar o registrador de segmento de dados. Sintaxe:

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (29 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

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

INSTRUO LEA Propsito: Carregar o endereo do operador fonte. Sintaxe: LEA destino,fonte O operador fonte deve estar localizado na memria, e seu deslocamento colocado no registrador de ndice ou ponteiro especificado no destino. Para ilustrar uma das facilidades que temos com este comando, vejamos: MOV SI,OFFSET VAR1 equivalente a: LEA SI,VAR1 muito prov vel que para o programador muito mais f cil criar programas grandes usando este ltimo formato.

INSTRUO LES Propsito: Carregar o registrador de segmento extra Sintaxe: LES destino,fonte O operador fonte deve ser uma palavra dupla na memria. O contedo da
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (30 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

palavra com endereo maior interpretado como o endereo do segmento e colocado em ES. A palavra com endereo menor o endereo do deslocamento e colocada no registrador especificado no parmetro de destino.

Instrues de manipulao da pilha. Estas instrues permitem usar a pilha para armazenar ou recuperar dados. POP POPF PUSH PUSHF

INSTRUO POP Propsito: Recuperar uma parte de informao da pilha. Sintaxe: POP destino Esta instruo transfere o ltimo valor armazenado na pilha para o operador de destino, e incrementa de 2 o registrador SP. Este incremento duplo pelo fato de que a pilha do mais alto endereo de memria para o mais baixo, e a pilha trabalha apenas com palavras, 2 bytes, logo deve ser 2 o incremento de SP, na realidade 2 est sendo subtrado do tamanho real da pilha.

INSTRUO POPF Propsito: Extrair os flags armazenados na pilha. Sintaxe: POPF

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (31 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

Este comando transfere os bits da palavra armazenada na parte mais alta da pilha para registrador de flag. O modo da transferncia como se segue: BIT 0 2 4 6 7 8 9 10 11 FLAG CF PF AF ZF SF TF IF DF OF

Os locais dos bits so os mesmos para o uso da instruo PUSHF. Uma vez feita a transferncia o registrador SP incrementado de 2, conforme vimos anteriormente.

INSTRUO PUSH Propsito: Coloca uma palavra na pilha. Sintaxe: PUSH fonte A instruo PUSH decrementa de dois o valor de SP e ento transfere o contedo do operador fonte para o novo endereo desultante no registrador recm modificado. O decremento no endereo duplo pelo fato de que quando os valores so adicionados pilha, que cresce do maior para o menor endereo, logo quando subramos de 2 o registrador SP o que fazemos incrementar o tamanho da pilha em dois bytes, que a nica quantidade de informao que a pilha pode manusear em cada entrada e sada.

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (32 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

INSTRUO PUSHF Propsito: Colocar os valores dos flags na pilha. Sintaxe: PUSHF Este comando decrementa de 2 o valor do registrador SP e ento o contedo do registrador de flag transferido para a pilha, no endereo indicado por SP. Os flags so armazenados na memria da mesma forma que o comando POPF.

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

4.2. Instrues lgicas e aritmticas Contedo: 4.2.1.Instrues lgicas 4.2.2.Instrues aritmticas

4.2.1.Instrues lgicas So usadas para realizar operaes lgicas nos operadores. AND NEG NOT OR TEST XOR

INSTRUO AND Propsito: Realiza a conjuno de operadores bit a bit. Sintaxe:


file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (33 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

AND destino,fonte Com esta instruo a operao lgica "y" para ambos os operadores usada como na tabela: Fonte Destino | Destino ----------------------------1 1 | 1 1 0 | 0 0 1 | 0 0 0 | 0 O resultado desta operao armazenado no operador de destino.

INSTRUO NEG Propsito: Gera o complemento de 2. Sintaxe: NEG destino Esta instruo gera o complemento de 2 do operador destino e o armazena no mesmo operador. Por exemplo, if AX armazena o valor 1234H, ento: NEG AX Isto far com o que o valor EDCCH fque armazenado no registrador AX.

INSTRUO NOT Propsito: Faz a negao do operador de destino bit a bit. Sintaxe: NOT destino O resultado armazenado no mesmo operador de destino.

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (34 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

INSTRUO OR Propsito: Realiza um OU lgico. Sintaxe: OR destino,fonte A instruo OR, faz uma disjuno lgica bit a bit dos dois operadores: Fonte Destino | Destino ----------------------------------1 1 | 1 1 0 | 1 0 1 | 1 0 0 | 0

INSTRUO TEST Propsito: Compara logicamente os operadores. Sintaxe: TEST destino,fonte Realiza uma conjuno, bit a bit, dos operadores, mas difere da instruo AND, uma vez que no coloca o resultado no operador de destino. Tem efeito sobre o registrador de flag.

INSTRUO XOR Propsito: Realiza um OU exclusivo. Sintaxe: XOR destino,fonte

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (35 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

Esta instruo realizxa uma disjuno exclusiva de dois operadores bit a bit. Fonte Destino | Destino ----------------------------------1 1 | 0 0 0 | 1 0 1 | 1 0 0 | 0

4.2.2.Instrues aritmticas. So usadas para realizar operaes aritmticas nos operadores. ADC ADD DIV IDIV MUL IMUL SBB SUB

INSTRUO ADC Propsito: Efetuar a soma entre dois operandos com carry. Sintaxe: ADC destino,fonte Esta instruo efetua a soma entre dois operandos, mais o valor do flag CF, existente antes da operao. Apenas o operando destino e os flags so afetados. O resultado armazenado no operador de destino.

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (36 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

INSTRUO ADD Propsito: Adio de dois operadores. Sintaxe: ADD destino,fonte Esta instruo adiciona dois operadores e armazena o resultado no operador destino.

INSTRUO DIV Propsito: Diviso sem sinal. Sintaxe: DIV fonte O divisor pode ser um byte ou uma palavra e o operador que dado na instruo. Se o divisor de 8 bits, o registrador AX de 16 bits tomado como dividendo e se o divisor de 16 bits, o par de registradores DX:AX ser tomado como dividendo, tomando a palavra alta de DX e a baixa de AX. Se o divisor for um byte, ento o quociente ser armazenado no registrador AL e o resto em AH. Se for uma palavra, ento o quociente armazenado em AX e o resto em DX.

INSTRUO IDIV Propsito: Diviso com sinal. Sintaxe: IDIV fonte Consiste basicamente como a instruo DIV, diferencia-se apenas por realizar
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (37 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

a operao com sinal. Para os resultados so usados os mesmos registradores da instruo DIV.

INSTRUO MUL Propsito: Multiplicao com sinal. Sintaxe: MUL fonte Esta instruo realiza uma multiplicao no sinalizada entre o contedo do acumulador AL ou AX pelo operando-fonte, devolvendo o resultado no acumulador AX caso a operao tenha envolvido AL com um operando de 8 bits, ou em DX e AX caso a operao tenha envolvido AX e um operando de 16 bits.

INSTRUO IMUL Propsito: Multiplico de dois nmeros inteiros com sinal. Sintaxe: IMUL fonte Esta instruo faz o mesmo que a anterior, difere apenas pela incluso do sinal. Os resultados so mantidos nos mesmos registradores usados pela instruo MUL.

INSTRUO SBB Propsito: Subtrao com carry. Sintaxe:

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (38 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

SBB destino,fonte Esta instruo subtrai os operadores e subtrai um do resultado se CF est ativado. O operador fonte sempre subtrado do destino. Este tipo de subtrao usado quando se trabalha com quantidades de 32 bits.

INSTRUO SUB Propsito: Subtrao. Sintaxe: SUB destino,fonte Esta instruo subtrai o operador fonte do destino.

--------------- // --------------4.3.Instrues de controle de processos Contedo: 4.3.1.Instrues de salto 4.3.2.Instrues de laos: loop 4.3.3.Instrues de contagem 4.3.4.Instrues de comparao 4.3.5.Instrues de flag

4.3.1.Instrues de salto. Usadas para transferir o processo de execuo do programa para o operador indicado. JMP JA (JNBE) JAE (JNBE)
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (39 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

JB (JNAE) JBE (JNA) JE (JZ) JNE (JNZ) JG (JNLE) JGE (JNL) JL (JNGE) JLE (JNG) JC JNC JNO JNP (JPO) JNS JO JP (JPE) JS

INSTRUO JMP Propsito: Salto incondicional. Sintaxe: JMP destino Esta instruo usada par adesviar o curso do programa sem tomar em conta as condies atuais dos flags ou dos dados.

INSTRUO JA (JNBE) Propsito: Salto condicional. Sintaxe: JA smbolo Aps uma comparao este comando salta se no igual. Isto quer dizer que o salto s feito se o flag CF ou o flag ZF esto
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (40 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

desativados, ou seja, se um dos dois for zero.

INSTRUO JAE (JNB) Propsito: Salto condicional. Sintaxe: JAE smbolo A instruo salta se est up, se est equal ou se est not down. O salto feito se CF est desativado.

INSTRUO JB (JNAE) Propsito: Salto condicional. Sintaxe: JB smbolo A instruo salta se est down, se est not up ou se est equal. O salto feito se CF est ativado.

INSTRUO JBE (JNA) Propsito: Salto condicional. Sintaxe: JBE smbolo A instruo salta se est down, se est equal ou se est not up. O salto feito se CF ou ZF esto ativados, ou seja, se um deles for 1.
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (41 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

INSTRUO JE (JZ) Propsito: Salto condicional. Sintaxe: JE smbolo A instruo salta se est equal ou se est zero. O salto feito se ZF est ativado.

INSTRUO JNE (JNZ) Propsito: Salto condicional. Sintaxe: JNE smbolo A instruo salta se est not equal ou se est zero. O salto feito se ZF est desativado.

INSTRUO JG (JNLE) Propsito: Salto condicional, e o sinal tomado. Sintaxe: JG smbolo A instruo salta se est larger, se est not larger ou se est equal. O salto ocorre se ZF = 0 ou se OF = SF.

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (42 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

INSTRUO JGE (JNL) Propsito: Salto condicional, e o sinal tomado. Sintaxe: JGE smbolo A instruo salta se est larger, se est less than ou se est equal. O salto feito se SF = OF.

INSTRUO JL (JNGE) Propsito: Salto condicional, e o sinal tomado. Sintaxe: JL smbolo A instruo salta se est less than, se est not larger than ou se est equal. O salto feito se SF diferente de OF.

INSTRUO JLE (JNG) Propsito: Salto condicional, e o sinal tomado. Sintaxe: JLE smbolo A instruo salta se est less than, se est equal ou se est not larger. O salto feito se ZF = 1 ou se SF diferente de OF.

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (43 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

INSTRUO JC Propsito: Salto condicional, e os flags so tomados. Sintaxe: JC smbolo A instruo salta se h carry. O salto feito se CF = 1.

INSTRUO JNC Propsito: Salto condicional, e o estado dos flags tomado. Sintaxe: JNC smbolo A instruo salta se no h carry. O salto feito se CF = 0.

INSTRUO JNO Propsito: Salto condicional, e o estado dos flags tomado. Sintaxe: JNO smbolo A instruo salta se no h overflow O salto feito se OF = 0.

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (44 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

INSTRUO JNP (JPO) Propsito: Salto condicional, e o estado dos flags tomado. Sintaxe: JNP smbolo A instruo salta se no h paridade ou se a paridade mpar. O salto feito se PF = 0.

INSTRUO JNS Propsito: Salto condicional, e o estado dos flags tomado. Sintaxe: JNP smbolo A instruo salta se o sinal est desativado. O salto feito se SF = 0.

INSTRUO JO Propsito: Salto condicional, e o estado dos flags tomado. Sintaxe: JO smbolo A instruo salta se h overflow. O salto feito se OF = 1.

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (45 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

INSTRUO JP (JPE) Propsito: Salto condicional, e o estado dos flags tomado. Sintaxe: JP smbolo A instruo salta se h paridade ou se a paridade par. O salto feito se PF = 1.

INSTRUO JS Propsito: Salto condicional, e o estado dos flags tomado. Sintaxe: JS smbolo A instruo salta se o sinal est ativado. O salto feito se SF =1.

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

4.3.2.Instrues para laos: LOOP. Estas instrues transferem a execuo do processo, condicional ou incondicionalmente, para um destino, repetindo a ao at o contador ser zero. LOOP LOOPE LOOPNE

INSTRUO LOOP
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (46 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

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

INSTRUO LOOPE Propsito: Gerar um lao no programa, considerando o estado de ZF. Sintaxe: LOOPE smbolo Esta instruo decrementa CX de 1. Se CX diferente de zero e ZF igual a 1, ento a execuo do programa transferida para o smbolo indicado como operador.

INSTRUO LOOPNE Propsito: Gerar um lao no programa, considerando o estado de ZF. Sintaxe: LOOPNE smbolo Esta instruo decrementa CX de 1 e transfere a execuo do programa apenas se ZF diferente de 0.

--------------- // --------------4.3.3.Instrues contadoras.

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (47 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

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

DEC INSTRUCTION Propsito: Decrementar o operador. Sintaxe: DEC destino Esta instruo subtrai 1 do operador destino e armazena o novo valor no mesmo operador.

INSTRUO INC Propsito: Incrementar o operador. Sintaxe: INC destino Esta instruo adiciona 1 ao operador destino e mantm o resultado no mesmo operador.

--------------- // --------------4.3.4.Instrues de comparao. Estas instrues so usadas para comparar os operadores, e elas afetam o contedo dos flags. CMP CMPS (CMPSB) (CMPSW)

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (48 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

INSTRUO CMP Propsito: Comparar os operadores. Sintaxe: CMP destino,fonte Esta instruo subtrai o operador fonte do destino, mas no armazena o resultado da operao, apenas afeta o estado dos flags.

INSTRUO CMPS (CMPSB) (CMPSW) Propsito: Comparar cadeias de um byte ou uma palavra. Sintaxe: CMP destino,fonte Esta instruo compara efetuando uma subtrao entre o byte ou palavra endereado por DI, dentro do segmento extra de dados, e o byte ou palavra endereado por SI dentro do segmento de dados, afetando o registrador de flags, mas sem devolver o resultado da subtrao. A instruo automaticamente incrementa ou decrementa os registradores de ndice SI e DI, dependendo do valor do flag DF, de modo a indicar os prximos dois elementos a serem comparados. O valor de incremento ou decremento uma de uma ou duas unidades, dependendo da natureza da operao. Diante desta instruo, pode-se usar um prefixo para repetio, de modo a comparar dois blocos de memria entre si, repetindo a instruo de comparao at que ambos se tornem iguais ou desiguais.

--------------- // --------------4.3.5.Instrues de flag.


file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (49 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

Estas instrues afetam diretamente o contedo dos flags. CLC CLD CLI CMC STC STD STI

INSTRUO CLC Propsito: Limpar o flag de carry. Sintaxe: CLC Esta instruo desliga o bit correspondente ao flag de carry. Em outras palavras, ela o ajusta para zero.

INSTRUO CLD Propsito: Limpar o flag de endereo. Sintaxe: CLD Esta instruo desliga o bit correspondente ao flag de endereo.

INSTRUO CLI Propsito: Limpar o flag de interrupo. Sintaxe:


file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (50 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

CLI Esta instruo desliga o flag de interrupes, desabilitando, deste modo, interrupes mascar veis. Uma interrupo mascar vel aquela cujas funes so desativadas quando IF=0.

INSTRUO CMC Propsito: Complementar o flag de carry. Sintaxe: CMC Esta instruo complementa o estado do flag CF. Se CF = 0 a instruo o iguala a 1. Se CF = 1, a instruo o iguala a 0. Poderamos dizer que ela apenas inverte o valor do flag.

INSTRUO STC Propsito: Ativar o flag de carry. Sintaxe: STC Esta instruo ajusta para 1 o flag CF.

INSTRUO STD Propsito: Ativar o flag de endereo. Sintaxe:


file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (51 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

STD Esta instruo ajusta para 1 o flag DF.

INSTRUO STI Propsito: Ativar o flag de insterrupo. Sintaxe: STI Esta instruo ativa o flag IF, e habilita interrupes externas mascar veis (que s funcionam quando IF = 1).

***************************************************************************** CAPTULO 5: INTERRUPES E GERNCIA DE ARQUIVOS

Contedo: 5.1.Interrupes 5.2.Gerenciamento de arquivos --------------- // --------------Contedo 5.1.1.Interrupes de hardware interno 5.1.2.Interrupes de hardware externo 5.1.3.Interrupes de software 5.1.4.Interrupes mais comuns

5.1.1.Interrupes de hardware interno Interrupes internas so geradas por certos eventos que ocorrem durante a
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (52 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

execuo de um programa. Este tipo de interrupes so gerenciadas, na sua totalidade, pelo hardware e no possvel modific -las. Um exemplo claro deste tipo de interrupes a que atualiza o contador do clock interno do computador, o hardware chama esta interrupo muitas vezes durante um segundo. No nos permitido gerenciar diretamente esta interrupo, uma vez que no se pode controlar a hora atualizada por software. Mas podemos usar seus efeitos no computador para o nosso benefcio, por exemplo para criar um virtual clock atualizado continuamente pelo contador interno de clock. Para tanto, precisamos apenas ler o valor atual do contador e o transformar num formato compreensvel pelo usu rio.

--------------- // --------------5.1.2.Interrupes de hardware externo Interrupes externas so geradas atravs de dispositivos perifricos, tais como teclados, impressoras, placas de comunicao, entre outros. So tambm geradas por co-processadores. No possvel desativar interrupes externas. Estas interrupes no so enviadas diretamente para a CPU, mas, de uma forma melhor, so enviadas para um circuito integrado cuja funo exclusiva manusear este tipo de interrupo. O circuito, chamado PIC8259A, controlado pela CPU atravs de uma srie de comunicao chamada paths.

--------------- // --------------5.1.3.Interrupes de software Interrupes de software podem ser ativadas diretamente por nossos programas assembly, invocando o nmero da interrupo desejada com a instruo INT. O uso das interrupes facilita muito a criao dos programas, torna-os menores. Alm disso, f cil compreend-las e geram boa performance.
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (53 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

Este tipo de interrupes podem ser separadas em duas categorias: Interrupes do Sistema Operacional DOS e interrupes do BIOS. A diferena entre ambas que as interrupes do sistema operacional so mais f ceis de usar, mas tambm so mais lentas, uma vez que acessam os servios do BIOS. Por outro lado, interrupes do BIOS so muito mais r pidas, mas possuem a desvantagem de serem parte do hardware, o que significa serem especficas arquitetura do computador em questo. A escolha sobre qual o tipo de interrupo usar ir depender somente das caractersticas que voc deseja dar ao seu programa: velocidade (use BIOS), portabilidade (use DOS).

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

5.1.4.Interrupes mais comuns

Contedo 5.1.4.1.Int 21H (Interrupo do DOS) Mltiplas chamadas funes DOS. 5.1.4.2.Int 10H (Interrupo do BIOS) Entrada e Sada de Vdeo. 5.1.4.3.Int 16H (Interrupo do BIOS) Entrada e Sada do Teclado. 5.1.4.4.Int 17H (Interrupo do BIOS) Entrada e Sada da Impressora.

--------------- // --------------5.1.4.1.Interrupo 21H Propsito: Chamar uma diversidade de funes DOS. Sintaxe:
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (54 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

Int 21H Nota: Quando trabalhamos com o programa TASM necess rio especificar que o valor que estamos usando est em hexadecimal. Esta interrupo tem muitas funes, para acessar cada uma delas necess rio que o nmero correspondente da funo esteja no registrador AH no momento da chamada da interrupo. Funes para mostrar informaes no vdeo. 02H Exibe um caracter 09H Exibe uma cadeia de caracteres 40H Escreve num dispositivo/arquivo Funes para ler informaes do teclado. 01H Entrada do teclado 0AH Entrada do teclado usando buffer 3FH Leitura de um dispositivo/arquivo Funes para trabalhar com arquivos. Nesta seo so apenas especificadas as tarefas de cada funo, para uma referncia acerca dos conceitos usados, veja Introduo ao gerenciamento de arquivos. Mtodo FCB 0FH Abertura de arquivo 14H Leitura seqencial 15H Escrita seqencial 16H Criao de arquivo 21H Leitura randmica 22H Escrita randmica Handles 3CH Criao de arquivo 3DH Abertura de arquivo 3EH Fechamento de arquivo 3FH Leitura de arquivo/dispositivo
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (55 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

40H Escrita de arquivo/dispositivo 42H Move ponteiro de leitura/escrita num arquivo

FUNO 02H Uso: Mostra um caracter na tela. Registradores de chamada: AH = 02H DL = Valor de caracter a ser mostrado. Registradores de retorno: Nenhum. Esta funo mostra o caracter cujo cdigo hexadecimal corresponde ao valor armazenado no registrador DL, e no modifica nenhum registrador. O uso da funo 40H recomendado ao invs desta funo.

FUNO 09H Uso: Mostra uma cadeia de caracteres na tela. Registradores de chamada: AH = 09H DS:DX = Endereo de incio da cadeia de caracteres. Registradores de retorno: Nenhum. Esta funo mostra os caracteres, um por um, a partir do endereo indicado
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (56 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

nos registradores DS:DX at encontrar um caracter $, que interpretado como fim da cadeia. recomendado usar a funo 40H ao invs desta.

FUNO 40H Uso: Escrever num dispositivo ou num arquivo. Registradores de chamada: AH = 40H BX = Nmero do handle CX = Quantidade de bytes a gravar DS:DX = rea onde est o dado Registradores de retorno: CF = 0 se no houve erro AX = Nmero de bytes escrito CF = 1 se houve erro AX = Cdigo de erro Para usar esta funo para mostrar a informao na tela, faa o registrador BX ser igual a 1, que o valor default para o vdeo no DOS.

FUNO 01H Uso: Ler um caracter do teclado e mostr -lo. Registradores de chamada

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (57 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

AH = 01H Registradores de retorno: AL = Caracter lido muito f cil ler um caracter do teclado com esta funo, o cdigo hexadecimal do caracter lido armazenado no registrador AL. Nos caso de teclas especiais, como as de funo F1, F2, alm de outras, o registrador AL conter o valor 1, sendo necess rio chamar a funo novamente para obter o cdigo daquele caracter.

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

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (58 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

FUNO 3FH Uso: Ler informao de um dispositivo ou de um arquivo. Registradores de chamada: AH = 3FH BX = Nmero do handle CX = Nmero de bytes a ler DS:DX = rea para receber o dado Registradores de retorno: CF = 0 se no h erro e AX = nmero de bytes lidos. CF = 1 se h erro e AX conter o cdigo de erro.

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

FUNO 14H Uso: Leitura sequencial num arquivo FCB.

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (59 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

Registradores de chamada: AH = 14H DS:DX = Ponteiro para um FCB j aberto. Registradores de retorno: AL = 0 se no h erros, de outra forma o cdigo correspondente de erro retornar : 1 erro no fim do arquivo, 2 erro na estrutura FCB e 3 erro de leitura parcial. O que esta funo faz ler o prximo bloco de informaes do endereo dado por DS:DX, e atualizar este registro.

FUNO 15H Uso: Escrita sequencial e arquivo FCB. Registradores de chamada: AH = 15H DS:DX = Ponteiro para um FCB ja aberto. Registradores de retorno: AL = 00H se no h erros, de outra forma conter o cdigo de erro: 1 disco cheio ou arquivo somente de leitura, 2 erro na formao ou na especificao do FCB. A funo 15H atualiza o FCB aps a escrita do registro para o presente bloco.

FUNO 16H Uso: Criar um arquivo FCB. Registradores de chamada: AH = 16H


file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (60 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

DS:DX = Ponteiro para um FCB j aberto. Registradores de retorno: AL = 00H se no h erros, de outra forma conter o valor 0FFH. baseada na informao advinda de um FCB para criar um arquivo num disco.

FUNO 21H Uso: Ler de modo randmico um arquivo FCB. Registradores de chamada: AH = 21H DS:DX = Ponteiro para FCB aberto. Registradores de retorno: A = 00H se no h erro, de outra forma AH conter o cdigo de erro: 1 se o fim do arquivo, 2 se h um erro de especificao no FCB e 3 se um registro foi lido parcialmente ou o ponteiro de arquivo est no fim do mesmo. Esta funo l o registro especificado pelos campos do bloco atual e registro de um FCB aberto e coloca a informao na DTA, rea de Transferncia do Disco.

FUNO 22H Uso: Escrita randmica num arquivo FCB. Registradores de chamada: AH = 22H DS:DX = Ponteiro para um FCB aberto.
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (61 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

Registradores de retorno: AL = 00H se no h erro, de outra forma conter o cdigo de erro: 1 se o disco est cheio ou o arquivo apenas de leitura e 2 se h um erro na especificao FCB. Escreve o registro especificado pelos campos do bloco atual e registro de um FCB aberto. Esta informao do contedo da DTA.

FUNO 3CH Uso: Criar um arquivo se no existe ou deix -lo com compirmento 0 se existe. Registradores de chamada: AH = 3CH CH = Atributo do arquivo DS:DX = Nome do arquivo, no formato ASCII. Registradores de retorno: CF = 0 e AX informa o nmero do handle se no h erro. Se caso houver erro, CF ser 1 e AX conter o cdigo de erro: 3 caminho no encontrado, 4 no h handles disponveis e 5 acesso negado. Esta funo substitui a funo 16H. O nome do arquivo especificado numa cadeia ASCII de bytes terminados pelo caracter 0. O arquivo criado conter os atributos definidos no registrador CX, do seguinte modo: Valor 00H 02H 04H 06H Atributos Normal Hidden System Hidden e System

O arquivo criado com permisso de leitura e escrita. No possvel a criao de diretrios atravs desta funo.
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (62 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

FUNO 3DH Uso: Abre um arquivo e retorna um handle. Registradores de chamada: AH = 3DH AL = modo de acesso DS:DX = Nome do arquivo, no formato ASCII. Registradores de retorno: CF = 0 e AX = nmero do handle se no h erros, de outra forma CF = 1 e AX = cdigo de erro: 01H se a funo no v lida, 02H se o arquivo no foi encontrado, 03H se o caminho no foi encontrado, 04H se no h handles disponveis, 05H acesso negado, e 0CH se o cdigo de acesso no v lido. O handle retornado de 16 bits. O cdigo de acesso especificado da seguinte maneira: BITS 7 6 5 4 3 2 1 . . . . . . . . . . . . . 0 . 0 . 0 x . 0 0 0 1 1 0 . . Apenas leitura Apenas escrita Leitura/Escrita RESERVADO

FUNO 3EH Uso: Fecha um arquivo (handle). Registradores de chamada:


file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (63 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

AH = 3EH BX = Nmero do handle associado Registradores de retorno: CF = 0 se no h erros, ou CF ser 1 e AX conter o cdigo de erro: 06H se o handle inv lido. Esta funo atualiza o arquivo e libera o handle que estava usando. FUNO 3FH Uso: Ler uma quantidade especfica de bytes de um arquivo aberto e armazen -los num buffer especfico.

--------------- // --------------5.1.4.2.Interrupo 10h Propsito: Chamar uma diversidade de funes do BIOS Sintaxe: Int 10H Esta interrupo tem v rias funes, todas para entrada e sada de vdeo. Para acessar cada uma delas necess rio colocar o nmero da funo correspondente no registrador AH. Veremos apenas as funes mais comuns da interrupo 10H. Funo 02H, seleciona a posio do cursor Funo 09H, exibe um caracter e o atributo na posio do cursor Funo 0AH, exibe um caracter na posio do cursor Funo 0EH, modo alfanumrico de exibio de caracteres

Funo 02h

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (64 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

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

Funo 09h Uso: Mostra um determinado caracter v rias vezes na tela do computador com um atributo definido, iniciando pela posio atual do cursor. Registradores de chamada: AH = 09H AL = Caracter a exibir BH = P gina de vdeo, onde o caracter ser mostrado BL = Atributo do caracter CX = Nmero de repeties. Registradores de retorno: Nenhum

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (65 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

Esta funo mostra um caracter na tela v rias vezes, de acordo com o nmero especificado no registrador CX, mas sem mudar a posio do cursor na tela.

Funo 0Ah Uso: Exibe um caracter na posio atual do cursor. Registradores de chamada: AH = 0AH AL = Caracter a exibir BH = P gina de vdeo onde o caracter ser exibido BL = Cor do caracter (apenas em modo gr fico) CX = Nmero de repeties Registradores de retorno: Nenhum. A principal diferena entre esta funo e a anterior permitir mudana nos atributos, bem como mudar a posio do cursor.

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

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (66 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

Nenhum

--------------- // --------------5.1.4.3.Interrupo 16H Veremos duas funes da interrupo 16H. A exemplo das demais interrupes, usa-se o registrador AH para cham -las.

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

Funo 01h

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (67 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

Uso: Ler o estado do teclado Registradores de chamada: AH = 01H Registradores de retorno: Se o registrador de flag zero, significa que h informao no buffer de teclado na memria. Caso contr rio, o buffer est vazio. Portanto o valor do registrador AH ser o valor da tecla armazenada no buffer.

--------------- // --------------5.1.4.4.Interrupo 17H Propsito: Manusear a entrada e sada da impressora. Sintaxe: Int 17H Esta interrupo usada para enviar caracteres, setar ou ler o estado de uma impressora. Funes da interrupo 17h Funo 00H, imprime um valor ASCII Funo 01H, seta a impressora Funo 02H, l estado da impressora Funo 00H Uso: Imprimir um caracter numa impressora. Registradores de chamada: AH = 00H
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (68 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

AL = Caracter a imprimir DX = Porta de conexo Registradores de retorno: AH = Estado da impressora Os valores da porta a colocar no registrador DX so: LPT1 = 0, LPT2 = 1, LPT3 = 2 ... O estado da impressora codificado bit a bit como segue: BIT 1/0 SIGNIFICADO ---------------------------------------0 1 Estado de time-out 123 1 Erro de entrada e sada 4 1 Impressora selecionada 5 1 Fim de papel 6 1 Reconhecimento de comunicao 7 1 A impressora est pronta para o uso Os bits 1 e 2 bits no so relevantes A maioria dos BIOS suportam 3 portas paralelas, havendo alguns que suportam 4. Funo 01h Uso: Setar uma porta paralela. Registradores de chamada: AH = 01H DX = Porta Registradores de retorno: AH = Status da impressora
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (69 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

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 123 1 Erro de entrada e sada 4 1 Impressora selecionada 5 1 Fim de papel 6 1 Reconhecimento de comunicao 7 1 A impressora est pronta para o uso Os bits 1 e 2 bits no so relevantes Funo 02h Uso: Obter o status da impressora. Registradores de chamada: AH = 01H DX = Porta Registradores de retorno AH = Status da impressora A porta definida no registrador DX pode ser: LPT1=0, LPT2=1, assim por diante. O estado da impressora codificado bit a bit como segue: BIT 1/0 SIGNIFICADO ---------------------------------------0 1 Estado de time-out 1file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (70 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

23 1 Erro de entrada e sada 4 1 Impressora selecionada 5 1 Fim de papel 6 1 Reconhecimento de comunicao 7 1 A impressora est pronta para o uso Os bits 1 e 2 bits no so relevantes

--------------- // --------------5.2. Gerenciamento de Arquivos Contedo: 5.2.1.Modos de trabalhar com arquivos 5.2.2.Mtodo FCB 5.2.3.Mtodos de canais de comunicao

5.2.1.Modos de trabalhar com arquivos. H dois modos de trabalhar com arquivos. O primeiro atravs de FCB ( blocos de controle de arquivo), o segundo atravs de canais de comunicao, tambm conhecidos como handles. O primeiro modo de manusear arquivos tem sido usado desde o sistema operacional CPM, predecessor do DOS, logo permite certas compatibilidades com muitos arquivos velhos do CPM bem como com a verso 1.0 do DOS, alm deste mtodo permitir-nos ter um nmero ilimitado de arquivos abertos ao mesmo tempo. Se voc quiser criar um volume para o disco, a nica forma atravs deste mtodo. Depois de considerarmos as vantagens de FCB, o uso do mtodo de Canais de Comunicao muito simples e permite-nos um melhor manuseio de erros. Para uma melhor facilidade, daqui por diante nos referiremos aos Blocos de Controle de Arquivo como FCBs e aos Canais de Comunicao como handles.

--------------- // --------------file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (71 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

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

--------------- // --------------5.2.2.1.INTRODUO H dois tipos de FCB, o normal, cujo comprimento 37 bytes, e o extendido, com 44 bytes. Neste tutorial iremos assumir o primeiro, ou seja, quando falarmos em FCB, estaremos fazendo referncia ao tipo normal (37 bytes). O FCB composto de informaes dadas pelo programador e por informaes que ele toma diretamente do sistema operacional. Quando estes tipos de arquivos so usados, s possvel se trabalhar no diretrio corrente, pois FCBs no fornecem suporte ao sistema de organizao de arquivos atravs de diretrios do DOS. FCB composto pelos seguintes campos: POSIO 00H 01H 09H 0CH 0EH 10H 14H 16H 18H 20H 21H COMPRIMENTO SIGNIFICADO 1 Byte Drive 8 Bytes Nome do arquivo 3 Bytes Extenso 2 Bytes Nmero do bloco 2 Bytes Tamanho do registro 4 Bytes Tamanho do arquivo 2 Bytes Data de criao 2 Bytes Hora de criao 8 Bytes Reservado 1 Bytes Registro corrente 4 Bytes Registro randmico

Para selecionar o drive de trabalho, assuma: drive A = 1; drive B = 2; etc. Se for usado 0, o drive que est sendo usado no momento ser tomado como
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (72 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

opo. O nome do arquivo deve ser justificado esquerda e necess rio preencher com espaos os bytes remanescentes, a extenso colocada do mesmo modo. O bloco corrente e o registro corrente dizem ao computador que registro ser acessado nas operaes de leitura e escrita. Um bloco um grupo de 128 registros. O primeiro bloco de arquivo o bloco 0. O primeiro registro o registro 0, logo o ltimo registro do primeiro bloco deve ser o 127, uma vez que a numerao iniciada com 0 e o bloco pode conter 128 registradores no total. --------------- // --------------5.2.2.2.ABERTURA DE ARQUIVO Para abrir um arquivo FCB usada a funo 0FH da interrupo 21h. A unidade, o nome e a extenso do arquivo devem ser inicializadas antes da abertura. O registrador DX deve apontar para o bloco. Se o valor FFH retornado no registrador AH quando da chamada da interrupo, ento o arquivo no foi encontrado. Se tudo der certo, o valor 0 retornado. Se o arquivo aberto, ento o DOS inicializa o bloco corrente em 0, o tamanho do registro para 128 bytes. O tamanho do arquivo e a sua data so preenchidos com as informaes encontradas no diretrio. --------------- // --------------5.2.2.3.CRIAR UM NOVO ARQUIVO Para a criao de arquivos usada a funo 16H da interrupo 21h. O registrador DX deve apontar para uma estrutura de controle cujo os requisitos so de que pelo menos a unidade lgica, o nome e a extenso do arquivo sejam definidas. Caso ocorra problema, o valor FFH deve retornar em AL, de outra forma este registrador conter o valor 0. --------------- // ---------------

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (73 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

5.2.2.4.ESCRITA SEQENCIAL Antes de conseguirmos realizar escrita para o disco, necess rio definir a rea de transferncia de dados usando, para tanto, a funo 1AH da interrupo 21h. A funo 1AH no retorna qualquer estado do disco nem da operao. Mas a funo 15H, que usaremos para escrever para o disco, faz isso no registrador AL. Se este for igual a zero, ento no h erro e os campos de registro corrente e de bloco so atualizados.

--------------- // --------------5.2.2.5.LEITURA SEQENCIAL Antes de tudo, devemos definir a rea de transferncia de arquivo ou DTA. Para a leitura seqencial usaremos a funo 14H da interrupo 21h. O registro a ser lido definido pelos campos registro e bloco corrente. O registrador AL retorna o estado da operao. Se AL contm o valor 1 ou 3, significa que foi atingido o fim do arquivo. Um valor 2, por sua vez, significa que o FCB est estruturado erroneamente. Caso no ocorra erro, AL conter o valor 0 e os campos de registro e bloco corrente so atualizados. --------------- // --------------5.2.2.6.LEITURA E ESCRITA RANDMICA A funo 21H e a funo 22H da insterrupo 21h so usadas realizao, respectivamente, da escrita e leitura randmica. O nmero de registro randmico e o bloco corrente so usados para calcular a posio relativa do registro a ser lido ou escrito. O registrador AL retorna a mesma informao do que par a escrita e leitura seqencial. A informao a ser lida ser retornada na rea de transferncia do disco, bem como a informao a ser escrita retorna na DTA. --------------- // ---------------

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (74 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

5.2.2.7.FECHAR UM ARQUIVO Para fechar um arquivo usamos a funo 10H da interrupo 21h. Se aps invocar esta funo, o regisatrador AL conter o valor FFH, significa que o arquivo foi mudado de posio, o disco foi mudado ou h erro de acesso a disco. --------------- // --------------5.2.3.Canais de comunicao. 5.2.3.1.Trabalhando com handles 5.2.3.2.Funes para usar handles

5.2.3.1.TRABALHANDO COM HANDLES O uso de handles para gerenciar arquivos traz grandes facilidades na criao de arquivos e o programador pode concentrar-se em outros aspectos da programao sem preocupar-se com detalhes que podem ser manuseados pelo sistema operacional. A facilidade dos handles consiste em que para operarmos sobre um arquivo apenas necess rio definirmos o nome do mesmo e o nmero de handle a usar, todo o resto da informao manuseada internamente pelo DOS. Quando usamos este mtodo para trabalhar com arquivos, no h distino entre acesso seqencial ou randmico, o arquivo simplesmente tomado como uma rede de bytes. --------------- // --------------5.2.3.2.FUNES PARA USAR HANDLES As funes usadas para o manuseio de arquivos atravs de handles so descritas na p gina sobre: Interrupes, na seo dedicada interrupo 21h.

***************************************************************************** CAPTULO 6: MACROS E PROCEDIMENTOS

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (75 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

Contedo 6.1.Procedimentos 6.2.Macros

6.1.Procedimentos 6.1.1.Definio de procedimento 6.1.2.Sintaxe de um procedimento --------------- // --------------6.1.1.Definio de um procedimento Um procedimento uma coleo de instrues para as quais possvel direcionar o curso de nosso programa, e uma vez que a execuo destas instrues do procedimento tenha acabado, o controle retorna para linha que segue que chamou o procedimento. Procedimentos nos ajudam a criar programas legveis e f ceis de modificar. Quando se invoca um procedimento, o endereo da prxima instruo do programa mantido na pilha, de onde recuperado quando do retorno do procedimento. --------------- // --------------6.1.2.Sintaxe de um procedimento H dois tipos de procedimentos, os intrasegments, que se localizam no mesmo segmento da instruo que o chama, e os inter segments, que podem se localizar em diferentes segmentos de memria. Quando os procedimentos intrasegments so usados, o valor de IP armazenado na pilha e quando os procedimentos inter segments so usados o valor de CS:IP armazenado. Lembre-se que o registrador CS indica qual o segmento de cdigo. A diretiva que chama um procedimento como segue: CALL NomedoProcedimento

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (76 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

As partes que compem um procedimento so as seguintes: Declarao do procedimento Cdigo do procedimento Diretiva de retorno Trmino do procedimento Por exemplo, se quisermos uma rotina que soma dois bytes armazenados em AH e AL, e o resultado da soma em BX: Soma Proc Near ; Declarao do Procedimento Mov BX, 0 ; Contedo do Procedimento... Mov BL, AH Mov AH, 00 Add BX, AX Ret ; Diretiva de retorno Soma EndP ; Fim do Procedimento Na declarao, a primeira palavra, Soma, corresponde ao nome do procedimento. Proc declara-o e a palavra Near indica que o procedimento do tipo intrasegment, ou seja, no mesmo segmento. A diretiva Ret carrega IP com o endereo armazenado na pilha para retornar ao programa que chamou. Finalmente, Soma EndP indica o fim do procedimento. Para declarar um procedimento inter segment, basta substituir a palavra Near para FAR. A chamada deste procedimento feito de modo idntico: Call Soma Macros oferecem uma grande flexibilidade na programao, comparadas aos procedimentos. --------------- // --------------6.2.Macros 6.2.1.Definio de uma Macro 6.2.2.Sintaxe de uma Macro 6.2.3.Bibliotecas de Macros

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (77 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

6.2.1.Definio de uma Macro Uma macro um grupo de instrues repetitivas em um programa que so codificadas apenas uma vez e, assim, poupam espao, podendo ser utilizadas tantas vezes quantas forem necess rio. A principal diferena entre uma macro e um procedimento que numa macro possvel a passagem de parmetros e num procedimento no. No momento em que a macro executada, cada parmetro substitudo pelo nome ou valor especificado na hora da chamada. Podemos dizer, desta forma, que um procedimento uma extenso de um determinado programa, enquanto que uma macro um mdulo que especifica funes que podem ser utilizadas por diferentes programas. Uma outra diferena entre uma macro e um procedimento o modo de chamada de cada um. Para chamar um procedimento, se faz necess rio a diretiva CALL, por outro lado, para chamada de macros feita com se fosse uma instruo normal da linguagem assembly. --------------- // --------------6.2.2.Sintaxe de uma Macro As partes que compem uma macro so as seguintes: Declarao da macro Cdigo da macro Diretiva de trmino da macro A declarao da macro feita como se segue: NomeMacro MACRO [parmetro1, parmetro2...] Do mesmo modo que temos a funcionalidade dos parmetros, possvel tambm a criao de uma macro que no os possua. A diretiva de trmino da macro : ENDM Um exemplo de uma macro para colocar o cursor numa determinada posio da tela: Pos MACRO Linha, Coluna
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (78 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

PUSH AX PUSH BX PUSH DX MOV AH, 02H MOV DH, Linha MOV DL, Coluna MOV BH, 0 INT 10H POP DX POP BX POP AX ENDM Para usar uma macro basta cham -la pelo seu nome, tal como se fosse qualquer instruo na linguagem assembly: Pos 8, 6 --------------- // --------------6.2.3.Biblioteca de Macros Uma das facilidades oferecidas pelo uso de macros a criao de bibliotecas, que so grupo de macros, podendo ser includas num programa origin rias de arquivos diferentes. A criao destas bibliotecas muito simples. Criamos um arquivo com todas as macros que sero necess rias e o salvamos como um arquivo texto. Para incluir uma biblioteca num programa, basta colocar a seguinte instruo Include NomedoArquivo na parte inicial do programa, antes da declarao do modelo de memria. Supondo que o arquivo de macros tenha sido salvo com o nome de MACROS.TXT, a instruo Include seria utilizada do seguinte modo: ;Incio do programa Include MACROS.TXT .MODEL SMALL .DATA ;Os dados vo aqui .CODE Inicio:
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (79 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

;O cdigo do programa comea aqui .STACK ;A pilha declarada End Inicio ;Fim do programa

***************************************************************************** CAPTULO 7: EXEMPLOS DE PROGRAMAS

Contedo: 7.1.Exemplos de Programas com Debug 7.2.Exemplos de Programas com TASM --------------- // --------------7.1.Exemplos de Programas com Debug Nesta seo forneceremos alguns programas feitos no debug do DOS. Voc pode executar cada programa assembly usando o comando "g" (go), para ver o que cada programa faz. Procedimento Primeiro passo Carregar o programa exemplo Por exemplo: C:\>debug -n one.com -l -u 100 109 0D80:0100 B80600 0D80:0103 BB0400 0D80:0106 01D8 0D80:0108 CD20 -

MOV AX,0006 MOV BX,0004 ADD AX,BX INT 20

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (80 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

Nota: -n one.com Dar nome ao programa a ser carregado -l Carreg -lo -u 100 109 Desmontar o cdigo do endereo inicial ao final especificado Segundo passo Digite o comando g Por exemplo: -g Program terminated normally -

Exemplos de programas no Debug Primeiro exemplo -a0100 297D:0100 297D:0103 297D:0106 297D:0108

MOV AX,0006 ;Pe o valor 0006 no registrador AX MOV BX,0004 ;Pe o valor 0004 no registrador BX ADD AX,BX ;Adiciona BX ao contedo de AX INT 20 ;Finaliza o Programa

A nica coisa que este programa faz salvar dois valores em dois registradores e adicionar o valor de um ao outro. Segundo exemplo - a100 0C1B:0100 jmp 125 ;Salta para o endereo 125h
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (81 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

0C1B:0102 [Enter] - e 102 'Hello, How are you ?' 0d 0a '$' - a125 0C1B:0125 MOV DX,0102 ;Copia a string para registrador DX 0C1B:0128 MOV CX,000F ;Quantas vezes a string ser mostrada 0C1B:012B MOV AH,09 ;Copia o valor 09 para registrador AH 0C1B:012D INT 21 ;Mostra a string 0C1B:012F DEC CX ;Subtrai 1 de CX 0C1B:0130 JCXZ 0134 ;Se CX igual a 0 salta para o endereo 0134 0C1B:0132 JMP 012D ;Salta ao endereo 012D 0C1B:0134 INT 20 ;Finaliza o programa Este programa mostra 15 vezes na tela a string de caracteres. Terceiro exemplo -a100 297D:0100 297D:0102 297D:0105 297D:0107

MOV AH,01 ;Funo para mudar o cursor MOV CX,0007 ;Formata o cursor INT 10 ;Chama interrupo do BIOS INT 20 ;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 ;Funo 1 (l caractere do teclado) 21 ;Chama interrupo do DOS AL,0D ;Compara se o caractere lido um ENTER 0100 ;Se no , l um outro caractere AH,02 ;Funo 2 (escreve um caractere na tela) DL,AL ;Character to write on AL 21 ;Chama interrupo do DOS 20 ;Finaliza o programa

Este programa usa a interrupo 21h do DOS. Usa duas funes da mesma: a primeira l um caractere do teclado (funo 1) e a segundo escreve um caractere na tela. O programa l caracteres do teclado at encontrar um ENTER. Quinto exemplo

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (82 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

-a100 297D:0100 297D:0102 297D:0105 297D:0107 297D:0109 297D:010C 297D:010E 297D:0110

MOV AH,02 ;Funo 2 (escreve um caractere na tela) MOV CX,0008 ;Pe o valor 0008 no registrador CX MOV DL,00 ;Pe o valor 00 no registrador DL RCL BL,1 ;Rotaciona o byte em BL um bit para a esquerda ADC DL,30 ;Converte o registrador de flag para 1 INT 21 ;Chama interrupo do DOS LOOP 0105 ;Salta se CX > 0 para o endereo 0105 INT 20 ;Finaliza o programa

Este programa mostra na tela um nmero bin rio atravs de um ciclo condicional (LOOP) usando a rotao do byte. Sexto exemplo -a100 297D:0100 297D:0102 297D:0104 297D:0107 297D:010A 297D:010C 297D:010F 297D:0111

MOV AH,02 ;Funo 2 (escreve um caractere na tela) MOV DL,BL ;Pe o valor de BL em DL ADD DL,30 ;Adiciona o valor 30 a DL CMP DL,3A ;Compara o valor 3A com o contedo de DL sem afet -lo ;seu valor apenas modifica o estado do flag de carry JL 010F ;salta ao endereo 010f, se for menor ADD DL,07 ;Adiciona o valor 07 a DL INT 21 ;Chama interrupo do DOS INT 20 ;Finaliza o programa

Este programa imprime um valor zero em dgitos hexadecimais. Stimo exemplo -a100 297D:0100 297D:0102 297D:0104 297D:0107 297D:010A 297D:010D 297D:010F 297D:0112 297D:0114

MOV AH,02 ;Funo 2 (escreve um caractere na tela) MOV DL,BL ;Pe o valor de BL em DL AND DL,0F ;Transporta fazendo AND dos nmeros bit a bit ADD DL,30 ;Adiciona 30 a Dl CMP DL,3A ;Compara Dl com 3A JL 0112 ;Salta ao endereo 0112, se menor ADD DL,07 ;Adiciona 07 a DL INT 21 ;Chama interrupo do DOS INT 20 ;Finaliza o programa

Este programa usado para imprimir dois dgitos hexadecimais.

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (83 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

Oitavo exemplo -a100 297D:0100 297D:0102 297D:0104 297D:0106 297D:0108 297D:010B 297D:010E 297D:0110 297D:0113 297D:0115

MOV AH,02 ;Funo 2 (escreve um caractere na tela) MOV DL,BL ;Pe o valor de BL em DL MOV CL,04 ;Pe o valor 04 em CL SHR DL,CL ;Desloca os 4 bits mais altos do nmero ao nibble mais direita ADD DL,30 ;Adiciona 30 a DL CMP DL,3A ;Compara Dl com 3A JL 0113 ;Salta ao endereo 0113, se menor ADD DL,07 ;Adiciona 07 a DL INT 21 ;Chama interrupo do DOS INT 20 ;Finaliza o programa

Este programa imprime o primeiro de dois dgitos hexadecimais. Nono exemplo -a100 297D:0100 297D:0102 297D:0104 297D:0106 297D:0108 297D:010B 297D:010E 297D:0110 297D:0113 297D:0115 297D:0117 297D:011A 297D:011D 297D:0120 297D:0122 297D:0125 297D:0127

MOV AH,02 ;Funo 2 (escreve um caractere na tela) MOV DL,BL ;Pe o valor de BL em DL MOV CL,04 ;Pe o valor 04 em CL SHR DL,CL ;Desloca os 4 bits mais altos do nmero ao nibble mais direita ADD DL,30 ;Adiciona 30 a DL CMP DL,3A ;Compara Dl com 3A JL 0113 ;Salta ao endereo 0113, se menor ADD DL,07 ;Adiciona 07 a DL INT 21 ;Chama interrupo do DOS MOV DL,BL ;Pe o valor de BL em DL AND DL,0F ;Transporta fazendo AND dos nmeros bit a bit ADD DL,30 ;Adiciona 30 a DL CMP DL,3A ;Compara Dl com 3A JL 0125 ;Salta ao endereo 0125, se menor ADD DL,07 ;Adiciona 07 a DL INT 21 ;Chama interrupo do DOS INT 20 ;Finaliza o programa

Este programa imprime o segundo de dois dgitos hexadecimais. Dcimo exemplo -a100
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (84 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

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 ;Funo 1 (l caractere do teclado) 21 ;Chama interrupo do DOS DL,AL ;Pe o valor de AL em DL DL,30 ;Subtrai 30 de DL DL,09 ;Compara DL com 09 0111 ;Salta ao endereo 0111, se menor ou igual DL,07 ;Subtrai 07 de DL CL,04 ;Pe o valor 04 em CL DL,CL ;Insere zeros direita 21 ;Chama interrupo do DOS AL,30 ;Subtrai 30 de AL AL,09 ;Compara AL com 09 011F ;Salta ao endereo 011f, se menor ou igual AL,07 ;Subtrai 07 de AL DL,AL ;Adiciona AL a DL 20 ;Finaliza o programa

Este programa pode ler dois dgitos hexadecimais. Dcimo primeiro exemplo -a100 297D:0100 297D:0103 -a200 297D:0200 297D:0201 297D:0203 297D:0205 297D:0207 297D:0209 297D:020B 297D:020D 297D:020F 297D:0211 297D:0213 297D:0215 297D:0217 297D:0219 297D:021A 297D:021B 297D:021D

CALL 0200 ;Chama um procedimento INT 20 ;Finaliza o programa

PUSH DX ;Pe o valor de DX na pilha MOV AH,08 ;Funo 8 INT 21 ;Chama interrupo do DOS CMP AL,30 ;Compara AL com 30 JB 0203 ;Salta se CF ativado ao endereo 0203 CMP AL,46 ;Compara AL com 46 JA 0203 ;Salta ao endereo 0203, se diferente CMP AL,39 ;Compara AL com 39 JA 021B ;Salta ao endereo 021B, se diferente MOV AH,02 ;Funo 2 (escreve um caractere na tela) MOV DL,AL ;Pe o valor de AL em DL INT 21 ;Chama interrupo do DOS SUB AL,30 ;Subtrai 30 de AL POP DX ;Extrai o valor de DX da pilha RET ;Retorna o controle ao programa principal CMP AL,41 ;Compara AL com 41 JB 0203 ;Salta se CF ativado ao endereo 0203

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (85 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

297D:021F MOV AH,02 ;Funo 2 (escreve um caractere na tela) 297D:022 MOV DL,AL ;Pe o valor AL em DL 297D:0223 INT 21 ;Chama interrupo do DOS 297D:0225 SUB AL,37 ;Subtrai 37 de AL 297D:0227 POP DX ;Extrai o valor de DX da pilha 297D:0228 RET ;Retorna o controle ao programa principal Este programa se mantm lendo caracteres at receber um que possa ser convertido para um nmero hexadecimal.

--------------- // --------------7.2.Exemplos de Programas com TASM Nesta seo forneceremos a voc 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 Copyright (c) 1988, 1990 Borland International Assembling file: one.asm Error messages: None Warning messages: None Passes: 1 Remaining memory: 471k C:\> Isto criar um programa objeto com o mesmo nome do fonte, neste caso: one.obj Segundo passo

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (86 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

Criar o programa execut vel Por exemplo: 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 extenso 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: one.asm ; .model small .stack .code mov AH,1h ;Funo 1 do DOS Int 21h ;l o caracter e returna o cdigo ASCII ao registrador AL mov DL,AL ;move o cdigo ASCII para o registrador DL sub DL,30h ;subtrai de 30h para converter a um dgito de 0 a 9 cmp DL,9h ;compara se o dgito est entre 0 e 9 jle digit1 ;se verdadeiro obtm o primeiro nmero (4 bits) sub DL,7h ;se falso, subtrai de 7h para converter a uma letra A-F digit1: mov CL,4h ;prepara para multiplicar por 16 shl DL,CL ;multiplica para converter dentro dos 4 bits mais altos int 21h ;obtm o prximo caracter sub AL,30h ;repete a operao de converso cmp AL,9h ;compara o valor 9h com o contedo do registrador AL jle digit2 ;se verdadeiro, obtm o segundo dgito sub AL,7h ;se falso, subtrai de 7h digit2: add DL,AL ;adiciona o segundo dgito
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (87 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

mov AH,4Ch ;funo 4Ch do DOS (exit) Int 21h ;interrupo 21h End ;finaliza o programa Este programa l dois caracteres e os imprime na tela Segundo exemplo ;nome do programa: two.asm .model small .stack .code PRINT_A_J PROC MOV DL,'A' ;move o character A para o registrador DL MOV CX,10 ;move o valor decimal 10 para o registrador CX ;este valor usado para fazer lao com 10 interaes PRINT_LOOP: CALL WRITE_CHAR ;Imprime o caracter em DL INC DL ;Incrementa o valor do registrador DL LOOP PRINT_LOOP ;Lao para imprimir 10 caracteres MOV AH,4Ch ;Funo 4Ch, para sair ao DOS INT 21h ;Interrupo 21h PRINT_A_J ENDP ;Finaliza o procedimento WRITE_CHAR PROC MOV AH,2h ;Funo 2h, imprime caracter INT 21h ;Imprime o caracter que est em DL RET ;Retorna o controle ao procedimento que chamou WRITE_CHAR ENDP ;Finaliza o procedimento END PRINT_A_J ;Finaliza o programa Este programa mostra os caracteres ABCDEFGHIJ na tela. Terceiro exemplo ;nome do programa: three.asm .model small .STACK .code TEST_WRITE_HEX PROC MOV DL,3Fh ;Move o valor 3Fh para o registrador DL CALL WRITE_HEX ;Chama a sub-rotina
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (88 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

MOV AH,4CH ;Funo 4Ch INT 21h ;Retorna o controle ao DOS TEST_WRITE_HEX ENDP ;Finaliza o procedimento PUBLIC WRITE_HEX ;........................................................; ;Este procedimento converte para hexadecimal o byte ; ;armazenado no registrador DL e mostra o dgito ; ;Use:WRITE_HEX_DIGIT ; ;........................................................; WRITE_HEX PROC PUSH CX ;coloca na pilha o valor do registrador CX PUSH DX ;coloca na pilha o valor do registrador DX MOV DH,DL ;move o valor do registrador DL para o registrador DH MOV CX,4 ;move o valor 4 para o registrador CX SHR DL,CL CALL WRITE_HEX_DIGIT ;mostra na tela o primeiro nmero hexadecimal MOV DL,DH ;move o valor do registrador DH para o registrador DL AND DL,0Fh CALL WRITE_HEX_DIGIT ;mostra na tela o segundo nmero hexadecimal POP DX ;retira da pilha o valor do registrador DX POP CX ;retira da pilha o valor do registrador CX RET ;Retorna o controle ao procedimento que chamou WRITE_HEX ENDP PUBLIC WRITE_HEX_DIGIT ;......................................................................; ;Este procediento converte os 4 bits mais baixos do registrador DL ;para um nmero hexadecimal e o mostrana tela do computador ;Use: WRITE_CHAR ; ;......................................................................;

; ;

WRITE_HEX_DIGIT PROC PUSH DX ;coloca na pilha o valor de DX CMP DL,10 ;compara se o nmero de bits menor do que 10 JAE HEX_LETTER ;se no, salta para HEX_LETER ADD DL,"0" ;se sim, converte para nmero JMP Short WRITE_DIGIT ;escreve o caracter HEX_LETTER: ADD DL,"A"-10 ;converte um caracter para hexadecimal WRITE_DIGIT: CALL WRITE_CHAR ;imprime o caracter na tela
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (89 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

;Retorna o valor inicial do registrador DX ;para o registrador DL RET ;Retorna o controle ao procedimento que chamou WRITE_HEX_DIGIT ENDP PUBLIC WRITE_CHAR ;......................................................................; ;Este procedimento imprime um caracter na tela usando o D.O.S. ;......................................................................; WRITE_CHAR PROC PUSH AX ;Coloca na pilha o valor do registarador AX MOV AH,2 ;Funo 2h INT 21h ;Interrupo 21h POP AX ;Extrai da pilha o valor de AX RET ;Retorna o controle ao procedimento que chamou WRITE_CHAR ENDP END TEST_WRITE_HEX ;Finaliza o programa Quarto exemplo ;nome do programa: four.asm .model small .stack .code TEST_WRITE_DECIMAL PROC MOV DX,12345 ;Move o valor decimal 12345 para o registrador DX CALL WRITE_DECIMAL ;Chama o procedimento MOV AH,4CH ;Funo 4Ch INT 21h ;Interrupo 21h TEST_WRITE_DECIMAL ENDP ;Finaliza o procedimento PUBLIC WRITE_DECIMAL ;.................................................................; ;Este procedimento escreve um nmero de 16 bit como um nmero ;sem sinal em notao decimal ; ;Use: WRITE_HEX_DIGIT ; ;.................................................................; WRITE_DECIMAL PROC PUSH AX ;Pe na pilha o valor do registrador AX
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (90 of 95)28/09/2004 17:10:35

POP DX

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

PUSH CX ;Pe na pilha o valor do registrador CX PUSH DX ;Pe na pilha o valor do registrador DX PUSH SI ;Pe na pilha o valor do registrador SI MOV AX,DX ;move o valor do registrador DX para AX MOV SI,10 ;move o valor 10 para o registrador SI XOR CX,CX ;zera o registrador CX NON_ZERO: XOR DX,DX ;zera o registrador CX DIV SI ;divizo entre SI PUSH DX ;Pe na pilha o valor do registrador DX INC CX ;incrementa CX OR AX,AX ;no zero JNE NON_ZERO ;salta para NON_ZERO WRITE_DIGIT_LOOP: POP DX ;Retorna o valor em modo reverso CALL WRITE_HEX_DIGIT ;Chama o procedimento LOOP WRITE_DIGIT_LOOP ;loop END_DECIMAL: POP SI ;retira da pilha o valor do registrador SI POP DX ;retira da pilha o valor do registrador DX POP CX ;retira da pilha o valor do registrador CX POP AX ;retira da pilha o valor do registrador AX RET ;Retorna o controle ao procedimento que chamou WRITE_DECIMAL ENDP ;Finaliza o procedimento PUBLIC WRITE_HEX_DIGIT ;......................................................................; ; ; ;Este procedimento converte os 4 bits mais baixos do registrador DL ;num nmero hexadecimal e os imprime ; ;Use: WRITE_CHAR ; ;......................................................................;

WRITE_HEX_DIGIT PROC PUSH DX ;Pe na pilha o valor do registrador DX CMP DL,10 ;Compara o valor 10 com o valor do registrador DL JAE HEX_LETTER ;se no, salta para HEX_LETER ADD DL,"0" ;se , converte em dgito numrico JMP Short WRITE_DIGIT ;escreve o caracter HEX_LETTER: ADD DL,"A"-10 ;converte um caracter para um nmero hexadecimal WRITE_DIGIT: CALL WRITE_CHAR ;mostra o caracter na tela
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (91 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

POP DX ;Retorna o valor inicial para o registrador DL RET ;Retorna o controle ao procedimento que chamou WRITE_HEX_DIGIT ENDP PUBLIC WRITE_CHAR ;......................................................................; ;Este procedimento imprime um caracter na tela usando uma funo D.O.S.; ;......................................................................; WRITE_CHAR PROC PUSH AX ;Pe na pilha o valor do registrador AX MOV AH,2h ;Funo 2h INT 21h ;Interrupo 21h POP AX ;Retira da pilha o valor inicial do registrador AX RET ;Retorna o controle ao procedimento que chamou WRITE_CHAR ENDP END TEST_WRITE_DECIMAL ;finaliza o programa Este programa mostra na tela os nmeros 12345 Quinto exemplo ;nome do programa: five.asm .model small .stack .code PRINT_ASCII PROC MOV DL,00h ;move o valor 00h para o registrador DL MOV CX,255 ;move o valor decimal 255 para o registrador CX ;usado para fazer um lao com 255 interaes PRINT_LOOP: CALL WRITE_CHAR ;Chama o procedimento que imprime INC DL ;Incrementa o valor do registrador DL LOOP PRINT_LOOP ;Loop para imprimir 10 caracteres MOV AH,4Ch ;Funo 4Ch INT 21h ;Interrupo 21h PRINT_ASCII ENDP ;Finaliza o procedimento WRITE_CHAR PROC MOV AH,2h ;Funo 2h para imprimir um caracter INT 21h ;Imprime o caracter que est em DL
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (92 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

RET ;Retorna o controle ao procediemento que chamou WRITE_CHAR ENDP ;Finaliza o procedimento END PRINT_ASCII ;Finaliza o programa Este programa mostra na tela o valor dos 256 caracteres do cdigo ASCII.

***************************************************************************** CAPTULO 8: BIBLIOGRAFIA Crditos: Monico Briseo C., Engenheiro Idia Original Desenvolvimento e Implementao da edio 1996 Hugo Eduardo Prez P. Desenvolvimento e Implementao da edio 1995 Vctor Hugo Avila B. Verso Inglesa Jeferson Botelho do Amaral Verso Portuguesa Ana Mara Peraza Programadora de Linguagem Assembly Graciela Salcedo Mancilla Programadora Tcl/Tk Juan Olmos Monroy Designer Gr fico

Referncias Bibliogr ficas: Assembly Language For IBM Microcomputers J. Terry Godfrey
file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (93 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

Prentice Hall Hispanoamericana, S.A. Mexico Basic Assembler A. Rojas Ed Computec Editores S.A. de C.V. Mexico IBM Personal Computer Assembly Language Tutorial Joshua Auerbach Yale University Organizao Estruturada de Computadores Andrew S. Tanenbaum Prentice Hall do Brasil Guia do Programador para as Placas EGA e VGA Richard F. Ferraro Ed. Cincia Moderna Programando em Assembler 8086/8088 Jeremias R. D. Pereira dos Santos Edison Raymundi Junior McGraw-Hill Assembly IBM PC - Tcnicas de Programao Alan R. Miller EBRAS, Editora Brasileira Linguagem Assembly para IBM PC Peter Norton John Socha Editora Campus C - Caixa de Ferramentas Carlos Augusto P. Gomes Antonio Carlos Barbosa Editora rica Interrupes MS-DOS, ROM-BIOS Eurico Soalheiro Br s McGraw-Hill

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (94 of 95)28/09/2004 17:10:35

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT

Desenvolvimento de Software B sico Leland L. Beck Editora Campus Programao Assembly 80386 - Guia Pr tico para Programadores Ross P. Nelson McGraw-Hill

file:///C|/cursos_e_livros_cd/informtica/programao/assembler/ASMPOR.TXT (95 of 95)28/09/2004 17:10:35

Você também pode gostar