Baixe o app para aproveitar ainda mais
Prévia do material em texto
file:///C|/cursos_e_livros_cd/informática/programação/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 Portuguˆs por Jeferson Amaral. * * e-mail: amaral@inf.ufsm.br * ***************************************************************************** Este tutorial tem o intuito de apenas introduzir o leitor ao mundo da programacao em Linguagem Assembly, nao tem, portanto e de forma alguma, plano de esgotar o assunto. Copyright (C) 1995-1996, Hugo Perez Perez. Anyone may reproduce this document, in whole or in part, provided that: (1) any copy or republication of the entire document must show University of Guadalajara as the source, and must include this notice; and (2) any other use of this material must reference this manual and University of Guadalajara, and the fact that the material is copyright by Hugo Perez and is used by permission. **************************************************************************** T U T O R I A L D E L I N G U A G E M A S S E M B L Y --------------- --- ----------------- --------------- Conte£do: 1.Introdu‡Æo 2.Conceitos B sicos 3.Programa‡Æo Assembly 4.Instru‡äes Assembly 5.Interrup‡äes e gerˆncia de arquivos 6.Macros e procedimentos 7.Exemplos de programas 8.Bibliografia file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (1 of 95)28/09/2004 17:10:34 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT ***************************************************************************** CAPÖTULO 1: INTRODU€ÇO Conte£do: 1.1.O que h de novo neste material 1.2.Apresenta‡Æo 1.3.Por que aprender Assembly? 1.4.N¢s precisamos da sua opiniÆo --------------- // --------------- 1.1.O que h de novo neste material: Ap¢s um ano da realiza‡Æo da primeira versÆo do tutorial, e atrav‚s das opiniäes recebidas por e-mail, resolvemos ter por disposi‡Æo todos estes coment rios e sugestäes. Esperamos que atrav‚s deste novo material Assembly, as pessoas que se mostrarem interessadas possam aprender mais sobre o seu IBM PC. Esta nova edi‡Æo do tutorial inclui: Uma se‡Æo completa sobre como usar o programa debug. Mais exemplos de programas. Um motor de pesquisa, para qualquer t¢pico ou item relacionado … esta nova versÆo. Consider vel reorganiza‡Æo e revisÆo do material Assembly. Em cada se‡Æo, h um link para o Dicion rio On-line de Computa‡Æo de Dennis Howe. 1.2.Apresenta‡Æo: Este tutorial destina-se …quelas pessoas que nunca tiveram contato com a Linguagem Assembly. O tutorial est completamente focado em computadores com processadores 80x86 da fam¡lia Intel, e considerando que a base da linguagem ‚ o funcionamento dos recursos internos do processador, os exemplos descritos nÆo sÆo compat¡veis com qualquer outra arquitetura. As informa‡äes estÆo dispostas em unidades ordenadas para permitir f cil acesso a cada t¢pico, bem como uma melhor navega‡Æo pelo tutorial. file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (2 of 95)28/09/2004 17:10:34 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT Na se‡Æo introdut¢ria sÆo mencionados alguns conceitos elementares sobre computadores e a Linguagem Assembly em si. 1.3.Por que aprender Assembly? A primeira razÆo para se trabalhar com o assembler ‚ a oportunidade de conhecer melhor o funcionamento do seu PC, o que permite o desenvolvimento de programas de forma mais consistente. A segunda razÆo ‚ que vocˆ pode ter um controle total sobre o PC ao fazer uso do assembler. Uma outra razÆo ‚ que programas assembly sÆo mais r pidos, menores e mais poderosos do que os criados com outras linguagens. Ultimamente, o assembler (montador) permite uma otimiza‡Æo ideal nos programas, seja no seu tamanho ou execu‡Æo. 1.4.N¢s precisamos da sua opiniÆo: Nosso intuito ‚ oferecer um modo simples para que vocˆ consiga aprender Assembly por si mesmo. Por tanto, qualquer coment rio ou sugestÆo ser bem-vinda. ***************************************************************************** CAPÖTULO 2: CONCEITOS BµSICOS Conte£do: 2.1.Descri‡Æo b sica de um sistema computacional. 2.2.Conceitos b sicos da Linguagem Assembly 2.3.Usando o programa debug --------------- // --------------- Esta se‡Æo tem o prop¢sito de fazer um breve coment rio a respeito dos principais componentes de um sistema computacional, o que ir permitir ao usu rio uma melhor compreensÆo dos conceitos propostos no decorrer do tutorial. file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (3 of 95)28/09/2004 17:10:34 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT 2.1.DESCRI€ÇO DE UM SISTEMA COMPUTACIONAL Conte£do: 2.1.1.Processador Central 2.1.2.Mem¢ria Principal 2.1.3.Unidades de Entrada e Sa¡da 2.1.4.Unidades de Mem¢ria Auxiliar Sistema Computacional. Chamamos de Sistema Computacional a completa configura‡Æo de um computador, incluindo os perif‚ricos e o sistema operacional. 2.1.1.Processador Central. • tamb‚m conhecido por CPU ou Unidade Central de Processamento, que por sua vez ‚ composta pela unidade de controle e unidade de l¢gica e aritm‚tica. Sua fun‡Æo consiste na leitura e escrita do conte£do das c‚lulas de mem¢ria, regular o tr fego de dados entre as c‚lulas de mem¢ria e registradores especiais, e decodificar e executar as instru‡äes de um programa. O processador tem uma s‚rie de c‚lulas de mem¢ria usadas com freq•ˆncia e, dessa forma, sÆo partes da CPU. Estas c‚lulas sÆo conhecidas com o nome de registradores. Um processador de um PC possui cerca de 14 registradores. Como os PCs tem sofrido evolu‡Æo veremos que podemos manipular registradores de 16 ou 32 bits. A unidade de l¢gica e aritm‚tica da CPU realiza as opera‡äes relacionadas ao c lculo simb¢lico e num‚rico. Tipicamente estas unidades apenas sÆo capazes de realizar opera‡äes elementares, tais como: adi‡Æo e subtra‡Æo de dois n£meros inteiros, multiplica‡Æo e divisÆo de n£mero inteiro, manuseio de bits de registradores e compara‡Æo do conte£do de dois registradores. Computadores pessoais podem ser classificados pelo que ‚ conhecido como tamanho da palavra, isto ‚, a quantidade de bits que o processador ‚ capaz de manusear de uma s¢ vez. file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (4 of 95)28/09/2004 17:10:34 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT 2.1.2.Mem¢ria Principal. • um grupo de c‚lulas, agora sendo fabricada com semi-condutores, usada para processamentos gerais, tais como a execu‡Æo de programas e o armazenamento de informa‡äes para opera‡äes. Cada uma das c‚lulas pode conter um valor num‚rico e ‚ capaz de ser endere‡ada, isto ‚, pode ser identificada de forma singular em rela‡Æo …s outras c‚lulas pelo uso de um n£mero ou endere‡o. O nome gen‚rico destas mem¢rias ‚ Random Access Memory ou RAM. A principal desvantagem deste tipo de mem¢ria ‚ o fato de que seus circuitosintegrados perdem a informa‡Æo que armazenavam quando a energia el‚trica for interrompida, ou seja, ela ‚ vol til. Este foi o motivo que levou … cria‡Æo de um outro tipo de mem¢ria cuja informa‡Æo nÆo ‚ perdida quando o sistema ‚ desligado. Estas mem¢rias receberam o nome de Read Only Memory ou ROM. 2.1.3.Unidades de Entrada e Sa¡da. Para que o computador possa ser £til para n¢s se faz necess rio que o processador se comunique com o exterior atrav‚s de interfaces que permitem a entrada e a sa¡da de informa‡Æo entre ele e a mem¢ria. Atrav‚s do uso destas comunica‡äes ‚ poss¡vel introduzir informa‡Æo a ser processada e mais tarde visualizar os dados processados. Algumas das mais comuns unidades de entrada sÆo o teclado e o mouse. As mais comuns unidades de sa¡da sÆo a tela do monitor e a impressora. 2.1.4.Unidades de Mem¢ria Auxiliar. Considerando o alto custo da mem¢ria principal e tamb‚m o tamanho das aplica‡äes atualmente, vemos que ela ‚ muito limitada. Logo, surgiu a necessidade da cria‡Æo de dispositivos de armazenamento pr ticos e econ“micos. Estes e outros inconvenientes deram lugar …s unidades de mem¢ria auxiliar, perif‚ricos. As mais comuns sÆo as fitas e os discos magn‚ticos. A informa‡Æo ali armazenada ser dividida em arquivos. Um arquivo ‚ feito de um n£mero vari vel de registros, geralmente de tamanho fixo, podendo conter informa‡Æo ou programas. file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (5 of 95)28/09/2004 17:10:34 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT --------------- // --------------- 2.2.CONCEITOS BµSICOS Conte£do: 2.2.1.Informa‡äes nos computadores 2.2.2.M‚todos de representa‡Æo de dados 2.2.1.Informa‡Æo no computador: 2.2.1.1.Unidades de informa‡Æo 2.2.1.2.Sistemas num‚ricos 2.2.1.3.Convertendo n£meros bin rios para decimais 2.2.1.4.Convertendo n£meros decimais para bin rios 2.2.1.5.Sistema hexadecimal 2.2.1.1.Unidades de informa‡Æo Para o PC processar a informa‡Æo, ‚ necess rio que ela esteja em c‚lulas especiais, chamadas registradores. Os registradores sÆo grupos de 8 ou 16 flip-flops. Um flip-flop ‚ um dispositivo capaz de armazenar 2 n¡veis de voltagem, um baixo, geralmente 0.5 volts, e outro comumente de 5 volts. O n¡vel baixo de energia no flip-flop ‚ interpretado como desligado ou 0, e o n¡vel alto, como ligado ou 1. Estes estados sÆo geralmente conhecidos como bits, que sÆo a menor unidade de informa‡Æo num computador. Um grupo de 16 bits ‚ conhecido como palavra; uma palavra pode ser dividida em grupos de 8 bits chamados bytes, e grupos de 4 bits chamados nibbles. 2.2.1.2.Sistemas num‚ricos O sistema num‚rico que n¢s usamos diariamente ‚ o decimal, mas este sistema file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (6 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT nÆo ‚ conveniente para m quinas, pois ali as informa‡äes tˆm que ser codificadas de modo a interpretar os estados da corrente (ligado-desligado); este modo de c¢digo faz com que tenhamos que conhecer o c lculo posicional que nos permitir expressar um n£mero em qualquer base onde precisarmos dele. • poss¡vel representar um determinado n£mero em qualquer base atrav‚s da seguinte f¢rmula: Onde n ‚ a posi‡Æo do d¡gito, iniciando da direita para a esquerda e numerando de 0. D ‚ o d¡gito sobre o qual n¢s operamos e B ‚ a base num‚rica usada. 2.2.1.3.Convertendo n£meros bin rios para decimais Quando trabalhamos com a Linguagem Assembly encontramos por acaso a necessidade de converter n£meros de um sistema bin rio, que ‚ usado em computadores, para o sistema decimal usado pelas pessoas. O sistema bin rio ‚ baseado em apenas duas condi‡äes ou estados, estar ligado(1), ou desligado(0), portanto sua base ‚ dois. Para a conversÆo, podemos usar a f¢rmula de valor posicional: Por exemplo, se tivermos o n£mero bin rio 10011, tomamos cada d¡gito da direita para a esquerda e o multiplicamos pela base, elevando … potˆncia correspondente … sua posi‡Æo relativa: Binary: 1 1 0 0 1 Decimal: 1*2^0 + 1*2^1 + 0*2^2 + 0*2^3 + 1*2^4 = 1 + 2 + 0 + 0 + 16 = 19 decimal. O caracter ^ ‚ usado em computa‡Æo como s¡mbolo para potˆncia e * para a multiplica‡Æo. 2.2.1.4.Convertendo n£meros decimais para bin rio H v rios m‚todos para se converter n£meros decimais para bin rio; apenas um file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (7 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT ser analizado aqui. Naturalmente a conversÆo com uma calculadora cient¡fica ‚ muito mais f cil, mas nem sempre podemos contar com isso, logo o mais conveniente ‚, ao menos, sabermos uma f¢rmula para fazˆ-la. O m‚todo resume-se na aplica‡Æo de divisäes sucessivas por 2, mantendo o resto como o d¡gito bin rio e o resultado como o pr¢ximo n£mero a ser dividido. Tomemos como exemplo o n£mero decimal 43. 43/2=21 e o resto ‚ 1; 21/2=10 e o resto ‚ 1; 10/2=5 e o resto ‚ 0; 5/2=2 e o resto ‚ 1; 2/2=1 e o resto ‚ 0; 1/2=0 e o resto ‚ 1. Para construir o equivalente bin rio de 43, vamos pegar os restos obtidos de baixo para cima, assim temos 101011. 2.2.1.5.Sistema hexadecimal Na base hexadecimal temos 16 d¡gitos, que vÆo de 0 a 9 e da letra A at‚ a F, estas letras representam os n£meros de 10 a 15. Portanto contamos: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E, e F. A conversÆo entre n£meros bin rios e hexadecimais ‚ f cil. A primeira coisa a fazer ‚ dividir o n£mero bin rio em grupos de 4 bits, come‡ando da direita para a esquerda. Se no grupo mais … direita sobrarem d¡gitos, completamos com zeros. Tomando como exemplo o n£mero bin rio 101011, vamos dividi-lo em grupos de 4 bits: 10;1011 Preenchendo o £ltimo grupo com zeros (o um mais … esquerda): 0010;1011 A seguir, tomamos cada grupo como um n£mero independente e consideramos o seu valor decimal: 0010=2;1011=11 Entretanto, observa-se que nÆo podemos representar este n£mero como 211, file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (8 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT isto seria um erro, uma vez que os n£meros em hexa maiores que 9 e menores que 16 sÆo representados pelas letras A,B,...,F. Logo, obtemos como resultado: 2Bh, onde o "h" representa a base hexadecimal. Para a conversÆo de um n£mero hexadecimal em bin rio ‚ apenas necess rio inverter os passos: tomamos o primeiro d¡gito hexadecimal e o convertemos para bin rio, a seguir o segundo, e assim por diante. --------------- // --------------- 2.2.2.M‚todos de representa‡Æo de dados num computador. 2.2.2.1.C¢digo ASCII 2.2.2.2.M‚todo BCD 2.2.2.3.Representa‡Æo de ponto flutuante 2.2.2.1.C¢digo ASCII ASCII significa American Standard Code for Information Interchange. Este c¢digo cont‚m as letras do alfabeto, d¡gitos decimais de 0 a 9 e alguns s¡mbolos adicionais como um n£mero bin rio de 7 bits, tendo o oitavo bit em 0, ou seja, desligado. Deste modo, cada letra, d¡gito ou caracter especial ocupa 1 byte na mem¢ria do computador. Podemos observar que este m‚todo de representa‡Æo de dados ‚ muito ineficiente no aspecto num‚rico, uma vez que no formato bin rio 1 byte nÆo ‚ suficiente para representar n£meros de 0 a 255, com oASCII podemos representar apenas um d¡gito. Devido a esta ineficiˆncia, o c¢digo ASCII ‚ usado, principalmente, para a representa‡Æo de textos. 2.2.2.2.M‚todo BCD file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (9 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT BCD significa Binary Coded Decimal. Neste m‚todo grupos de 4 bits sÆo usados para representar cada d¡gito decimal de 0 a 9. Com este m‚todo podemos representar 2 d¡gitos por byte de informa‡Æo. Vemos que este m‚todo vem a ser muito mais pr tico para representa‡Æo num‚rica do que o c¢digo ASCII. Embora ainda menos pr tico do que o bin rio, com o m‚todo BCD podemos representar d¡gitos de 0 a 99. Com o bin rio, vemos que o alcance ‚ maior, de 0 a 255. Este formato (BCD) ‚ principalmente usado na representa‡Æo de n£meros grandes, aplica‡äes comerciais, devido …s suas facilidades de opera‡Æo. 2.2.2.3.Representa‡Æo de ponto flutuante Esta representa‡Æo ‚ baseada em nota‡Æo cient¡fica, isto ‚, representar um n£mero em 2 partes: sua base e seu expoente. Por exemplo o n£mero decimal 1234000, ‚ representado como 1.234*10^6, observamos que o expoente ir indicar o n£mero de casas que o ponto decimal deve ser movido para a direita, a fim de obtermos o n£mero original. O expoente negativo, por outro lado, indica o n£mero de casas que o ponto decimal deve se locomover para a esquerda. --------------- // --------------- 2.3.PROGRAMA DEBUG Conte£do: 2.3.1.Processo de cria‡Æo de programas 2.3.2.Registradores da CPU 2.3.3.Programa debug 2.3.4.Estrutura Assembly 2.3.5.Criando um programa assembly simples 2.3.6.Armazenando e carregando os programas file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (10 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT 2.3.1.Processo de cria‡Æo de programas. Para a cria‡Æo de programas sÆo necess rios os seguintes passos: * Desenvolvimento do algoritmo, est gio em que o problema a ser solucionado ‚ estabelecido e a melhor solu‡Æo ‚ proposta, cria‡Æo de diagramas esquem ticos relativos … melhor solu‡Æo proposta. * Codifica‡Æo do algoritmo, o que consiste em escrever o programa em alguma linguagem de programa‡Æo; linguagem assembly neste caso espec¡fico, tomando como base a solu‡Æo proposta no passo anterior. * A transforma‡Æo para a linguagem de m quina, ou seja, a cria‡Æo do programa objeto, escrito como uma seq•ˆncia de zeros e uns que podem ser interpretados pelo processador. * O £ltimo est gio ‚ a elimina‡Æo de erros detectados no programa na fase de teste. A corre‡Æo normalmente requer a repeti‡Æo de todos os passos, com observa‡Æo atenta. 2.3.2.Registradores da CPU. Para o prop¢sito did tico, vamos focar registradores de 16 bits. A CPU possui 4 registradores internos, cada um de 16 bits. SÆo eles AX, BX, CX e DX. SÆo registradores de uso geral e tamb‚m podem ser usados como registradores de 8 bits. Para tanto devemos referenci -los como, por exemplo, AH e AL, que sÆo, respectivamente, o byte high e o low do registrador AX. Esta nomenclatura tamb‚m se aplica para os registradores BX, CX e DX. Os registradores, segundo seus respectivos nomes: AX Registrador Acumulador BX Registrador Base CX Registrador Contador DX Registrador de Dados DS Registrador de Segmento de Dados ES Registrador de Segmento Extra SS Registrador de Segmento de Pilha CS Registrador de Segmento de C¢digo BP Registrador Apontador da Base SI Registrador de Öndice Fonte file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (11 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT DI Registrador de Öndice Destino SP Registrador Apontador de Pilha IP Registrador Apontador da Pr¢xima Instru‡Æo F Registrador de Flag 2.3.3.Programa Debug. Para a cria‡Æo de um programa em assembler existem 2 op‡äes: usar o TASM - Turbo Assembler da Borland, ou o DEBUGGER. Nesta primeira se‡Æo vamos usar o debug, uma vez que podemos encontr -lo em qualquer PC com o MS-DOS. Debug pode apenas criar arquivos com a extensÆo .COM, e por causa das caracter¡sticas deste tipo de programa, eles nÆo podem exceder os 64 Kb, e tamb‚m devem iniciar no endere‡o de mem¢ria 0100H dentro do segmento espec¡fico. • importante observar isso, pois deste modo os programas .COM nÆo sÆo reloc veis. Os principais comandos do programa debug sÆo: A Montar instru‡äes simb¢licas em c¢digo de m quina D Mostrar o conte£do de uma rea da mem¢ria E Entrar dados na mem¢ria, iniciando num endere‡o espec¡fico G Rodar um programa execut vel na mem¢ria N Dar nome a um programa P Proceder, ou executar um conjunto de instru‡äes relacionadas Q Sair do programa debug R Mostrar o conte£do de um ou mais registradores T Executar passo a passo as instru‡äes U Desmontar o c¢digo de m quina em instru‡äes simb¢licas W Gravar um programa em disco • poss¡vel visualizar os valores dos registradores internos da CPU usando o programa Debug. Debug ‚ um programa que faz parte do pacote do DOS, e pode ser encontrado normalmente no diret¢rio C:\DOS. Para inici -lo, basta digitar Debug na linha de comando: C:/>Debug [Enter] - Vocˆ notar entÆo a presen‡a de um h¡fen no canto inferior esquerdo da tela. NÆo se espante, este ‚ o prompt do programa. Para visualizar o conte£do dos file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (12 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/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 conte£do de todos os registradores internos da CPU; um modo alternativo para visualizar um £nico registrador ‚ usar o camando "r" seguido do parƒmetro que faz referˆncia ao nome do registrador: -rbx BX 0000 : Esta instru‡Æo mostrar o conte£do do registrador BX e mudar o indicador do Debug de "-" para ":" Quando o prompt assim se tornar, significa que ‚ poss¡vel, embora nÆo obrigat¢ria, a mudan‡a do valor contido no registrador, bastando digitar o novo valor e pressionar [Enter]. Se vocˆ simplesmente pressionar [Enter] o valor antigo se mant‚m. 2.3.4.Estrutura Assembly. Nas linhas do c¢digo em Linguagem Assembly h duas partes: a primeira ‚ o nome da instru‡Æo a ser executada; a segunda, os parƒmetros do comando. Por exemplo: add ah bh Aqui "add" ‚ o comando a ser executado, neste caso uma adi‡Æo, e "ah" bem como "bh" sÆo os parƒmetros. Por exemplo: mov al, 25 No exemplo acima, estamos usando a instru‡Æo mov, que significa mover o valor 25 para o registrador al. file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (13 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT O nome das instru‡äes nesta linguagem ‚ constitu¡do de 2, 3 ou 4 letras. Estas instru‡äes sÆo chamadas mnem“nicos ou c¢digos de opera‡Æo, representando a fun‡Æo que o processador executar . ·s vezes instru‡äes aparecem assim: add al,[170] Os colchetes no segundo parƒmetro indica-nos que vamos trabalhar com o conte£do da c‚lula de mem¢ria de n£mero 170, ou seja, com o valor contido no endere‡o 170 da mem¢ria e nÆo com o valor 170, isto ‚ conhecido como "endere‡amento direto".2.3.5.Criando um programa simples em assembly. NÆo nos responsabilizaremos pela m execu‡Æo ou poss¡veis danos causados por quaisquer exemplos que de agora em diante aparecerÆo, uma vez que os mesmos, apesar de testados, sÆo de car ter did tico. Vamos, entÆo, criar um programa para ilustrar o que vimos at‚ agora. Adicionaremos dois valores: O primeiro passo ‚ iniciar o Debug, o que j vimos como fazer anteriormente. Para montar um programa no Debug, ‚ usado o comando "a" (assemble); quando usamos este comando, podemos especificar um endere‡o inicial para o nosso programa como o parƒmetro, mas ‚ opcional. No caso de omissÆo, o endere‡o inicial ‚ o especificado pelos registradores CS:IP, geralmente 0100h, o local em que programas com extensÆo .COM devem iniciar. E ser este o local que usaremos, uma vez que o Debug s¢ pode criar este tipo de programa. Embora neste momento nÆo seja necess rio darmos um parƒmetro ao comando "a", isso ‚ recomend vel para evitar problemas, logo: a 100[enter] mov ax,0002[enter] mov bx,0004[enter] add ax,bx[enter] nop[enter][enter] O que o programa faz? Move o valor 0002 para o registrador ax, move o valor 0004 para o registrador bx, adiciona o conte£do dos registradores ax e bx, file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (14 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT guardando o resultado em ax e finalmente a instru‡Æo nop (nenhuma opera‡Æo) finaliza o programa. No programa debug, a tela se parecer com: C:\>debug -a 100 0D62:0100 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 instru‡äes: -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 instru‡Æo: -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 instru‡Æo 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/informática/programação/assembler/ASMPOR.TXT (15 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT 2.3.6.Armazenando e carregando os programas. NÆo seria pr tico ter que digitar o programa cada vez que inici ssemos o Debug. Ao inv‚s disso, podemos armazen -lo no disco. S¢ que o mais interessante nisso ‚ que um simples comando de salvar cria um arquivo com a extensÆo .COM, ou seja, execut vel - sem precisarmos efetuar os processos de montagem e liga‡Æo, como veremos posteriormente com o TASM. Eis os passos para salvar um programa que j esteja na mem¢ria: * Obter o tamnho do programa subtraindo o endere‡o final do endere‡o inicial, naturalmente que no sistema hexadecimal. * Dar um nome ao programa. * Colocar o tamanho do programa no registrador CX. * Mandar o debug gravar o programa em disco. Usando como exemplo o seguinte programa, vamos clarear a id‚ia de como realizar os passos acima descritos: 0C1B:0100 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 adi‡Æo e subtra‡Æo de dois n£meros em hexadecimal. Para obter o tamanho do programa em questÆo, damos como parƒmetro o valor do endere‡o final do nosso programa (10A), e o endere‡o inicial (100). O primeiro resultado mostra-nos a soma dos endere‡os, o segundo, a subtra‡Æo. -h 10a 100 020a 000a O comando "n" permite-nos nomear o programa. -n test.com O comando "rcx" permite-nos mudar o conte£do do registrador CX para o valor obtido como tamanho do arquivo com o comando "h", neste caso 000a. file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (16 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/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 sÆo necess rios: Dar o nome do arquivo a ser carregado. Carreg -lo usando o comando "l" (load). Para obter o resultado correto destes passos, ‚ necess rio que o programa acima j esteja criado. Dentro do Debug, escrevemos o seguinte: -n test.com -l -u 100 109 0C3D:0100 B80200 MOV AX,0002 0C3D:0103 BB0400 MOV BX,0004 0C3D:0106 01D8 ADD AX,BX 0C3D:0108 CD20 INT 20 O £ltimo comando "u" ‚ usado para verificar que o programa foi carregado na mem¢ria. O que ele faz ‚ desmontar o c¢digo e mostr -lo em assembly. Os parƒmetros indicam ao Debug os endere‡os inicial e final a serem desmontados. O Debug sempre carrega os programas na mem¢ria no endere‡o 100h, conforme j comentamos. ***************************************************************************** CAPÖTULO 3: PROGRAMA€ÇO ASSEMBLY Conte£do: file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (17 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT 3.1.Construindo programas em Assembly 3.2.Processo Assembly 3.3.Pequenos programas em Assembly 3.4.Tipos de instru‡äes --------------- // --------------- 3.1.Construindo programas em Assembly. 3.1.1.Software necess rio 3.1.2.Programa‡Æo Assembly 3.1.1.SOFTWARE NECESSµRIO Para que possamos criar um programa, precisamos de algumas ferramentas: Primeiro de um editor para criar o programa fonte. Segundo de um montador, um programa que ir transformar nosso fonte num programa objeto. E, terceiro, de um linker (ligador) que ir gerar o programa execut vel a partir do programa objeto. O editor pode ser qualquer um que dispusermos. O montador ser o TASM macro assembler da Borland, e o linker ser o TLINK, tamb‚m da Borland. N¢s devemos criar os programas fonte com a extensÆo .ASM para que o TASM reconhe‡a e o transforme no programa objeto, um "formato intermedi rio" do programa, assim chamado porque ainda nÆo ‚ um programa execut vel e tÆo pouco um programa fonte. O linker gera a partir de um programa .OBJ, ou da combina‡Æo de v rios deles, um programa execut vel, cuja extensÆo ‚ normalmente .EXE, embora possa ser .COM dependendo da forma como for montado e ligado. 3.1.2.PROGRAMA€ÇO ASSEMBLY Para construirmos os programas com o TASM, devemos estruturar o fonte de forma diferenciada ao que faz¡amos com o programa debug. • importante incluir as seguintes diretivas assembly: .MODEL SMALL Define o melo de mem¢ria a usar em nosso programa file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (18 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT .CODE Define as instru‡äes do programa, relacionado ao segmento de c¢digo .STACK Reserva espa‡o de mem¢ria para as instru‡äes de programa na pilha END Finaliza um programa assembly Vamos programar Primeiro passo Use qualquer editor para criaro programa fonte. Entre com as seguintes linhas: Primeiro exemplo ; use ; para fazer coment rios em programas assembly .MODEL SMALL ;modelo de mem¢ria .STACK ;espa‡o de mem¢ria para instru‡äes do programa na pilha .CODE ;as linhas seguintes sÆo instru‡äes 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 ;interrup‡Æo 10h mov ah,4ch ;move o valor 4ch para o registrador ah int 21h ;interrup‡Æo 21h END ;finaliza o c¢digo do programa Este programa assembly muda o tamanho do cursor. Segundo passo Salvar o arquivo com o seguinte nome: exam1.asm NÆo esquecer de salv -lo no formato ASCII. Terceiro passo Usar o programa TASM para construir o programa objeto. Exemplo: file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (19 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/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 nÆo pode ser executado... Quarto passo Usar o programa TLINK para criar o programa execut vel. Exemplo: C:\>tlink exam1.obj Turbo Link Version 3.0 Copyright (c) 1987, 1990 Borland International C:\> Onde exam1.obj ‚ o nome do programa intermedi rio, .OBJ. O comando acima gera diretamente o arquivo com o nome do programa intermedi rio e a extensÆo .EXE. • opcional a coloca‡Æo da extensÆo .obj no comando. Quinto passo Executar o programa execut vel criado. C:\>exam1[enter] Lembre-se, este programa assembly muda o tamanho do cursor no DOS. --------------- // --------------- 3.2.Processo Assembly. 3.2.1.Segmentos 3.2.2.Tabela de equivalˆncia file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (20 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT 3.2.1.SEGMENTOS A arquitetura dos processadores x86 for‡a-nos a usar segmentos de mem¢ria para gerenciar a informa‡Æo, o tamanho destes segmentos ‚ de 64Kb. A razÆo de ser destes segmentos ‚ que, considerando que o tamanho m ximo de um n£mero que o processador pode gerenciar ‚ dado por uma palavra de 16 bits ou registrador, assim nÆo seria poss¡vel acessar mais do que 65536 locais da mem¢ria usando apenas um destes registradores. Mas agora, se a mem¢ria do PC ‚ dividida em grupos de segmentos, cada um com 65536 locais, e podemos usar um endere‡o ou registrador exclusivo para encontrar cada segmento, e ainda fazemos cada endere‡o de um espec¡fico slot com dois registradores, nos ‚ poss¡vel acessar a quantidade de 4294967296 bytes de mem¢ria, que ‚, atualmente, a maior mem¢ria que podemos instalar num PC. Desta forma, para que o montador seja capaz de gerenciar os dados, se faz necess rio que cada informa‡Æo ou instru‡Æo se encontre na rea correspondente ao seu segmento. O endere‡o do segmento ‚ fornecido ao montador pelos registradores DS, ES, SS e CS. Lembrando um programa no Debug, observe: 1CB0:0102 MOV AX,BX O primeiro n£mero 1CB0, corresponde ao segmento de mem¢ria que est sendo usado, o segundo ‚ uma referˆncia ao endere‡o dentro do segmento, ‚ um deslocamento dentro do segmento offset. O modo usado para indicar ao montador com quais segmentos vamos trabalhar ‚ fazendo uso das diretivas .CODE, .DATA e .STACK. O montador ajusta o tamanho dos segmentos tomando como base o n£mero de bytes que cada instru‡Æo assembly precisa, j que seria um desperd¡cio de mem¢ria usar segmentos inteiros. Por exemplo, se um programa precisa de apenas 10Kb para armazenar dados, o segmento de dados seria apenas de 10Kb e nÆo de 64Kb, como poderia acontecer se feito manualmente. 3.2.2.TABELAS DE EQUIVALÒNCIA Cada uma das partes numa linha de c¢digo assembly ‚ conhecida como token, por exemplo: file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (21 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT MOV AX,Var Aqui temos trˆs tokens, a instru‡Æo MOV, o operador AX e o operador VAR. O que o montador faz para gerar o c¢digo OBJ ‚ ler cada um dos tokens e procurar a equivalˆncia em c¢digo de m quina em tabelas correspondentes, seja de palavras reservadas, tabela de c¢digos de opera‡Æo, tabela de s¡mbolos, tabela de literais, onde o significado dos mnem“nicos e os endere‡os dos s¡mbolos que usamos serÆo encontrados. A maioria dos montadores sÆo de duas passagens. Em s¡ntese na primeira passagem temos a defini‡Æo dos s¡mbolos, ou seja, sÆo associados endere‡os a todas as instru‡äes do programa. Seguindo este processo, o assembler lˆ MOV e procura-o na tabela de c¢digos de opera‡Æo para encontrar seu equivalente na linguagem de m quina. Da mesma forma ele lˆ AX e encontra-o na tabela correspondente como sendo um registrador. O processo para Var ‚ um pouco diferenciado, o montador verifica que ela nÆo ‚ uma palavra reservada, entÆo procura na tabela de s¡mbolos, l encontrando-a ele designa o endere‡o correspondente, mas se nÆo encontrou ele a insere na tabela para que ela possa receber um endere‡o na segunda passagem. Ainda na primeira passagem ‚ executado parte do processamento das diretivas, ‚ importante notar que as diretivas nÆo criam c¢digo objeto. Na passagem dois sÆo montadas as instru‡äes, traduzindo os c¢digos de opera‡Æo e procurando os endere‡os, e ‚ gerado o c¢digo objeto. H s¡mbolos que o montador nÆo consegue encontrar, uma vez que podem ser declara‡äes externas. Neste caso o linker entra em a‡Æo para criar a estrutura necess ria a fim de ligar as diversas poss¡veis partes de c¢digo, dizendo ao loader que o segmento e o token em questÆo sÆo definidos quando o programa ‚ carregado e antes de ser executado. --------------- // --------------- 3.3.Mais programas. Outro exemplo Primeiro passo Use qualquer editor e crie o seguinte: ;exemplo2 .model small file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (22 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/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 ;interrup‡Æo 21h mov ah,4ch ;fun‡Æo 4ch, sai para o sistema operacional int 21h ;interrup‡Æo 21h end ;finaliza o programa Segundo passo Salvar o arquivo com o nome: exam2.asm NÆo esquecer de salvar em formato ASCII. Terceiro passo Usar o programa TASM para construir o programa objeto. C:\>tasm exam2.asm Turbo Assembler Version 2.0 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/informática/programação/assembler/ASMPOR.TXT (23 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT C:\> Este programa imprime o caracter * na tela. Clique aqui para obter mais programas --------------- // --------------- 3.4.Tipos de instru‡äes. 3.4.1.Movimentode dados 3.4.2.Opera‡äes l¢gicas e aritm‚ticas 3.4.3.Saltos, la‡os e procedimentos 3.4.1.MOVIMENTO DE DADOS Em qualquer programa h necessidade de se mover dados na mem¢ria e em registradores da CPU; h v rios modos de se fazˆ-lo: pode-se copiar os dados da mem¢ria para algum registrador, de registrador para registrador, de um registrador para a pilha, da pilha para um registrador, transmitir dados para um dispositivo externo e vice-versa. Este movimento de dados ‚ sujeito a regras e restri‡äes, entre elas: *NÆo ‚ poss¡vel mover dados de um local da mem¢ria para outro diretamente; ‚ necess rio primeiro mover o dado do local de origem para um registrador e entÆo do registrador para o local de destino. *NÆo ‚ poss¡vel mover uma constante diretamente para um registrador de segmento; primeiro deve-se mover para um registrador. • poss¡vel mover blocos de dados atrav‚s de instru‡äes movs, que copia uma cadeia de bytes ou palavras; movsb copia n bytes de um local para outro; e movsw copia n palavras. A £ltima das duas instru‡äes toma os valores dos endere‡os definidos por DS:SI como o grupo de dados a mover e ES:DI como a nova localiza‡Æo dos dados. Para mover dados h tamb‚m estruturas chamadas pilhas, onde o dado ‚ introduzido com a instru‡Æo push e ‚ extra¡do com a instru‡Æo pop Numa pilha o primeiro dado a entrar ‚ o £ltimo a sair, por exemplo: file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (24 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/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 comunica‡Æo com dispositivos externos o comando de sa¡da ‚ usado para o envio de informa‡äes a uma porta e o comando de entrada ‚ usado para receber informa‡Æo de uma porta. A sintaxe do comando de sa¡da: OUT DX,AX Onde DX cont‚m o valor da porta que ser usada para a comunica‡Æo e AX cont‚m a informa‡Æo que ser enviada. A sintaxe do comando de entrada: IN AX,DX Onde AX ‚ o registrador onde a informa‡Æo ser armazenada e DX cont‚m o endere‡o da porta de onde chegar a informa‡Æo. 3.4.2.OPERA€åES LàGICAS E ARITM•TICAS As instru‡äes de opera‡äes l¢gicas sÆo: and, not, or e xor. Elas trabalham a n¡vel de bits em seus operadores. Para verificar o resultado das opera‡äes usamos as instru‡äes cmp e test. As instru‡äes usadas para opera‡äes alg‚bricas sÆo: para adi‡Æo add, para subtra‡Æo sub, para multiplica‡Æo mul e para divisÆo div. Quase todas as instru‡äes de compara‡Æo sÆo baseadas na informa‡Æo contida no registrador de flag. Normalmente os flags do registrador que podem ser file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (25 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT manuseados diretamente pelo programador sÆo os da dire‡Æo de dados DF, usado para definir as opera‡äes sobre cadeias. Uma outro que pode tamb‚m ser manuseado ‚ o flag IF atrav‚s das instru‡äes sti e cli, para ativar e desativar as interrup‡äes. 3.4.3.SALTOS, LOOPS E PROCEDIMENTOS Saltos incondicionais na escrita de programas em linguagem assembly sÆo dados pela instru‡Æo jmp; um salto ‚ usado para modificar a seq•ˆncia da execu‡Æo das instru‡äes de um programa, enviando o controle ao endere‡o indicado, ou seja, o registrador contador de programa recebe este novo endere‡o. Um loop, tamb‚m conhecido como intera‡Æo, ‚ a repeti‡Æo de um processo um certo n£mero de vezes at‚ atingir a condi‡Æo de parada. ***************************************************************************** CAPÖTULO 4: INSTRU€åES ASSEMBLY Conte£do: 4.1.Instru‡äes de opera‡Æo de dados 4.2.Instru‡äes l¢gicas e aritm‚ticas 4.3.Instru‡äes de controle de processos --------------- // --------------- 4.1. Instru‡äes de opera‡Æo de dados Conte£do: 4.1.1.Instru‡äes de transferˆncia 4.1.2.Instru‡äes de carga 4.1.3.Instru‡äes de pilha 4.1.1.Instru‡äes de transferˆncia. SÆo usadas para mover o conte£do dos operadores. Cada instru‡Æo pode ser usada com diferentes modos de endere‡amento. file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (26 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT MOV MOVS (MOVSB) (MOVSW) INSTRU€ÇO MOV Prop¢sito: Transferˆncia de dados entre c‚lulas de mem¢ria, registradores e o acumulador. Sintaxe: MOV Destino,Fonte Destino ‚ o lugar para onde o dado ser movido e Fonte ‚ o lugar onde o dado est . Os diferentes movimentos de dados permitidos para esta instru‡Æo sÆo: *Destino: mem¢ria. Fonte: acumulador *Destino: acumulador. Fonte: mem¢ria *Destino: registrador de segmento. Fonte: mem¢ria/registrador *Destino: mem¢ria/regitrador. Fonte: registrador de segmento *Destino: registrador. Fonte: registrador *Destino: registrador. Fonte: mem¢ria *Destino: mem¢ria. Fonte: registrador *Destino: registrador. Fonte: dado imediato *Destino: mem¢ria. 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, entÆo ele move o conte£do de AX (0006h) para o registrador BX, e finalmente move o valor 4C00h para o registrador AX para terminar a execu‡Æo com a op‡Æo 4C da interrup‡Æo 21h. file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (27 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT INSTRU€åES MOVS (MOVSB) (MOVSW) Prop¢sito: Mover byte ou cadeias de palavra da fonte, endere‡ada por SI, para o destino endere‡ado por DI. Sintaxe: MOVS Este comando nÆo necessita de parƒmetros uma vez que toma como endere‡o fonte o conte£do do registrador SI e como destino o conte£do de DI. A seguinte seq•ˆncia de instru‡äes ilustra isso: MOV SI, OFFSET VAR1 MOV DI, OFFSET VAR2 MOVS Primeiro inicializamos os valores de SI e DI com os endere‡os das vari veis VAR1 e VAR2 respectivamente, entÆo ap¢s a execu‡Æo de MOVS o conte£do de VAR1 ‚ copiado para VAR2. As instru‡äes MOVSB e MOVSW sÆo usadas do mesmo modo que MOVS, a primeira move um byte e a segunda move uma palavra. Instru‡äes de carga. SÆo instru‡äes espec¡ficas para registradores, usadas para carregar bytes ou cadeias de bytes num registrador. LODS (LODSB) (LODSW) LAHF LDS LEA LES INSTRU€åES LODS (LODSB) (LODSW) Prop¢sito: Carregar cadeias de um byte ou uma palavra para o acumulador. Sintaxe: file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (28 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT LODS Esta instru‡Æo toma a cadeia encontrada no endere‡o especificado por SI, a carrega para o registrador AL (ou AX) e adiciona ou subtrai, dependendo do estado de DF, para SI se ‚ uma transferˆncia de bytes ou de palavras. MOV SI, OFFSET VAR1 LODS Na primeira linha vemos a carga do endere‡o de VAR1 em SI e na segunda ‚ tomado o conte£do daquele local para o regiustrador AL. Os comandos LODSB e LODSW sÆo usados do mesmo modo, o primeiro carrega um byte e o segundo uma palavra (usa todo o registrador AX). INSTRU€ÇO LAHF Prop¢sito: Transferiro conte£do dos flags para o registrador AH. Sintaxe: LAHF Esta instru‡Æo ‚ £til para verificar o estado dos flags durante a execu‡Æo do nosso programa. Os flags sÆo deixados na seguinte ordem dentro do registrador: SF ZF ?? AF ?? PF ?? CF O "??" significa que haver um valor indefinido naqueles bits. INSTRU€ÇO LDS Prop¢sito: Carregar o registrador de segmento de dados. Sintaxe: file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (29 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT LDS destino,fonte O operador fonte deve ser uma double word na mem¢ria. A palavra associada com o maior endere‡o ‚ transferida para DS, em outras palavras isto ‚ tomado como o endere‡o de segmento. A palavra associada com o menor endere‡o ‚ o endere‡o de deslocamento e ‚ depositada no registrador indicado como destino. INSTRU€ÇO LEA Prop¢sito: Carregar o endere‡o do operador fonte. Sintaxe: LEA destino,fonte O operador fonte deve estar localizado na mem¢ria, e seu deslocamento ‚ colocado no registrador de ¡ndice ou ponteiro especificado no destino. Para ilustrar uma das facilidades que temos com este comando, vejamos: MOV SI,OFFSET VAR1 • equivalente a: LEA SI,VAR1 • muito prov vel que para o programador ‚ muito mais f cil criar programas grandes usando este £ltimo formato. INSTRU€ÇO LES Prop¢sito: Carregar o registrador de segmento extra Sintaxe: LES destino,fonte O operador fonte deve ser uma palavra dupla na mem¢ria. O conte£do da file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (30 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT palavra com endere‡o maior ‚ interpretado como o endere‡o do segmento e ‚ colocado em ES. A palavra com endere‡o menor ‚ o endere‡o do deslocamento e ‚ colocada no registrador especificado no parƒmetro de destino. Instru‡äes de manipula‡Æo da pilha. Estas instru‡äes permitem usar a pilha para armazenar ou recuperar dados. POP POPF PUSH PUSHF INSTRU€ÇO POP Prop¢sito: Recuperar uma parte de informa‡Æo da pilha. Sintaxe: POP destino Esta instru‡Æo transfere o £ltimo valor armazenado na pilha para o operador de destino, e incrementa de 2 o registrador SP. Este incremento ‚ duplo pelo fato de que a pilha do mais alto endere‡o de mem¢ria para o mais baixo, e a pilha trabalha apenas com palavras, 2 bytes, logo deve ser 2 o incremento de SP, na realidade 2 est sendo subtra¡do do tamanho real da pilha. INSTRU€ÇO POPF Prop¢sito: Extrair os flags armazenados na pilha. Sintaxe: POPF file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (31 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT Este comando transfere os bits da palavra armazenada na parte mais alta da pilha para registrador de flag. O modo da transferˆncia ‚ como se segue: BIT FLAG 0 CF 2 PF 4 AF 6 ZF 7 SF 8 TF 9 IF 10 DF 11 OF Os locais dos bits sÆo os mesmos para o uso da instru‡Æo PUSHF. Uma vez feita a transferˆncia o registrador SP ‚ incrementado de 2, conforme vimos anteriormente. INSTRU€ÇO PUSH Prop¢sito: Coloca uma palavra na pilha. Sintaxe: PUSH fonte A instru‡Æo PUSH decrementa de dois o valor de SP e entÆo transfere o conte£do do operador fonte para o novo endere‡o desultante no registrador rec‚m modificado. O decremento no endere‡o ‚ duplo pelo fato de que quando os valores sÆo adicionados … pilha, que cresce do maior para o menor endere‡o, logo quando subra¡mos de 2 o registrador SP o que fazemos ‚ incrementar o tamanho da pilha em dois bytes, que ‚ a £nica quantidade de informa‡Æo que a pilha pode manusear em cada entrada e sa¡da. file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (32 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT INSTRU€ÇO PUSHF Prop¢sito: Colocar os valores dos flags na pilha. Sintaxe: PUSHF Este comando decrementa de 2 o valor do registrador SP e entÆo o conte£do do registrador de flag ‚ transferido para a pilha, no endere‡o indicado por SP. Os flags sÆo armazenados na mem¢ria da mesma forma que o comando POPF. --------------- // --------------- 4.2. Instru‡äes l¢gicas e aritm‚ticas Conte£do: 4.2.1.Instru‡äes l¢gicas 4.2.2.Instru‡äes aritm‚ticas 4.2.1.Instru‡äes l¢gicas SÆo usadas para realizar opera‡äes l¢gicas nos operadores. AND NEG NOT OR TEST XOR INSTRU€ÇO AND Prop¢sito: Realiza a conjun‡Æo de operadores bit a bit. Sintaxe: file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (33 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT AND destino,fonte Com esta instru‡Æo a opera‡Æo l¢gica "y" para ambos os operadores ‚ usada como na tabela: Fonte Destino | Destino ----------------------------- 1 1 | 1 1 0 | 0 0 1 | 0 0 0 | 0 O resultado desta opera‡Æo ‚ armazenado no operador de destino. INSTRU€ÇO NEG Prop¢sito: Gera o complemento de 2. Sintaxe: NEG destino Esta instru‡Æo gera o complemento de 2 do operador destino e o armazena no mesmo operador. Por exemplo, if AX armazena o valor 1234H, entÆo: NEG AX Isto far com o que o valor EDCCH fque armazenado no registrador AX. INSTRU€ÇO NOT Prop¢sito: Faz a nega‡Æo do operador de destino bit a bit. Sintaxe: NOT destino O resultado ‚ armazenado no mesmo operador de destino. file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (34 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT INSTRU€ÇO OR Prop¢sito: Realiza um OU l¢gico. Sintaxe: OR destino,fonte A instru‡Æo OR, faz uma disjun‡Æo l¢gica bit a bit dos dois operadores: Fonte Destino | Destino ----------------------------------- 1 1 | 1 1 0 | 1 0 1 | 1 0 0 | 0 INSTRU€ÇO TEST Prop¢sito: Compara logicamente os operadores. Sintaxe: TEST destino,fonte Realiza uma conjun‡Æo, bit a bit, dos operadores, mas difere da instru‡Æo AND, uma vez que nÆo coloca o resultado no operador de destino. Tem efeito sobre o registrador de flag. INSTRU€ÇO XOR Prop¢sito: Realiza um OU exclusivo. Sintaxe: XOR destino,fonte file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (35 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT Esta instru‡Æo realizxa uma disjun‡Æo exclusiva de dois operadores bit a bit. Fonte Destino | Destino ----------------------------------- 1 1 | 0 0 0 | 1 0 1 | 1 0 0 | 0 4.2.2.Instru‡äes aritm‚ticas. SÆo usadas para realizar opera‡äes aritm‚ticas nos operadores. ADCADD DIV IDIV MUL IMUL SBB SUB INSTRU€ÇO ADC Prop¢sito: Efetuar a soma entre dois operandos com carry. Sintaxe: ADC destino,fonte Esta instru‡Æo efetua a soma entre dois operandos, mais o valor do flag CF, existente antes da opera‡Æo. Apenas o operando destino e os flags sÆo afetados. O resultado ‚ armazenado no operador de destino. file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (36 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT INSTRU€ÇO ADD Prop¢sito: Adi‡Æo de dois operadores. Sintaxe: ADD destino,fonte Esta instru‡Æo adiciona dois operadores e armazena o resultado no operador destino. INSTRU€ÇO DIV Prop¢sito: DivisÆo sem sinal. Sintaxe: DIV fonte O divisor pode ser um byte ou uma palavra e ‚ o operador que ‚ dado na instru‡Æo. Se o divisor ‚ de 8 bits, o registrador AX de 16 bits ‚ tomado como dividendo e se o divisor ‚ de 16 bits, o par de registradores DX:AX ser tomado como dividendo, tomando a palavra alta de DX e a baixa de AX. Se o divisor for um byte, entÆo o quociente ser armazenado no registrador AL e o resto em AH. Se for uma palavra, entÆo o quociente ‚ armazenado em AX e o resto em DX. INSTRU€ÇO IDIV Prop¢sito: DivisÆo com sinal. Sintaxe: IDIV fonte Consiste basicamente como a instru‡Æo DIV, diferencia-se apenas por realizar file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (37 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT a opera‡Æo com sinal. Para os resultados sÆo usados os mesmos registradores da instru‡Æo DIV. INSTRU€ÇO MUL Prop¢sito: Multiplica‡Æo com sinal. Sintaxe: MUL fonte Esta instru‡Æo realiza uma multiplica‡Æo nÆo sinalizada entre o conte£do do acumulador AL ou AX pelo operando-fonte, devolvendo o resultado no acumulador AX caso a opera‡Æo tenha envolvido AL com um operando de 8 bits, ou em DX e AX caso a opera‡Æo tenha envolvido AX e um operando de 16 bits. INSTRU€ÇO IMUL Prop¢sito: Multiplic‡Æo de dois n£meros inteiros com sinal. Sintaxe: IMUL fonte Esta instru‡Æo faz o mesmo que a anterior, difere apenas pela inclusÆo do sinal. Os resultados sÆo mantidos nos mesmos registradores usados pela instru‡Æo MUL. INSTRU€ÇO SBB Prop¢sito: Subtra‡Æo com carry. Sintaxe: file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (38 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT SBB destino,fonte Esta instru‡Æo subtrai os operadores e subtrai um do resultado se CF est ativado. O operador fonte ‚ sempre subtra¡do do destino. Este tipo de subtra‡Æo ‚ usado quando se trabalha com quantidades de 32 bits. INSTRU€ÇO SUB Prop¢sito: Subtra‡Æo. Sintaxe: SUB destino,fonte Esta instru‡Æo subtrai o operador fonte do destino. --------------- // --------------- 4.3.Instru‡äes de controle de processos Conte£do: 4.3.1.Instru‡äes de salto 4.3.2.Instru‡äes de la‡os: loop 4.3.3.Instru‡äes de contagem 4.3.4.Instru‡äes de compara‡Æo 4.3.5.Instru‡äes de flag 4.3.1.Instru‡äes de salto. Usadas para transferir o processo de execu‡Æo do programa para o operador indicado. JMP JA (JNBE) JAE (JNBE) file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (39 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/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 INSTRU€ÇO JMP Prop¢sito: Salto incondicional. Sintaxe: JMP destino Esta instru‡Æo ‚ usada par adesviar o curso do programa sem tomar em conta as condi‡äes atuais dos flags ou dos dados. INSTRU€ÇO JA (JNBE) Prop¢sito: Salto condicional. Sintaxe: JA s¡mbolo Ap¢s uma compara‡Æo este comando salta se nÆo ‚ igual. Isto quer dizer que o salto s¢ ‚ feito se o flag CF ou o flag ZF estÆo file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (40 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT desativados, ou seja, se um dos dois for zero. INSTRU€ÇO JAE (JNB) Prop¢sito: Salto condicional. Sintaxe: JAE s¡mbolo A instru‡Æo salta se est up, se est equal ou se est not down. O salto ‚ feito se CF est desativado. INSTRU€ÇO JB (JNAE) Prop¢sito: Salto condicional. Sintaxe: JB s¡mbolo A instru‡Æo salta se est down, se est not up ou se est equal. O salto ‚ feito se CF est ativado. INSTRU€ÇO JBE (JNA) Prop¢sito: Salto condicional. Sintaxe: JBE s¡mbolo A instru‡Æo salta se est down, se est equal ou se est not up. O salto ‚ feito se CF ou ZF estÆo ativados, ou seja, se um deles for 1. file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (41 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT INSTRU€ÇO JE (JZ) Prop¢sito: Salto condicional. Sintaxe: JE s¡mbolo A instru‡Æo salta se est equal ou se est zero. O salto ‚ feito se ZF est ativado. INSTRU€ÇO JNE (JNZ) Prop¢sito: Salto condicional. Sintaxe: JNE s¡mbolo A instru‡Æo salta se est not equal ou se est zero. O salto ‚ feito se ZF est desativado. INSTRU€ÇO JG (JNLE) Prop¢sito: Salto condicional, e o sinal ‚ tomado. Sintaxe: JG s¡mbolo A instru‡Æo salta se est larger, se est not larger ou se est equal. O salto ocorre se ZF = 0 ou se OF = SF. file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (42 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT INSTRU€ÇO JGE (JNL) Prop¢sito: Salto condicional, e o sinal ‚ tomado. Sintaxe: JGE s¡mbolo A instru‡Æo salta se est larger, se est less than ou se est equal. O salto ‚ feito se SF = OF. INSTRU€ÇO JL (JNGE) Prop¢sito: Salto condicional, e o sinal ‚ tomado. Sintaxe: JL s¡mbolo A instru‡Æo salta se est less than, se est not larger than ou se est equal. O salto ‚ feito se SF ‚ diferente de OF. INSTRU€ÇO JLE (JNG) Prop¢sito: Salto condicional, e o sinal ‚ tomado. Sintaxe: JLE s¡mbolo A instru‡Æo salta se est less than, se est equal ou se est not larger. O salto ‚ feito se ZF = 1 ou se SF ‚ diferente de OF. file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (43 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT INSTRU€ÇO JC Prop¢sito: Salto condicional, e os flags sÆo tomados. Sintaxe: JC s¡mbolo A instru‡Æo salta se h carry. O salto ‚ feito se CF = 1. INSTRU€ÇO JNC Prop¢sito: Salto condicional, e o estado dos flags ‚ tomado. Sintaxe: JNC s¡mbolo A instru‡Æosalta se nÆo h carry. O salto ‚ feito se CF = 0. INSTRU€ÇO JNO Prop¢sito: Salto condicional, e o estado dos flags ‚ tomado. Sintaxe: JNO s¡mbolo A instru‡Æo salta se nÆo h overflow O salto ‚ feito se OF = 0. file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (44 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT INSTRU€ÇO JNP (JPO) Prop¢sito: Salto condicional, e o estado dos flags ‚ tomado. Sintaxe: JNP s¡mbolo A instru‡Æo salta se nÆo h paridade ou se a paridade ‚ ¡mpar. O salto ‚ feito se PF = 0. INSTRU€ÇO JNS Prop¢sito: Salto condicional, e o estado dos flags ‚ tomado. Sintaxe: JNP s¡mbolo A instru‡Æo salta se o sinal est desativado. O salto ‚ feito se SF = 0. INSTRU€ÇO JO Prop¢sito: Salto condicional, e o estado dos flags ‚ tomado. Sintaxe: JO s¡mbolo A instru‡Æo salta se h overflow. O salto ‚ feito se OF = 1. file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (45 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT INSTRU€ÇO JP (JPE) Prop¢sito: Salto condicional, e o estado dos flags ‚ tomado. Sintaxe: JP s¡mbolo A instru‡Æo salta se h paridade ou se a paridade ‚ par. O salto ‚ feito se PF = 1. INSTRU€ÇO JS Prop¢sito: Salto condicional, e o estado dos flags ‚ tomado. Sintaxe: JS s¡mbolo A instru‡Æo salta se o sinal est ativado. O salto ‚ feito se SF =1. --------------- // --------------- 4.3.2.Instru‡äes para la‡os: LOOP. Estas instru‡äes transferem a execu‡Æo do processo, condicional ou incondicionalmente, para um destino, repetindo a a‡Æo at‚ o contador ser zero. LOOP LOOPE LOOPNE INSTRU€ÇO LOOP file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (46 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT Prop¢sito: Gerar um la‡o no programa. Sintaxe: LOOP s¡mbolo A instru‡Æo LOOP decrementa CX de 1 e transfere a execu‡Æo do programa para o s¡mbolo que ‚ dado como operador, caso CX ainda nÆo seja 1. INSTRU€ÇO LOOPE Prop¢sito: Gerar um la‡o no programa, considerando o estado de ZF. Sintaxe: LOOPE s¡mbolo Esta instru‡Æo decrementa CX de 1. Se CX ‚ diferente de zero e ZF ‚ igual a 1, entÆo a execu‡Æo do programa ‚ transferida para o s¡mbolo indicado como operador. INSTRU€ÇO LOOPNE Prop¢sito: Gerar um la‡o no programa, considerando o estado de ZF. Sintaxe: LOOPNE s¡mbolo Esta instru‡Æo decrementa CX de 1 e transfere a execu‡Æo do programa apenas se ZF ‚ diferente de 0. --------------- // --------------- 4.3.3.Instru‡äes contadoras. file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (47 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT Estas instru‡äes sÆo usadas para decrementar ou incrementar o conte£do de contadores. DEC INC DEC INSTRUCTION Prop¢sito: Decrementar o operador. Sintaxe: DEC destino Esta instru‡Æo subtrai 1 do operador destino e armazena o novo valor no mesmo operador. INSTRU€ÇO INC Prop¢sito: Incrementar o operador. Sintaxe: INC destino Esta instru‡Æo adiciona 1 ao operador destino e mant‚m o resultado no mesmo operador. --------------- // --------------- 4.3.4.Instru‡äes de compara‡Æo. Estas instru‡äes sÆo usadas para comparar os operadores, e elas afetam o conte£do dos flags. CMP CMPS (CMPSB) (CMPSW) file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (48 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT INSTRU€ÇO CMP Prop¢sito: Comparar os operadores. Sintaxe: CMP destino,fonte Esta instru‡Æo subtrai o operador fonte do destino, mas nÆo armazena o resultado da opera‡Æo, apenas afeta o estado dos flags. INSTRU€ÇO CMPS (CMPSB) (CMPSW) Prop¢sito: Comparar cadeias de um byte ou uma palavra. Sintaxe: CMP destino,fonte Esta instru‡Æo compara efetuando uma subtra‡Æo entre o byte ou palavra endere‡ado por DI, dentro do segmento extra de dados, e o byte ou palavra endere‡ado por SI dentro do segmento de dados, afetando o registrador de flags, mas sem devolver o resultado da subtra‡Æo. A instru‡Æo automaticamente incrementa ou decrementa os registradores de ¡ndice SI e DI, dependendo do valor do flag DF, de modo a indicar os pr¢ximos dois elementos a serem comparados. O valor de incremento ou decremento ‚ uma de uma ou duas unidades, dependendo da natureza da opera‡Æo. Diante desta instru‡Æo, pode-se usar um prefixo para repeti‡Æo, de modo a comparar dois blocos de mem¢ria entre si, repetindo a instru‡Æo de compara‡Æo at‚ que ambos se tornem iguais ou desiguais. --------------- // --------------- 4.3.5.Instru‡äes de flag. file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (49 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT Estas instru‡äes afetam diretamente o conte£do dos flags. CLC CLD CLI CMC STC STD STI INSTRU€ÇO CLC Prop¢sito: Limpar o flag de carry. Sintaxe: CLC Esta instru‡Æo desliga o bit correspondente ao flag de carry. Em outras palavras, ela o ajusta para zero. INSTRU€ÇO CLD Prop¢sito: Limpar o flag de endere‡o. Sintaxe: CLD Esta instru‡Æo desliga o bit correspondente ao flag de endere‡o. INSTRU€ÇO CLI Prop¢sito: Limpar o flag de interrup‡Æo. Sintaxe: file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (50 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT CLI Esta instru‡Æo desliga o flag de interrup‡äes, desabilitando, deste modo, interrup‡äes mascar veis. Uma interrup‡Æo mascar vel ‚ aquela cujas fun‡äes sÆo desativadas quando IF=0. INSTRU€ÇO CMC Prop¢sito: Complementar o flag de carry. Sintaxe: CMC Esta instru‡Æo complementa o estado do flag CF. Se CF = 0 a instru‡Æo o iguala a 1. Se CF = 1, a instru‡Æo o iguala a 0. Poder¡amos dizer que ela apenas inverte o valor do flag. INSTRU€ÇO STC Prop¢sito: Ativar o flag de carry. Sintaxe: STC Esta instru‡Æo ajusta para 1 o flag CF. INSTRU€ÇO STD Prop¢sito: Ativar o flag de endere‡o. Sintaxe: file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (51 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT STD Esta instru‡Æo ajusta para 1 o flag DF. INSTRU€ÇO STI Prop¢sito: Ativar o flag de insterrup‡Æo. Sintaxe: STI Esta instru‡Æo ativa o flag IF, e habilita interrup‡äes externas mascar veis (que s¢ funcionam quando IF = 1).***************************************************************************** CAPÖTULO 5: INTERRUP€åES E GERÒNCIA DE ARQUIVOS Conte£do: 5.1.Interrup‡äes 5.2.Gerenciamento de arquivos --------------- // --------------- Conte£do 5.1.1.Interrup‡äes de hardware interno 5.1.2.Interrup‡äes de hardware externo 5.1.3.Interrup‡äes de software 5.1.4.Interrup‡äes mais comuns 5.1.1.Interrup‡äes de hardware interno Interrup‡äes internas sÆo geradas por certos eventos que ocorrem durante a file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (52 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT execu‡Æo de um programa. Este tipo de interrup‡äes sÆo gerenciadas, na sua totalidade, pelo hardware e nÆo ‚ poss¡vel modific -las. Um exemplo claro deste tipo de interrup‡äes ‚ a que atualiza o contador do clock interno do computador, o hardware chama esta interrup‡Æo muitas vezes durante um segundo. NÆo nos ‚ permitido gerenciar diretamente esta interrup‡Æo, uma vez que nÆo se pode controlar a hora atualizada por software. Mas podemos usar seus efeitos no computador para o nosso benef¡cio, por exemplo para criar um virtual clock atualizado continuamente pelo contador interno de clock. Para tanto, precisamos apenas ler o valor atual do contador e o transformar num formato compreens¡vel pelo usu rio. --------------- // --------------- 5.1.2.Interrup‡äes de hardware externo Interrup‡äes externas sÆo geradas atrav‚s de dispositivos perif‚ricos, tais como teclados, impressoras, placas de comunica‡Æo, entre outros. SÆo tamb‚m geradas por co-processadores. NÆo ‚ poss¡vel desativar interrup‡äes externas. Estas interrup‡äes nÆo sÆo enviadas diretamente para a CPU, mas, de uma forma melhor, sÆo enviadas para um circuito integrado cuja fun‡Æo exclusiva ‚ manusear este tipo de interrup‡Æo. O circuito, chamado PIC8259A, ‚ controlado pela CPU atrav‚s de uma s‚rie de comunica‡Æo chamada paths. --------------- // --------------- 5.1.3.Interrup‡äes de software Interrup‡äes de software podem ser ativadas diretamente por nossos programas assembly, invocando o n£mero da interrup‡Æo desejada com a instru‡Æo INT. O uso das interrup‡äes facilita muito a cria‡Æo dos programas, torna-os menores. Al‚m disso, ‚ f cil compreendˆ-las e geram boa performance. file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (53 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT Este tipo de interrup‡äes podem ser separadas em duas categorias: Interrup‡äes do Sistema Operacional DOS e interrup‡äes do BIOS. A diferen‡a entre ambas ‚ que as interrup‡äes do sistema operacional sÆo mais f ceis de usar, mas tamb‚m sÆo mais lentas, uma vez que acessam os servi‡os do BIOS. Por outro lado, interrup‡äes do BIOS sÆo muito mais r pidas, mas possuem a desvantagem de serem parte do hardware, o que significa serem espec¡ficas … arquitetura do computador em questÆo. A escolha sobre qual o tipo de interrup‡Æo usar ir depender somente das caracter¡sticas que vocˆ deseja dar ao seu programa: velocidade (use BIOS), portabilidade (use DOS). --------------- // --------------- 5.1.4.Interrup‡äes mais comuns Conte£do 5.1.4.1.Int 21H (Interrup‡Æo do DOS) M£ltiplas chamadas … fun‡äes DOS. 5.1.4.2.Int 10H (Interrup‡Æo do BIOS) Entrada e Sa¡da de V¡deo. 5.1.4.3.Int 16H (Interrup‡Æo do BIOS) Entrada e Sa¡da do Teclado. 5.1.4.4.Int 17H (Interrup‡Æo do BIOS) Entrada e Sa¡da da Impressora. --------------- // --------------- 5.1.4.1.Interrup‡Æo 21H Prop¢sito: Chamar uma diversidade de fun‡äes DOS. Sintaxe: file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (54 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/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 interrup‡Æo tem muitas fun‡äes, para acessar cada uma delas ‚ necess rio que o n£mero correspondente da fun‡Æo esteja no registrador AH no momento da chamada da interrup‡Æo. Fun‡äes para mostrar informa‡äes no v¡deo. 02H Exibe um caracter 09H Exibe uma cadeia de caracteres 40H Escreve num dispositivo/arquivo Fun‡äes para ler informa‡äes do teclado. 01H Entrada do teclado 0AH Entrada do teclado usando buffer 3FH Leitura de um dispositivo/arquivo Fun‡äes para trabalhar com arquivos. Nesta se‡Æo sÆo apenas especificadas as tarefas de cada fun‡Æo, para uma referˆncia acerca dos conceitos usados, veja Introdu‡Æo ao gerenciamento de arquivos. M‚todo FCB 0FH Abertura de arquivo 14H Leitura seq•encial 15H Escrita seq•encial 16H Cria‡Æo de arquivo 21H Leitura rand“mica 22H Escrita rand“mica Handles 3CH Cria‡Æo de arquivo 3DH Abertura de arquivo 3EH Fechamento de arquivo 3FH Leitura de arquivo/dispositivo file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (55 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT 40H Escrita de arquivo/dispositivo 42H Move ponteiro de leitura/escrita num arquivo FUN€ÇO 02H Uso: Mostra um caracter na tela. Registradores de chamada: AH = 02H DL = Valor de caracter a ser mostrado. Registradores de retorno: Nenhum. Esta fun‡Æo mostra o caracter cujo c¢digo hexadecimal corresponde ao valor armazenado no registrador DL, e nÆo modifica nenhum registrador. O uso da fun‡Æo 40H ‚ recomendado ao inv‚s desta fun‡Æo. FUN€ÇO 09H Uso: Mostra uma cadeia de caracteres na tela. Registradores de chamada: AH = 09H DS:DX = Endere‡o de in¡cio da cadeia de caracteres. Registradores de retorno: Nenhum. Esta fun‡Æo mostra os caracteres, um por um, a partir do endere‡o indicado file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (56 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT nos registradores DS:DX at‚ encontrar um caracter $, que ‚ interpretado como fim da cadeia. • recomendado usar a fun‡Æo 40H ao inv‚s desta. FUN€ÇO 40H Uso: Escrever num dispositivo ou num arquivo. Registradores de chamada: AH = 40H BX = N£mero do handle CX = Quantidade de bytes a gravar DS:DX = µrea onde est o dado Registradores de retorno: CF = 0 se nÆo houve erro AX = N£mero de bytes escrito CF = 1 se houve erro AX = C¢digo de erro Para usar esta fun‡Æo para mostrar a informa‡Æo na tela, fa‡a o registrador BX ser igual a 1, que ‚ o valor default para o v¡deo no DOS. FUN€ÇO 01H Uso: Ler um caracter do teclado e mostr -lo. Registradores de chamada file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT (57 of 95)28/09/2004 17:10:35 file:///C|/cursos_e_livros_cd/informática/programação/assembler/ASMPOR.TXT AH = 01H Registradores de retorno: AL = Caracter lido • muito f cil ler um caracter do teclado com esta fun‡Æo, o c¢digo hexadecimal do caracter
Compartilhar