Você está na página 1de 4

ASSEMBLER

Os programas que usamos no nosso dia-a-dia e aqueles que criaremos


estaro em algum lugar da rea disponvel para o usurio, isto , entre o endereo
00500h e 9ffffh. difcil precisar exatamente o inicio desta rea, pois ele depende
do tamanho do DOS utilizado.

Para que um programa funcione adequadamente os registradores de


segmento devero%apontar para as 4 suas reas correspondentes, ou seja, o CS
(CODE%SEGMENT) dever indicar o incio do segmento onde esto as instrues
executveis do programa; o DS (DATA SEGMENT) devera indi7ar o inicio da rea
de dados usada pelo programa; e o SS (STACK1SEGMENT) deverapontar para o
incio do segmento usado com stack da mquina.

Sempre que uma instruo fizer referncia, ou apontar para uma outra
instruo (CALLs e JUMPs), o endereo desejado ser obtido pelo valor do offset
contado partir do incio do segmento apontado pelo CS. Sempre que uma
instruo fizer referncia a um dado (ler/gravar num determinado endereo) o
endereo ser obtido pelo DS. O mesmo vale para as operaes com o stack
(PUSHs e POPs), caso em que o apontador usado ser o SS.

As rotinas de carregamento de programas do Sistema Operacional se


incubem de posicionar os registradores nos seus devidos lugares, pois esses
endereos dependero de onde o programa estar sendo carregado. Como isso
automtico, resta saber onde estar ou qual ser a primeira instruo executada por
umj programa, para ento iniciarmos a criao dos nossos.

Quem j tem alguma prtica em Assembler Z80 (principalmente em CP/M)


encontrar um ambiente muito familiar nos programas com extenso .COM. Isto
porque esse tipo de programa de 64 Kbytes, ou seja, todos eles apontam para o
mesmo endereo inicial. Nestas circunstncias tudo se passa como se o micro s
tivesse 64 Kbytes de memria.

Quando esse tipo de programa criado, os primeiros 256 Bytes so


reservados para o prefixo do programa e o endereo inicial de execuo
estabelecido em 100h. A partir da tudo corre por conta do programa do usurio.

No caso dos programas .EXE a estrutura fica um pouco diferente, tambm


porm neste caso reservada uma rea para o prefixo do programa. A seguir so
definidos os outros segmentos e o endereo da primeira instruo do programa ser
exatamente o endereo inicial do segmento de cdigo.

Na verdade o programador no precisa se preocupar muito com isso, uma


vez que esses procedimentos e cdigos so automaticamente gerados e
manipulados pelo montador durante a criao do programa, ou pelo Sistema
Operacional, quando o programa executado.

Autor: Rodrigo Ferreira


Markus Vinicius Home Page
marvinro@uol.com.br
http://www.geocities.com/Yosemite/7160
Escrevendo programas e rotinas
Uma vez compreendido como e onde fica um programa na memria e
como cada segmento deve ser definido no montador utilizado, o passo seguinte
sair criando programas e rotinas. Mas para que tudo funcione perfeitamente ser
necessrio antes traar alguns mapas e escrever alguns guias de sobrevivncia.

Lpis e papel na mo, a primeira providncia traduzir em palavras o que


se quer criar em linguagem de mquina. Mas importante lembrar que em
Assembler as coisas no so como no Basic, onde para imprimir alguma coisa no
vdeo basta fazer um PRINT. Em Assembler, para escrever uma mensagem na tela
ser necessrio lanar mo de uma rotina que, vista fora do seu contexto, no
possui nenhum elemento que a caracterize como um rotina de impresso. Por causa
disso que o programador Assembler deve ser muito mais meticuloso e racional do
que os outros programadores - para se salvar na selva de instrues w
mnemnicos de um programa.

Uma vez definido o tipo de programa a ser criado, parte-se para a criao
das rotinas bsicas, ou seja, impresso na tela, acesso ao teclado, gravao em
disco, etc.

Desvios e saltos do Assembler


A essncia dos programas escritos em linguagem de mquina pode ser
descrita como um amontoado de comparaes e desvios. De fato, na maior parte
do tempo de execuo de um programa esto ocorrendo milhares de testes e
cheques entre valores, condies, tabelas, tempo, etc. O bom senso nos diz que
logo aps uma comparao ocorrer, ou no, um desvio. Caso isso no ocorra,
ento no faz o menor sentido a operao de comparao.

Para se comparar coisas em Assembler basta usar uma instruo CMP


(COMPARE), ou at mesmo uma subtrao. J em relao aos desvios a coisa se
complica um pouco, pois os computadores da linha PC so dotados de um set
variado de instrues de salto, divididos em condicionais e incondicionais.

