Vous êtes sur la page 1sur 16

Page 1 of 16

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

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

Conte£do:

CAPÖTULO 1: INTRODU€ÇO

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:

http://www.b4silisco.com/ASMPOR.TXT

21/7/2009

Page 2 of 16

Uma se‡Æo completa sobre como usar o programa debug. Mais exemplos de programas. Um motor de pesquisa, para qualquer t¢pico ou item relacionado … esta nova versÆo. Consider vel reorganiza‡Æo e revisÆo do material Assembly. Em cada se‡Æo, h um link para o Dicion rio On-line de Computa‡Æo de Dennis Howe.

1.2.Apresenta‡Æo:

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

O tutorial est completamente focado em computadores com processadores 80x86

da fam¡lia Intel, e considerando que a base da linguagem ‚ o funcionamento dos recursos internos do processador, os exemplos descritos nÆo sÆo

compat¡veis com qualquer outra arquitetura.

As informa‡äes estÆo dispostas em unidades ordenadas para permitir f cil acesso a cada t¢pico, bem como uma melhor navega‡Æo pelo tutorial.

Na se‡Æo introdut¢ria sÆo mencionados alguns conceitos elementares sobre computadores e a Linguagem Assembly em si.

1.3.Por que aprender Assembly?

A primeira razÆo para se trabalhar com o assembler ‚ a oportunidade de

conhecer melhor o funcionamento do seu PC, o que permite o desenvolvimento

de programas de forma mais consistente.

A segunda razÆo ‚ que vocˆ pode ter um controle total sobre o PC ao fazer

uso do assembler.

Uma outra razÆo ‚ que programas assembly sÆo mais r pidos, menores e mais poderosos do que os criados com outras linguagens.

Ultimamente, o assembler (montador) permite uma otimiza‡Æo ideal nos programas, seja no seu tamanho ou execu‡Æo.

1.4.N¢s precisamos da sua opiniÆo:

Nosso intuito ‚ oferecer um modo simples para que vocˆ consiga aprender Assembly por si mesmo. Por tanto, qualquer coment rio ou sugestÆo ser bem-vinda.

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

CAPÖTULO 2: CONCEITOS BµSICOS

Conte£do:

2.1.Descri‡Æo b sica de um sistema computacional. 2.2.Conceitos b sicos da Linguagem Assembly 2.3.Usando o programa debug

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

Esta se‡Æo tem o prop¢sito de fazer um breve coment rio a respeito dos principais componentes de um sistema computacional, o que ir permitir ao usu rio uma melhor compreensÆo dos conceitos propostos no decorrer do tutorial.

http://www.b4silisco.com/ASMPOR.TXT

21/7/2009

Page 3 of 16

2.1.DESCRIۂO DE UM SISTEMA COMPUTACIONAL

Conte£do:

2.1.1.Processador Central 2.1.2.Mem¢ria Principal 2.1.3.Unidades de Entrada e Sa¡da 2.1.4.Unidades de Mem¢ria Auxiliar

Sistema Computacional.

Chamamos de Sistema Computacional a completa configura‡Æo de um computador, incluindo os perif‚ricos e o sistema operacional.

2.1.1.Processador Central.

tamb‚m conhecido por CPU ou Unidade Central de Processamento, que por sua vez ‚ composta pela unidade de controle e unidade de l¢gica e aritm‚tica. Sua fun‡Æo consiste na leitura e escrita do conte£do das c‚lulas de mem¢ria, regular o tr fego de dados entre as c‚lulas de mem¢ria e registradores especiais, e decodificar e executar as instru‡äes de um programa.

O processador tem uma s‚rie de c‚lulas de mem¢ria usadas com freq ˆncia e,

dessa forma, sÆo partes da CPU. Estas c‚lulas sÆo conhecidas com o nome de registradores. Um processador de um PC possui cerca de 14 registradores. Como os PCs tem sofrido evolu‡Æo veremos que podemos manipular registradores

de 16 ou 32 bits.

A

unidade de l¢gica e aritm‚tica da CPU realiza as opera‡äes relacionadas ao

c

lculo simb¢lico e num‚rico. Tipicamente estas unidades apenas sÆo capazes

de realizar opera‡äes elementares, tais como: adi‡Æo e subtra‡Æo de dois n£meros inteiros, multiplica‡Æo e divisÆo de n£mero inteiro, manuseio de