Os desvios incondicionais
Os desvios incondicionais so executados, como o nome indica, quando
no h nenhuma condio a ser verificada para a realizao do salto. O programa
simplesmente encontra uma instruo JMP e desvia a execuo para o endereo
determinado. Traduzindo isto para o computs, o fato que um computador 486
possui um registrador de 64 bits cuja funo apontar para o endereo da instruo
que est sendo executada naquele exato momento. Quando os ciclos que uma

Autor: Rodrigo Ferreira


Markus Vinicius Home Page
marvinro@uol.com.br
http://www.geocities.com/Yosemite/7160
instruo terminam, o IP estar apontando para o endereo da prxima instruo a
ser executada. Por tanto, um salto ou desvio nada mais do que a alterao do
valor presente no registrador IP.

O salto incondicional pode ter trs aspectos distintos: o endereo de


destino est perto (SHORT) do endereo de origem; o endereo de destino est
mais ou menos distantes (NEAR); o endereo de destino est muito longe (FAR) do
endereo de origem.

Em Assembler dizemos que um salto curto (SHORT), ou perto quando o


destino se encontra, no mximo, a 128 bytes de distncia da origem, para a frente
ou para trs.

Os desvios condicionais
Os desvios condicionais s so executados quando uma determinada
condio se verifica verdadeira. Na totalidade dos casos, a condio requerida diz
respeito a uma flag da CPU e as instrues de desvio devero preceder a algum
tipo de comparao.

O Processador 486 possui um grupo bastante interessante de instrues de


santo condicional, embora apenas dois tipos de instruo bastassem para resolver
noventa porcento dos problemas de programao.

Em que pese essa aparente flexibilidade algo no funcionou corretamente


nas cabeas dos criadores do 486 pois esse tipo de instruo s aceita o desvio
short, o seja, distante o mximo 128 bytes do endereo de origem. Isto no chega a
ser um problema, porm as fontes dos programas mais extensos comeam a ficar
cheios de jumps condicionais cujos endereos de destino anotam para jumps
incondicionais, a fim de quebrar a barreira dos 128 bytes. Para o computador isto
no implica em trabalho dobrado, porm causa algum transtorno na compreenso e
depurao de programas e rotinas.

Como usar um desvio condicional


Como j vimos, uma comparao nada mais do que uma subtrao
simulada entre dois registradores ou valores. A regra geral que o segundo
operando ser subtrado do primeiro operando. Dessa forma a instruo CMP
AX,BX produz um resultado deferente da instruo CMP BX,AX. No primeiro caso, o
microcomputador far a operao AX-BX e no segundo caso o inverso, ou seja BX-
AX.

As aparncias enganam

Autor: Rodrigo Ferreira


Markus Vinicius Home Page
marvinro@uol.com.br
http://www.geocities.com/Yosemite/7160
Aparentemente nada do que foi exposto neste trabalho tem maior
importncia visto que a codificao das instrues a principal tarefa do montador
e, de certa forma, transparente ao usurio. No entanto, deixar tudo por conta do
montador pode se mostrar uma poltica de resultados catastrficos mais adiante.

Isto precisa ser muito em compreendido, pois a evoluo dos programas


montadores tem aproximado cada vez mais o Assembler em linguagem de alto nvel.
O preo a ser pago por isso pode muito bem ser a ineficincia dos programas ou
resultados insatisfatrios

Ao usar o Turbo Assembler e se for possvel determinar que o jump curto,


aconselhvel ento utilizar a instruo JMP SHORT Destino. A palavra SHORT
obrigar o montador a s gastar os dois bytes necessrios ao desvio.

Outro aspecto curioso do Turbo Assembler que ele possui uma diretiva
chamada JUMPS. Quando esta diretiva acionada , todos os desvios condicionais
de um programa que excedeu 128 bytes no geraro um erro, porm o montador ir
criar uma seqncia de instrues alternando a condio do desvio e usando para
o salto um desvio incondicional. Desta forma, se a instruo JZ CHEGUEI estiver
fora do alcance, o Turbo Assembler ir assemblar algo parecido com:

jnz ABC
jmp CHEGUEI
ABC:

Programa desenvolvido em linguagem assembler


-n rotina.com [ENTER]
-a [ENTER]

-n rotina.com [ENmov ds,ax [ENTERER]

CX 0000
:6 [ENTER]
-w [ENTER[ENTER]
-rcx [ENTER]
CX 0000
:6 [ENTER]
-w [ENTER]
Writing 0006 bytes
-q [ENTER]

Bibliografia
Revista Micro Sistemas - pgs. 18,19,20,21,22,23,24 e 25.

Autor: Rodrigo Ferreira


Markus Vinicius Home Page
marvinro@uol.com.br
http://www.geocities.com/Yosemite/7160

Você também pode gostar