bits de registradores e compara‡Æo do conte£do de dois registradores.

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

2.1.2.Mem¢ria Principal.

um grupo de c‚lulas, agora sendo fabricada com semi-condutores, usada para processamentos gerais, tais como a execu‡Æo de programas e o armazenamento de informa‡äes para opera‡äes.

Cada uma das c‚lulas pode conter um valor num‚rico e ‚ capaz de ser endere‡ada, isto ‚, pode ser identificada de forma singular em rela‡Æo …s outras c‚lulas pelo uso de um n£mero ou endere‡o.

O nome gen‚rico destas mem¢rias ‚ Random Access Memory ou RAM. A principal

desvantagem deste tipo de mem¢ria ‚ o fato de que seus circuitos integrados perdem a informa‡Æo que armazenavam quando a energia el‚trica for interrompida, ou seja, ela ‚ vol til. Este foi o motivo que levou … cria‡Æo de um outro tipo de mem¢ria cuja informa‡Æo nÆo ‚ perdida quando o sistema ‚ desligado. Estas mem¢rias receberam o nome de Read Only Memory ou ROM.

2.1.3.Unidades de Entrada e Sa¡da.

Para que o computador possa ser £til para n¢s se faz necess rio que o

http://www.b4silisco.com/ASMPOR.TXT

21/7/2009

Page 4 of 16

processador se comunique com o exterior atrav‚s de interfaces que permitem a entrada e a sa¡da de informa‡Æo entre ele e a mem¢ria. Atrav‚s do uso destas comunica‡äes ‚ poss¡vel introduzir informa‡Æo a ser processada e mais tarde visualizar os dados processados.

Algumas das mais comuns unidades de entrada sÆo o teclado e o mouse. As mais comuns unidades de sa¡da sÆo a tela do monitor e a impressora.

2.1.4.Unidades de Mem¢ria Auxiliar.

Considerando o alto custo da mem¢ria principal e tamb‚m o tamanho das aplica‡äes atualmente, vemos que ela ‚ muito limitada. Logo, surgiu a necessidade da cria‡Æo de dispositivos de armazenamento pr ticos e econ“micos.

Estes e outros inconvenientes deram lugar …s unidades de mem¢ria auxiliar, perif‚ricos. As mais comuns sÆo as fitas e os discos magn‚ticos.

A informa‡Æo ali armazenada ser dividida em arquivos. Um arquivo ‚ feito de

um n£mero vari vel de registros, geralmente de tamanho fixo, podendo conter informa‡Æo ou programas.

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

2.2.CONCEITOS BµSICOS

Conte£do:

2.2.1.Informa‡äes nos computadores 2.2.2.M‚todos de representa‡Æo de dados

2.2.1.Informa‡Æo no computador:

2.2.1.1.Unidades de informa‡Æo 2.2.1.2.Sistemas num‚ricos 2.2.1.3.Convertendo n£meros bin rios para decimais 2.2.1.4.Convertendo n£meros decimais para bin rios 2.2.1.5.Sistema hexadecimal

2.2.1.1.Unidades de informa‡Æo

Para o PC processar a informa‡Æo, ‚ necess rio que ela esteja em c‚lulas especiais, chamadas registradores.

Os registradores sÆo grupos de 8 ou 16 flip-flops.

Um flip-flop ‚ um dispositivo capaz de armazenar 2 n¡veis de voltagem, um baixo, geralmente 0.5 volts, e outro comumente de 5 volts. O n¡vel baixo de energia no flip-flop ‚ interpretado como desligado ou 0, e o n¡vel alto, como ligado ou 1. Estes estados sÆo geralmente conhecidos como bits, que sÆo

a menor unidade de informa‡Æo num computador.

Um grupo de 16 bits ‚ conhecido como palavra; uma palavra pode ser dividida em grupos de 8 bits chamados bytes, e grupos de 4 bits chamados nibbles.

2.2.1.2.Sistemas num‚ricos

http://www.b4silisco.com/ASMPOR.TXT

21/7/2009

Page 5 of 16

O sistema num‚rico que n¢s usamos diariamente ‚ o decimal, mas este sistema

nÆo ‚ conveniente para m quinas, pois ali as informa‡äes tˆm que ser codificadas de modo a interpretar os estados da corrente (ligado-desligado); este modo de c¢digo faz com que tenhamos que conhecer o c lculo posicional que nos permitir expressar um n£mero em qualquer base onde precisarmos dele.

poss¡vel representar um determinado n£mero em qualquer base atrav‚s da seguinte f¢rmula:

Onde n ‚ a posi‡Æo do d¡gito, iniciando da direita para a esquerda e numerando de 0. D ‚ o d¡gito sobre o qual n¢s operamos e B ‚ a base num‚rica usada.

2.2.1.3.Convertendo n£meros bin rios para decimais

Quando trabalhamos com a Linguagem Assembly encontramos por acaso a necessidade de converter n£meros de um sistema bin rio, que ‚ usado em computadores, para o sistema decimal usado pelas pessoas.

O sistema bin rio ‚ baseado em apenas duas condi‡äes ou estados, estar ligado(1), ou desligado(0), portanto sua base ‚ dois.

Para a conversÆo, podemos usar a f¢rmula de valor posicional:

Por exemplo, se tivermos o n£mero bin rio 10011, tomamos cada d¡gito da direita para a esquerda e o multiplicamos pela base, elevando … potˆncia correspondente … sua posi‡Æo relativa:

Binary:

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

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,

http://www.b4silisco.com/ASMPOR.TXT

21/7/2009

Page 6 of 16

estas letras representam os n£meros de 10 a 15. Portanto contamos:

0,1,2,3,4,5,6,7,8,9,A,B,C,D,E, e F.

A conversÆo entre n£meros bin rios e hexadecimais ‚ f cil. A primeira coisa

a fazer ‚ dividir o n£mero bin rio em grupos de 4 bits, come‡ando da direita para a esquerda. Se no grupo mais … direita sobrarem d¡gitos, completamos com zeros.

Tomando como exemplo o n£mero bin rio 101011, vamos dividi-lo em grupos de 4

bits:

10;1011

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

0010;1011

A seguir, tomamos cada grupo como um n£mero independente e consideramos o seu valor decimal:

0010=2;1011=11

Entretanto, observa-se que nÆo podemos representar este n£mero como 211,

isto seria um erro, uma vez que os n£meros em hexa maiores que 9 e menores

que 16 sÆo representados pelas letras A,B,

resultado:

,F.

Logo, obtemos como

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

Para a conversÆo de um n£mero hexadecimal em bin rio ‚ apenas necess rio inverter os passos: tomamos o primeiro d¡gito hexadecimal e o convertemos para bin rio, a seguir o segundo, e assim por diante.

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

2.2.2.M‚todos de representa‡Æo de dados num computador.

2.2.2.1.C¢digo ASCII 2.2.2.2.M‚todo BCD 2.2.2.3.Representa‡Æo de ponto flutuante

2.2.2.1.C¢digo ASCII

ASCII significa American Standard Code for Information Interchange. Este c¢digo cont‚m as letras do alfabeto, d¡gitos decimais de 0 a 9 e alguns s¡mbolos adicionais como um n£mero bin rio de 7 bits, tendo o oitavo bit em 0, ou seja, desligado.

Deste modo, cada letra, d¡gito ou caracter especial ocupa 1 byte na mem¢ria do computador.

Podemos observar que este m‚todo de representa‡Æo de dados ‚ muito ineficiente no aspecto num‚rico, uma vez que no formato bin rio 1 byte nÆo ‚ suficiente para representar n£meros de 0 a 255, com o ASCII podemos representar apenas um d¡gito.

Devido a esta ineficiˆncia, o c¢digo ASCII ‚ usado, principalmente, para a representa‡Æo de textos.

http://www.b4silisco.com/ASMPOR.TXT

21/7/2009

Page 7 of 16

2.2.2.2.M‚todo BCD

BCD significa Binary Coded Decimal.

Neste m‚todo grupos de 4 bits sÆo usados para representar cada d¡gito decimal de 0 a 9. Com este m‚todo podemos representar 2 d¡gitos por byte de informa‡Æo.

Vemos que este m‚todo vem a ser muito mais pr tico para representa‡Æo num‚rica do que o c¢digo ASCII. Embora ainda menos pr tico do que o bin rio, com o m‚todo BCD podemos representar d¡gitos de 0 a 99. Com o bin rio, vemos que o alcance ‚ maior, de 0 a 255.

Este formato (BCD) ‚ principalmente usado na representa‡Æo de n£meros grandes, aplica‡äes comerciais, devido …s suas facilidades de opera‡Æo.

2.2.2.3.Representa‡Æo de ponto flutuante

Esta representa‡Æo ‚ baseada em nota‡Æo cient¡fica, isto ‚, representar um n£mero em 2 partes: sua base e seu expoente.

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

O expoente negativo, por outro lado, indica o n£mero de casas que o ponto decimal deve se locomover para a esquerda.

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

2.3.PROGRAMA DEBUG

Conte£do:

2.3.1.Processo de cria‡Æo de programas 2.3.2.Registradores da CPU 2.3.3.Programa debug 2.3.4.Estrutura Assembly 2.3.5.Criando um programa assembly simples 2.3.6.Armazenando e carregando os programas

2.3.1.Processo de cria‡Æo de programas.

Para a cria‡Æo de programas sÆo necess rios os seguintes passos:

* Desenvolvimento do algoritmo, est gio em que o problema a ser solucionado ‚ estabelecido e a melhor solu‡Æo ‚ proposta, cria‡Æo de diagramas esquem ticos relativos … melhor solu‡Æo proposta.

* Codifica‡Æo do algoritmo, o que consiste em escrever o programa em alguma linguagem de programa‡Æo; linguagem assembly neste caso espec¡fico, tomando como base a solu‡Æo proposta no passo anterior.

* A transforma‡Æo para a linguagem de m quina, ou seja, a cria‡Æo do programa objeto, escrito como uma seq ˆncia de zeros e uns que podem ser interpretados pelo processador.

* O £ltimo est gio ‚ a elimina‡Æo de erros detectados no programa na fase de teste. A corre‡Æo normalmente requer a repeti‡Æo de todos os passos, com observa‡Æo atenta.

http://www.b4silisco.com/ASMPOR.TXT

21/7/2009

Page 8 of 16

2.3.2.Registradores da CPU.

Para o prop¢sito did tico, vamos focar registradores de 16 bits. A CPU possui 4 registradores internos, cada um de 16 bits. SÆo eles AX, BX, CX e DX. SÆo registradores de uso geral e tamb‚m podem ser usados como registradores de 8 bits. Para tanto devemos referenci -los como, por exemplo, AH e AL, que sÆo, respectivamente, o byte high e o low do

registrador AX. Esta nomenclatura tamb‚m se aplica para os registradores BX,

CX

e DX.

Os

registradores, segundo seus respectivos nomes:

AX

Registrador Acumulador

BX

Registrador Base

CX

Registrador Contador

DX

Registrador de Dados

DS

Registrador de Segmento de Dados

ES

Registrador de Segmento Extra

SS

Registrador de Segmento de Pilha

CS

Registrador de Segmento de C¢digo

BP

Registrador Apontador da Base

SI

Registrador de Öndice Fonte

DI

Registrador de Öndice Destino

SP

Registrador Apontador de Pilha

IP

Registrador Apontador da Pr¢xima Instru‡Æo

F Registrador de Flag

2.3.3.Programa Debug.

Para a cria‡Æo de um programa em assembler existem 2 op‡äes: usar o TASM - Turbo Assembler da Borland, ou o DEBUGGER. Nesta primeira se‡Æo vamos usar o debug, uma vez que podemos encontr -lo em qualquer PC com o MS-DOS.

Debug pode apenas criar arquivos com a extensÆo .COM, e por causa das caracter¡sticas deste tipo de programa, eles nÆo podem exceder os 64 Kb, e tamb‚m devem iniciar no endere‡o de mem¢ria 0100H dentro do segmento espec¡fico. importante observar isso, pois deste modo os programas .COM nÆo sÆo reloc veis.

Os

principais comandos do programa debug sÆo:

A

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]

-

http://www.b4silisco.com/ASMPOR.TXT

21/7/2009

Page 9 of 16

Vocˆ notar entÆo a presen‡a de um h¡fen no canto inferior esquerdo da tela. NÆo se espante, este ‚ o prompt do programa. Para visualizar o conte£do dos registradores, experimente:

-r[Enter]

AX=0000 BX=0000 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.

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.

http://www.b4silisco.com/ASMPOR.TXT

21/7/2009

Page 10 of 16

NÆo nos responsabilizaremos pela m execu‡Æo ou poss¡veis danos causados por quaisquer exemplos que de agora em diante aparecerÆo, uma vez que os mesmos, apesar de testados, sÆo de car ter did tico. Vamos, entÆo, criar um programa para ilustrar o que vimos at‚ agora. Adicionaremos dois valores:

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

Para montar um programa no Debug, ‚ usado o comando "a" (assemble); quando usamos este comando, podemos especificar um endere‡o inicial para o nosso programa como o parƒmetro, mas ‚ opcional. No caso de omissÆo, o endere‡o inicial ‚ o especificado pelos registradores CS:IP, geralmente 0100h, o local em que programas com extensÆo .COM devem iniciar. E ser este o local que usaremos, uma vez que o Debug s¢ pode criar este tipo de programa.

Embora neste momento nÆo seja necess rio darmos um parƒmetro ao comando "a", isso ‚ recomend vel para evitar problemas, logo:

a 100[enter]

mov ax,0002[enter]

mov bx,0004[enter] add ax,bx[enter] nop[enter][enter]

O que o programa faz? Move o valor 0002 para o registrador ax, move o valor

0004 para o registrador bx, adiciona o conte£do dos registradores ax e bx, guardando o resultado em ax e finalmente a instru‡Æo nop (nenhuma opera‡Æo) finaliza o programa.

No programa debug, a tela se parecer com:

C:\>debug

-a 100 0D62:0100 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 0D62:0106 01D8

SS=0D62 CS=0D62 IP=0106

ADD

AX,BX

NV UP EI PL NZ NA PO NC

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 0D62:0108 90

SS=0D62 CS=0D62 IP=0108 NOP

NV UP EI PL NZ NA PE NC

A possibilidade dos registradores conterem valores diferentes existe, mas AX

http://www.b4silisco.com/ASMPOR.TXT

21/7/2009

Page 11 of 16

e BX devem conter os mesmos valores acima descritos.

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

2.3.6.Armazenando e carregando os programas.

NÆo seria pr tico ter que digitar o programa cada vez que inici ssemos o Debug. Ao inv‚s disso, podemos armazen -lo no disco. S¢ que o mais interessante nisso ‚ que um simples comando de salvar cria um arquivo com a extensÆo .COM, ou seja, execut vel - sem precisarmos efetuar os processos de montagem e liga‡Æo, como veremos posteriormente com o TASM.

Eis os passos para salvar um programa que j esteja na mem¢ria:

* Obter o tamnho do programa subtraindo o endere‡o final do endere‡o inicial, naturalmente que no sistema hexadecimal.

* Dar um nome ao programa.

* Colocar o tamanho do programa no registrador CX.

* Mandar o debug gravar o programa em disco.

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

0C1B:0100 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

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.

que ele nos

-h 10a 100

020a 000a

O

comando "n" permite-nos nomear o programa.

-n

test.com

O comando "rcx" permite-nos mudar o conte£do do registrador CX para o valor obtido como tamanho do arquivo com o comando "h", neste caso 000a.

-rcx

CX 0000

:000a

Finalmente, o comando "w" grava nosso programa no disco, indicando quantos bytes gravou.

-w

Writing 000A bytes

Para j salvar um arquivo quando carreg -lo, 2 passos sÆo necess rios:

Dar o nome do arquivo a ser carregado. Carreg -lo usando o comando "l" (load).

Para obter o resultado correto destes passos, ‚ necess rio que o programa acima j esteja criado.

http://www.b4silisco.com/ASMPOR.TXT

21/7/2009

Page 12 of 16

Dentro do Debug, escrevemos o seguinte:

-n test.com

-l

-u 100 109 0C3D:0100 B80200 MOV AX,0002 0C3D:0103 BB0400 MOV BX,0004 0C3D:0106 01D8 ADD AX,BX

0C3D:0108 CD20 INT 20

O £ltimo comando "u" ‚ usado para verificar que o programa foi carregado na mem¢ria. O que ele faz ‚ desmontar o c¢digo e mostr -lo em assembly. Os parƒmetros indicam ao Debug os endere‡os inicial e final a serem desmontados.

O Debug sempre carrega os programas na mem¢ria no endere‡o 100h, conforme j comentamos.

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

CAPÖTULO 3: PROGRAMA€ÇO ASSEMBLY

Conte£do:

3.1.Construindo programas em Assembly 3.2.Processo Assembly 3.3.Pequenos programas em Assembly 3.4.Tipos de instru‡äes

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

3.1.Construindo programas em Assembly.

3.1.1.Software necess rio 3.1.2.Programa‡Æo Assembly

3.1.1.SOFTWARE NECESSµRIO

Para que possamos criar um programa, precisamos de algumas ferramentas:

Primeiro de um editor para criar o programa fonte. Segundo de um montador, um programa que ir transformar nosso fonte num programa objeto. E, terceiro, de um linker (ligador) que ir gerar o programa execut vel a partir do programa objeto.

O editor pode ser qualquer um que dispusermos. O montador ser o TASM macro assembler da Borland, e o linker ser o TLINK, tamb‚m da Borland.

N¢s devemos criar os programas fonte com a extensÆo .ASM para que o TASM reconhe‡a e o transforme no programa objeto, um "formato intermedi rio" do programa, assim chamado porque ainda nÆo ‚ um programa execut vel e tÆo pouco um programa fonte. O linker gera a partir de um programa .OBJ, ou da

combina‡Æo de v rios deles, um programa execut vel, cuja extensÆo ‚ normalmente .EXE, embora possa ser .COM dependendo da forma como for montado

e ligado.

3.1.2.PROGRAMAۂO ASSEMBLY

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

http://www.b4silisco.com/ASMPOR.TXT

21/7/2009

Page 13 of 16

importante incluir as seguintes diretivas assembly:

.MODEL SMALL Define o melo de mem¢ria a usar em nosso programa

.CODE Define as instru‡äes do programa, relacionado ao segmento de c¢digo

.STACK Reserva espa‡o de mem¢ria para as instru‡äes de programa na pilha

END Finaliza um programa assembly

Vamos programar

Primeiro passo

Use qualquer editor para criar o programa fonte. Entre com as seguintes linhas:

Primeiro exemplo

; use ; para 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

mov ah,4ch ;move o valor 4ch para o registrador ah

int 21h

;interrup‡Æo 10h

;interrup‡Æo 21h ;finaliza o c¢digo do programa

END

Este programa assembly muda o tamanho do cursor.

Segundo passo

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

Terceiro passo

Usar o programa TASM para construir o programa objeto.

Exemplo:

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

Assembling file:

exam1.asm

Error messages:

None

Warning messages: None

Passes:

Remaining memory: 471k

1

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.

http://www.b4silisco.com/ASMPOR.TXT

21/7/2009

Page 14 of 16

Exemplo:

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

C:\>

Onde exam1.obj ‚ o nome do programa intermedi rio, .OBJ. O comando acima gera diretamente o arquivo com o nome do programa intermedi rio e a extensÆo .EXE. opcional a coloca‡Æo da extensÆo .obj no comando.

Quinto passo

Executar o programa execut vel criado.

C:\>exam1[enter]

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

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

3.2.Processo Assembly.

3.2.1.Segmentos

3.2.2.Tabela de equivalˆncia

3.2.1.SEGMENTOS

A arquitetura dos processadores x86 for‡a-nos a usar segmentos de mem¢ria

para gerenciar a informa‡Æo, o tamanho destes segmentos ‚ de 64Kb.

A razÆo de ser destes segmentos ‚ que, considerando que o tamanho m ximo de

um n£mero que o processador pode gerenciar ‚ dado por uma palavra de 16 bits ou registrador, assim nÆo seria poss¡vel acessar mais do que 65536 locais da

mem¢ria usando apenas um destes registradores. Mas agora, se a mem¢ria do PC

‚ dividida em grupos de segmentos, cada um com 65536 locais, e podemos usar

um endere‡o ou registrador exclusivo para encontrar cada segmento, e ainda fazemos cada endere‡o de um espec¡fico slot com dois registradores, nos ‚ poss¡vel acessar a quantidade de 4294967296 bytes de mem¢ria, que ‚, atualmente, a maior mem¢ria que podemos instalar num PC.

Desta forma, para que o montador seja capaz de gerenciar os dados, se faz necess rio que cada informa‡Æo ou instru‡Æo se encontre na rea correspondente ao seu segmento. O endere‡o do segmento ‚ fornecido ao montador pelos registradores DS, ES, SS e CS. Lembrando um programa no Debug, observe:

1CB0:0102 MOV AX,BX

O primeiro n£mero 1CB0, corresponde ao segmento de mem¢ria que est sendo

usado, o segundo ‚ uma referˆncia ao endere‡o dentro do segmento, ‚ um deslocamento dentro do segmento offset.

O modo usado para indicar ao montador com quais segmentos vamos trabalhar ‚ fazendo uso das diretivas .CODE, .DATA e .STACK.

O montador ajusta o tamanho dos segmentos tomando como base o n£mero de

bytes que cada instru‡Æo assembly precisa, j que seria um desperd¡cio de mem¢ria usar segmentos inteiros. Por exemplo, se um programa precisa de apenas 10Kb para armazenar dados, o segmento de dados seria apenas de 10Kb e nÆo de 64Kb, como poderia acontecer se feito manualmente.

http://www.b4silisco.com/ASMPOR.TXT

21/7/2009

Page 15 of 16

3.2.2.TABELAS DE EQUIVALÒNCIA

Cada uma das partes numa linha de c¢digo assembly ‚ conhecida como token, por exemplo:

MOV AX,Var

Aqui temos trˆs tokens, a instru‡Æo MOV, o operador AX e o operador VAR. O que o montador faz para gerar o c¢digo OBJ ‚ ler cada um dos tokens e procurar a equivalˆncia em c¢digo de m quina em tabelas correspondentes, seja de palavras reservadas, tabela de c¢digos de opera‡Æo, tabela de s¡mbolos, tabela de literais, onde o significado dos mnem“nicos e os endere‡os dos s¡mbolos que usamos serÆo encontrados.

A maioria dos montadores sÆo de duas passagens. Em s¡ntese na primeira

passagem temos a defini‡Æo dos s¡mbolos, ou seja, sÆo associados endere‡os a

todas as instru‡äes do programa. Seguindo este processo, o assembler lˆ MOV

e

procura-o na tabela de c¢digos de opera‡Æo para encontrar seu equivalente

na

linguagem de m quina. Da mesma forma ele lˆ AX e encontra-o na tabela

correspondente como sendo um registrador. O processo para Var ‚ um pouco diferenciado, o montador verifica que ela nÆo ‚ uma palavra reservada, entÆo procura na tabela de s¡mbolos, l encontrando-a ele designa o endere‡o correspondente, mas se nÆo encontrou ele a insere na tabela para que ela possa receber um endere‡o na segunda passagem. Ainda na primeira passagem ‚ executado parte do processamento das diretivas, ‚ importante notar que as diretivas nÆo criam c¢digo objeto. Na passagem dois sÆo montadas as instru‡äes, traduzindo os c¢digos de opera‡Æo e procurando os endere‡os, e ‚ gerado o c¢digo objeto.

H s¡mbolos que o montador nÆo consegue encontrar, uma vez que podem ser

declara‡äes externas. Neste caso o linker entra em a‡Æo para criar a estrutura necess ria a fim de ligar as diversas poss¡veis partes de c¢digo, dizendo ao loader que o segmento e o token em questÆo sÆo definidos quando o programa ‚ carregado e antes de ser executado.

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

3.3.Mais programas.

Outro exemplo

Primeiro passo

Use qualquer editor e crie o seguinte:

;exemplo2

.model small .stack .code mov ah,2h ;move o valor 2h para o registrador ah

mov dl,2ah ;move o valor 2ah para o registrador dl ;(‚ o valor ASCII do caractere *)

int 21h

mov ah,4ch ;fun‡Æo 4ch, sai para o sistema operacional

int 21h

;interrup‡Æo 21h

;interrup‡Æo 21h ;finaliza o programa

end

Segundo passo

Salvar o arquivo com o nome: exam2.asm NÆo esquecer de salvar em formato ASCII.

http://www.b4silisco.com/ASMPOR.TXT

21/7/2009

Page 16 of 16

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:

Remaining memory: 471k

1

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]

*

C:\>

Este programa imprime o caracter * na tela.

Clique aqui para obter mais programas

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

3.4.Tipos de instru‡äes.

3.4.1.Movimento de dados 3.4.2.Opera‡äes l¢gicas e aritm‚ticas 3.4.3.Saltos, la‡os e procedimentos

3.4.1.MOVIMENTO DE DADOS

Em qualquer programa h necessidade de se mover dados na mem¢ria e em registradores da CPU; h v rios modos de se fazˆ-lo: pode-se copiar os dados da mem¢ria para algum reg

http://www.b4silisco.com/ASMPOR.TXT

21/7/2009