Você está na página 1de 52

Linguagem Assembly Famlia Intel

Linguagem ASSEMBLY da Famlia INTEL


1

Introduo

Este texto apresenta uma descrio da linguagem de montagem do


microprocessador 8086/88. Este processador se tornou um enorme sucesso
comercial, no apenas mas sobretudo devido ao lanamento em 1981 do primeiro
microcomputador pessoal (PC) da IBM, que se baseava no 8088.

Figura 1: Diagrama de blocos da arquitetura interna de um processador 8086/88


Com o sucesso dos PCs e interessada em preservar ao investimento em
software dos seus usurios a Intel, fabricante do processador, preocupou-se em
preservar a compatibilidade das novas geraes de processadores com a
arquitetura bsica do 8086/88. Como resultado, mesmo os atuais membros da
famlia Pentium ainda executam cdigo escrito para os fundadores desta dinastia de
ltima reviso Ago/2007

Linguagem Assembly Famlia Intel

processadores Intel. Levando ainda em conta a simplicidade da arquitetura do


8086/88 didaticamente conveniente construir o estudo sobre linguagem de
montagem a partir deste processador.
Este
texto
apresenta
inicialmente
a
arquitetura
interna
destes
microprocessadores visvel ao programador Assembly. Em seguida apresentada a
sua linguagem Assembly. O aluno que desejar uma documentao completa,
incluindo as novas instrues da famlia Pentium e as instrues para dados em
ponto flutuante, podero fazer o download do Manual correspondente
(http://developer.intel.com/design/pentium4/manuals/245471.htm).

Arquitetura interna

A Figura 1 mostra a arquitetura interna dos microprocessadores 8086 e 8088.


H basicamente duas diferenas entre eles: a largura do barramento externo de
dados (8 bits no 8088, e 16 bits no 8086), e o tamanho do bloco "fila de instrues" (4
bytes no 8088 e 6 bytes no 8086). Os principais blocos so:
a) ULA capaz de executar operaes sobre 8 ou 16 bits.
b) Banco de Registradores, constitudo de:
Quatro registradores gerais, de 16 bits, AX, BX, CX e DX, que podem ser
subdivididos em (e referenciados separadamente como) registradores de 8
bits, AH, AL, BH, BL, CH, CL, DH e DL. Neste caso, X representa o
registrador de 16 bits, enquanto H ("high") e L ("low") representam
respectivamente seus 8 bits mais e menos significativos. Os registradores A
tm a funo de acumulador para algumas operaes lgicas/aritmticas. Os
registradores B so utilizados em algumas instrues como registradores de
base. H instrues que utilizam implicitamente os registradores C como
contadores. Os registradores D no tm nenhuma funo especfica, alm
de funcionarem como registradores de rascunho.
Dois Registradores de ndice, de 16 bits, SI e DI.
Apontador de Pilha, de 16 bits, SP.
Um segundo Registrador de Base, de 16 bits, BP.
Contador de Programa, de 16 bits, IP.
Quatro Registradores de Segmento, de 16 bits, CS, DS, ES, SS. Estes
registradores participam na formao do endereo fsico que gerado nos
pinos de endereo do processador. Sua funo ser descrita, mais adiante.
Registrador de Estado, de 16 bits. Na verdade somente 9 destes 16 bits tm
significado, conforme mostra a Figura 2. Cada sinalizador ("flag") tem o
seguinte significado:
15 14 13 12 11 10

Figura 2: Registrador de Estado do 8086/8088


ltima reviso Ago/2007

Linguagem Assembly Famlia Intel

OF - sinalizador de "overflow". Este bit ativado quando a ALU ao


executar uma operao o transporte para dentro do bit mais
significativo diferente do transporte para fora do bit mais significativo.
DF - sinalizador de direo. H instrues que envolvem os
registradores de ndice na formao do endereo efetivo dos
operandos. Algumas destas instrues implicam na alterao do
contedo do registrador de ndice. Dependendo do contedo deste
sinalizador, os registradores de ndice sero incrementados ou
decrementados automaticamente, quando tais instrues so
executadas.
IF - sinalizador de interrupo. Este sinalizador determina, se o
processador est habilitado ou desabilitado a atender interrupes.
Interrupo ser o tema do prximo captulo.
TF - "trap flag". Quando este sinalizador est ativado, gerada
internamente uma interrupo a cada instruo executada. A
compreenso de seu funcionamento ser postergada para o prximo
captulo.
SF - sinalizador de sinal. Corresponde ao bit mais significativo do
resultado produzido pela ULA, ao executar operaes artimticas.
ZF - sinalizador de zero. Indica, quando ligado, que o resultado
produzido pela ULA nulo.
AF - indica o transporte para fora do nibble menos significativo - do bit
3 para o bit 4 - do resultado produzido pela ULA. utilizado quando se
manipula operandos representados em cdigo BCD ou ASCII.
PF - sinalizador de paridade. Este sinalizador ativado, quando o
nmero de 1s nos 8 bits menos significativos do resultado produzido
pela ULA par, e desativado caso contrrio.
CF - sinalizador de transporte.
c) Controle. No esquema apresentado na Figura 1 o controle est dividido em
dois blocos: "Sistema de Controle da EU" e "Lgica de Controle das Barras".
Esta diviso se justifica tendo em vista que o processador est dividido em
duas unidades funcionais que cooperam entre si:
A Unidade de Execuo - "Execution Unit" - (EU): Esta unidade
responsvel exclusivamente pela execuo das instrues. Ela no se ocupa
da transferncia de informaes entre o microprocessador e os demais
componentes do sistema. Quando a execuo de uma instruo exige o
acesso a algum operando externo ao microprocessador, a EU gera uma
solicitao
A Unidade de Interface com o Barramento - "Bus Interface Unit" - (BIU): Esta
unidade se ocupa exclusivamente com a transferncia de informaes entre
o microprocessador e o restante do sistema. A forma como estas duas
unidades cooperam ser vista adiante.
A Figura 1 contm, alm disso, alguns outros elementos. So eles: um
ltima reviso Ago/2007

Linguagem Assembly Famlia Intel

somador (), a fila de instrues, alm dos quatro registradores de segmento j


mencionados. A funo destes elementos ser discutida mais adiante.

Linguagem Assembly do 8086/8088

Nas linhas que se seguem so apresentadas de modo resumido as principais


caractersticas da linguagem Assembly do 8086/8088 (ASM86). Para ter uma
descrio detalhada desta linguagem. O aluno dever recorrer aos manuais e livros
indicados.

3.1

Conveno para o armazenamento de variveis.

Todos os sistemas reais so capazes de armazenar variveis que ocupam


mais do que um byte, em posies consecutivas da memria. Assim, se uma
varivel ocupa uma palavra de 16 bits, esta varivel estar armazenada em dois
endereos consecutivos.
H aqui duas convenes possveis:
a) armazenar o byte menos significativo no endereo A+1 e o mais
significativo no endereo A, e
b) armazenar o byte menos significativo no endereo A e o mais significativo
no endereo A+1.
A primeira conveno chamada de big endien e utilizada pelos
processadores da Motorola, por exemplo. A segunda alternativa chamada little
endien e utilizada por todos os processadores da linha Intel.
A Figura 3 ilustra as duas convenes para armazenar o valor 3456H.
Deve-se ainda acrescentar que nos processadores Intel o endereo de uma
palavra de dois ou quatro bytes o endereo do byte menos significativo. Em outras
palavras, se uma varivel tem comprimento igual a n bytes, e est armazenadas
nos endereos A,..., A+n-1 , o endereo desta varivel ser A.
endereo
A
A+1

contedo

little endien

endereo
A
A+1

contedo

big endien

Figura 3: Convenes little endien e big endien.

3.2

Comandos

Existem dois tipos de comandos na linguagem Assembly-86 (ASM86):


instrues e diretivas.
ltima reviso Ago/2007
4

Linguagem Assembly Famlia Intel

As instrues correspondem a cdigos binrios que so as instrues de


mquina executadas pelo microprocessador. Enquanto as instrues assembler so
simblicas, as chamadas instrues de mquinas so binrias. A razo para usar
instrues Assembly ao invs de instrues binrias evidente. muito mais fcil
para o programador desenvolver de dar manuteno num programa escrito na
forma de smbolos que sugerem a funo de cada instruo do que num programa
constitudo por uma cadeia de 0s e 1s. O papel do programa montador (Assembler)
traduzir as instrues Assemby para as instrues de mquina.
Ao contrrio do que ocorre com as instrues, o montador no gera para as
diretivas nenhuma instruo de mquina. As diretivas so informaes fornecidas
pelo programador que auxiliam o montador no processo de montagem.
As instrues podem ter at cinco campos:

((rtulo :) (prefixo) mnemnico (operando(s)) (;comentrios))


onde os parnteses denotam que se trata de campos opcionais (os parnteses no
so escritos pelo programador).
O campo rtulo fornece um nome posio de memria que contm a
instruo, de tal maneira que se pode fazer referncia a ela simbolicamente numa
instruo de desvio (p. ex.: JMP) em algum outro ponto do programa.
Um prefixo leva o montador a gerar um byte de prefixo que modifica de
alguma forma a execuo normal da instruo. O uso de tais prefixos ser melhor
esclarecido mais adiante neste texto.
O mnemnico identifica o tipo de instruo (p. e. MOV para movimentao,
ADD para adio, etc.) que deve ser gerada..
Uma instruo pode ter zero, um ou dois operandos separados por uma
vrgula.
Os comentrios no afetam a execuo de um programa, mas constituem
meramente um recurso que facilita a compreenso da lgica implementada no
programa. muitssimo til durante o desenvolvimento ou posteriormente na
manuteno do programa. Recomenda-se enfaticamente que o aluno utilize
extensivamente comentrios em seus programas.
As diretivas podem ter at quatro campos:

(nome) mnemnico (operando(s)) (;comentrios)


Algumas diretivas exigem um nome, enquanto outras probem um nome. O
montador reconhece a diretiva a partir do mnemnico escrito no segundo
campo.Todos os eventuais operandos so escritos em seguida.
3.2.1

Algumas Diretivas

A relao de diretivas apresentada nesta seo apenas adequada aos


objetivos deste curso sem ser completa. Outras diretivas sero apresentadas nas
ltima reviso Ago/2007

Linguagem Assembly Famlia Intel

aulas de laboratrio.
3.2.1.1

Constantes

Constantes numricas podem ser apresentadas em binrio, decimal, octal e


hexadecimal. A base utilizada deve ser indicada pelo programador colocando
esquerda do numeral, respectivamente as letras B, D, Q e H. Quando nenhuma
letra for indicada o montador assume que se trata da base decimal.
Muitos montadores exigem que o primeiro dgito de um nmero em base
hexadecimal seja um numeral. Na prtica isso significa que os nmeros
hexadecimais que iniciam com A, B, C, D, E ou F, devem ser digitados tendo um 0
(zero) na frente.
Todas as constantes devem ser inteiras representveis em 16 bits, incluindo
sinal. Nmeros negativos so representados em complemento de dois.
Caracteres so apresentados entre apstrofes e podem aparecer em cadeias
de at 255 caracteres, quando utilizadas para iniciar posies de memria. Quando
utilizadas como operandos imediatos, caracteres podem ter no mximo dois bytes.
A diretiva EQU utilizada para associar um smbolo a uma constante.
O uso de constantes ilustrado a seguir.
MOV

STRING[SI],A

; caracter

MOV

STRING[SI], 41h

; equivalente em hexadecimal

ADD

AX, 0C4H

; constantes hexa iniciam com numeral

OCTAL_8

EQU 10Q

; 8 em octal

OCTAL_9

EQU 11Q

; binrio

UMS

EQU 11111111B

; 9 em octal

MENOS_5 EQU -5
MENOS_8 EQU -6D

; decimal (default)
; D indica que decimal

3.2.1.2
Definio de Dados
A maioria dos programas iniciam difinindo as variveis com que eles vo
trabalhar. Trs diretivas, DB, DW e DD so usadas para alocar e dar nome a
posies de memria. So usadas para definir variveis em trs unidades: DB
significa define byte, DW significa define word e DD significa define doubleword.
ltima reviso Ago/2007

Linguagem Assembly Famlia Intel

Os operandos destas diretivas indicam ao montador quantas unidades de


armazenamento alocar - respectivamente 1, 2 e 4 bytes - e qual o valor inicial, se
houver. Os exemplos abaixo esclarecem como utilizar estas diretivas:
ALFA

DB

; no inicializada

BETA

DW

; no inicializada

GAMA

DD

; no inicializada

UPSILON

DW

; constante 05H

IOTA

DB

HELLO

; contm 48 45 4C 4C 4F H

MU

DD

100 DUP 0

; aloca e inicializa 100 bytes com 0 (zero)

Para cada varivel num programa ASM86, o montador registra a informao


do tipo, ou seja, do nmero de bytes alocados a ela. Quando uma varivel
referenciada no programa, o montador utiliza esta informao para determinar a
forma da instruo de mquina que deve ser gerada.
Se o uso da varivel conflita com o seu atributo, o montador gera uma
mensagem de erro. H casos em que o programador deve indicar explicitamente ao
montador qual o tipo do operando. Por exemplo, a instruo:

MOV

[BX],5

escreve o valor 5 na posio de memria, cujo endereo est definido pelo


contedo do registrador BX. Esta instruo no identifica o tipo da varivel, se um
byte, uma palavra ou uma palavra dupla. Note, que dependendo do tipo da varivel,
a execuo desta instruo envolver a modificao de 1, 2 ou 4 bytes da memria.
A informao do tipo de varivel pode ser fornecido atravs das diretivas: byte ptr,
word ptr, dword ptr, como nos exemplos a seguir
MOV

word ptr [BX],5

; indica que palavra

SUB

byte ptr [BX][SI],1

; indica que byte

ANA

BETA,32H

; implcito que palavra

CMP

byte ptr ALFA[SI], 10

; indica que byte (redundante)

DEC

byte ptr GAMA

; indica que byte apesar da definio

A primeira e segunda linhas do exemplo esclarecem que o primeiro operando


da instruo um byte. Na terceira linha no necessrio utilizar estas diretivas,
pois o montador assume o tipo indicado quando da definio da varivel, neste
caso, uma palavra (vide exemplo anterior). Na quarta linha o uso da diretiva
redundante e, portanto desnecessrio, por que a varivel j havia sido definida (vide
ltima reviso Ago/2007

Linguagem Assembly Famlia Intel

exemplo anterior), como byte. A ltima linha tem um aspecto interessante. Embora a
varivel GAMA tenha sido definida como palavra dupla, a instruo decrementa
apenas o byte apontado pelo endereo GAMA, sem alterar os demais 3 bytes da
palavra dupla.
A diretiva TYPE identifica a unidade de alocao de memria (1 = byte; 2 =
palavra, 4 = palavra dupla).
A linguagem prov duas diretivas: LENGHT e SIZE, que podem ser escrito
nas instrues com informaes de atributo. LENGHT faz o montador retornar com
o nmero de unidades de armazenamento (bytes, palavras ou palavras duplas)
ocupadas por um vetor. SIZE leva o montador a retornar o nmero de bytes
ocupados pela varivel ou vetor.
Estas diretivas permitem que se escrevam seqncias de instrues que no
precisam ser mudadas (somente montadas novamente), se os atributos das
variveis mudarem, por exemplo, um vetor de bytes muda para um vetor de
palavras.
O exemplo a seguir ilustra uma aplicao tpica destas diretivas.
; soma do contedo de uma tabela em AX
; observe que a mesma instruo funciona para
; TABELA

DB

50

DUP(?)

; TABELA

DD

50

DUP(?)

SUB

AX,AX

; zera contador

MOV

CX, LENGHT TABELA

; nmero de iteraes

MOV

SI, SIZE TABELA

; aponta p/ o fim do vetor

SUB

SI, TYPE TABELA

; pega elemento anterior

ADD

AX, TABELA [SI]

; soma um elemento

SOMA_OUTRO:

; AX contm a soma
Existe tambm a diretiva OFFSET. Basta por enquanto considerar que esta
diretiva retorna o prprio endereo da varivel referenciada no programa logo em
seguida a esta diretiva.
Do mesmo modo, algumas outras diretivas relacionadas com o mecanismo de
segmentao do processador, no sero apresentadas aqui. Embora todo programa
ltima reviso Ago/2007

Linguagem Assembly Famlia Intel

deva cont-las para que o montador funcione corretamente, este texto limita-se a
mencion-las sem discutir em detalhes o seu papel.
3.2.1.3
Incio e Final de Subrotinas
Em ASM86 uma subrotina (rotina) ativada atravs da instruo CALL, como
se ver adiante. O cdigo da subrotina termina necessariamente com a instruo
RET, que desvia o fluxo controle para a instruo seguinte ao CALL. As instrues
de uma rotina so emolduradas pelas diretivas PROC e ENDP, como no exemplo a
seguir:
HISTOGRAMA
PROC
FAR
;
Esta rotina assume que o parmetro de entrada est em AL,
;
e incrementa um contador numa tabela de frequncia,
;
baseada no valor do parmetro de entrada.
XOR
AH,AH
; zera o byte mais significativo de AX
MOV
SI,AX
; ndice para a tabela
INC
FREQ[SI] ; incrementa o contador
RET
HISTOGRAMA
ENDP
O uso da diretiva NEAR/FAR ser esclarecido posteriormente.

3.3

Modos de Endereamento

O processador 8086 dispe de vrias formas de referenciar os operandos das


instrues. Os operandos podem estar em registradores, dentro da prpria
instruo, na memria ou em portas de E/S. Alm disso, o endereo de memria e
de portas de E/S, podem ser calculados de vrias maneiras. Estes modos de
endereamento conferem flexibilidade ao conjunto de instrues do processador.
Esta seo apresenta uma breve descrio dos modos de endereamento
disponveis neste processador.
3.3.1

Registrador
Neste modo de endereamento, o operando est contido num dos
registradores internos da mquina. Estas instrues so muito compactas pois o
endereo do registrador est codificado em uns poucos bits. O acesso a este
operando realizado inteiramente dentro do prprio processador, e no envolve
acesso externo memria. Exemplos:

MOV
SUB
DEC
ltima reviso Ago/2007

AL,BL
CX,DX
CL
9

Linguagem Assembly Famlia Intel

3.3.2

Imediato
O operando est contido na prpria instruo. Este operando pode ter 8 ou 16
bits. Exemplos:

SUB
ADD

CL,2
DX,MENOS_5

Note nos exemplos que as instrues utilizam tambm o modo de


endereamento registrador. De um modo geral, uma mesma instruo pode usar
modos de endereamento diferentes para cada um dos seus operandos. No caso
deste processador cada instruo pode ter no mximo dois operandos. Cada
operando pode ser referenciado usando um modo de endereamento distinto.
Quando o operando est na memria, o processador calcula o endereo da
posio correspondente das formas que sero explicitadas a seguir. Este endereo
chamado de endereo efetivo (effective address - EA).
Na realidade o endereo efetivo no propriamente o endereo do operando,
mas a distncia entre o endereo da posio de memria e um certo endereo de
referncia chamado endereo de incio de segmento. Por enquanto convm admitir
que o endereo efetivo o prprio endereo do operando. Maiores esclarecimentos
sero dados em sees posteriores.1

opcode

mod reg r/m

desloc

camento

Endereo
Efetivo

Figura 4: Ilustrao do modo de endereamento direto


Nos modos de endereamento que sero apresentados a seguir, o endereo
efetivo ser dado pela soma de at trs componentes: base (fornecida por um dos
registradores de base - BX ou BP), ndice (fornecido pelo contedo de um dos
registradores de ndice - SI ou DI) e um deslocamento (contido na prpria instruo).
O que caracteriza cada um dos modos de endereamento a seguir qual ou quais
destes trs componentes estaro presentes na soma.

Na realidade o endereo efetivo no propriamente o endereo do operando, mas a distncia


deste a um certo endereo de referncia, chamado endereo de incio de segmento.

ltima reviso Ago/2007

10

Linguagem Assembly Famlia Intel

3.3.3

Direto
Trata-se do modo de endereamento de memria mais simples. No envolve
nenhum registrador. O endereo efetivo tomado diretamente do deslocamento
contido na prpria instruo. Este modo de endereamento tipicamente utilizado
para referenciar escalares. A Figura 4 ilustra o formato destas instrues.
Alguns exemplos:

MOV
SUB
DEC

AX,[8000H]
CX,BETA
byte ptr GAMA

3.3.4

Registrador Indireto
O endereo do operando pode ser tirado de um dos registradores de base
(BX ou BP) ou ndice (SI ou DI), como mostra a Figura 5. Qual destes registradores
usado est definido num dos campos da instruo.

opcode

mod reg r/m

BX ou BP
ou
SI ou DI

Endereo
Efetivo

Figura 5: Ilustrao do modo de endereamento registrador indireto.


Somente um registrador de base ou de ndice pode estar presente neste
modo de endereamento. Os registradores de 8 bits, assim como AX, DX, CX, SP,
alm dos registradores de segmento (CS, DS, ES, SS) so proibidos aqui, a menos
de raras excees. Exemplos:

MOV
SUB

AL,[BX]
[SI],DX

Convm, contudo, notar que qualquer registrador de uso geral pode ser
utilizado neste modo de endereamento nas instrues do tipo JMP e CALL.
Exemplos destes casos so:

JMP
CALL
ltima reviso Ago/2007

[AX]
[DX]
11

Linguagem Assembly Famlia Intel

3.3.5

Relativo a uma Base


Neste modo de endereamento, o endereo efetivo dado pela soma de um
deslocamento (definido na prpria instruo) e pelo contedo de um registrador de
base, mais especificamente, do registrador BX ou do registrador BP.

opcode

mod reg r/m

desloc

camento

BX ou BP

Endereo
Efetivo

Figura 6: Ilustrao do modo de endereamento com base.


Este modo de endereamento freqentemente utilizado para
referenciar estruturas que podem estar armazenadas em endereos diferentes na
memria. Antes da instruo que referencia o dado propriamente dita normalmente
se introduzem instrues que carregam no registrador de base o endereo inicial da
estrutura. O elemento da estrutura indicado pelo deslocamento. Cpias diferentes
de uma mesma estrutura podem ser referenciadas simplesmente mudando o
contedo do registrador de base.
Abaixo so dados alguns exemplos deste modo de endereamento.

MOV
SUB
ADD

AL,[BX+0B000H]
CL,MU[BX]
dword ptr [BP][1000H], 43H

3.3.6

Indexado
No modo de endereamento indexado o endereo efetivo calculado a partir
da soma de um deslocamento mais o contedo de um registrador de ndice (SI ou
DI, conforme definido no campo mod_reg_r/m), como mostra a Figura 7. Este modo
de endereamento freqentemente utilizado para referenciar elementos de um
vetor: o deslocamento apontando para o incio do vetor e o valor do registrador de
ndice selecionando um dos seus elementos. Como todos os elementos de um vetor
tm o mesmo comprimento, uma aritmtica simples com o registrador de ndice
selecionar qualquer elemento.

ltima reviso Ago/2007

12

Linguagem Assembly Famlia Intel

opcode

mod reg r/m

desloc

camento

SI ou DI

Endereo
Efetivo

Figura 7: Ilustrao do modo de endereamento Indexado.


Abaixo so dados alguns exemplos deste modo de endereamento.
MOV
AL,[SI+0B000H]
SUB
CL,MU[SI]
ADD
word ptr [DI][1000H], 43H
3.3.7

Indexado com Base


O modo de endereamento indexado com base gera o endereo efetivo
somando o contedo de um registrador de base (BP ou BX), o contedo de um
registrador de ndice (SI ou DI) e um deslocamento, como mostra a figura 8.
importante salientar aqui que neste modo de endereamento est presente um
registrador de base e um registrador de ndice. Qualquer outra combinao de
registradores invlida. Este modo freqentemente utilizado para referenciar
vetores localizados na pilha, como ser discutido adiante. Novamente neste caso o
campo mod_reg_r/m da instruo define quais os registradores participam do
clculo do endereo efetivo.
Abaixo so dados alguns exemplos deste modo de endereamento.

MOV
ADD

ltima reviso Ago/2007

AL,[BX+SI+ 5H]
[BP][DI][1000H], AX

13

Linguagem Assembly Famlia Intel

opcode

mod reg r/m

desloc

camento

BX ou BP

Endereo
Efet-ivo

SI ou DI

Figura 8: Ilustrao do modo de endereamento indexado com base.

3.4

Conjunto de Instrues do 8086/8088

A apresentao que se segue no contm todos os detalhes de cada instruo.


Ela se prope a ser um esquema a ser seguido em aula e ao mesmo tempo um
resumo do assunto.
importante ter em mente que todas estas instrues esto presentes no
conjunto de instrues dos demais processadores da famlia 80X86, de tal sorte que o
conhecimento aqui adquirido pode ser utilizado na programao de sistemas mais
modernos.
3.4.1

Convenes
Na apresentao a seguir adota-se a seguinte conveno:
d
uma quantidade de 8 ou 16 bits.
d8
uma quantidade de 8 bits.
d16
uma quantidade de 16 bits.
r, r1, r2
um registrador de 8 ou 16 bits de uso geral.
r8
um registrador de 8 bits.
r16
um registrador de 16 bits.
()
o contedo de um registrador, ou posio de memria,
dependendo do que estiver entre os parnteses.
m
endereo de um byte ou uma palavra na memria
ltima reviso Ago/2007

14

Linguagem Assembly Famlia Intel

m8
m16
m32
AX/AL
alvo
flags
r1:r2

endereo de um byte na memria


endereo de uma palavra de 16 bits.
endereo de uma palavra dupla de 32 bits.
o registrador AX ou AL, dependendo do operando envolvido ser
de 16 ou 8 bits.
a definio de um endereo na rea de cdigo da memria.
os 16 bits do registrador de estado.
indica um valor formado pela composio do contedo de r1 e r2.
Esta composio pode se dar pela concatenao dos dois valores
(p. ex. DX:AX) ou pelo modo prprio do microprocessador formar
o endereo (p. ex. CS:DX).

As convenes utilizadas na descrio que se segue, acabar se tornando


clara na medida em que as instrues forem sendo apresentadas. Para cada tipo de
instruo aparece do lado esquerdo uma descrio sinttica e uma breve descrio
semntica da instruo. Ao centro, so dados alguns exemplos, e do lado esquerdo o
nmero de ciclos de relgio consumidos na execuo da instruo.
3.4.2
Instrues de Transferncia de Dados
MOV AL,CH
MOV r1,r2

MOV CX,BP
MOV r,m

MOV AX,TEMP_RESULT

10/8+EA

MOV CL,ARRAY[SI],
MOV m,r

MOV COUNT[DI],CX

10/9+EA

MOV [SI+1000],DX
MOV r,d

MOV AX,99 4

MOV SI,61CH
MOV m,d

MOV byte ptr [SI], 0FH

10+EA

MOV word ptr [BX+1234],57


XCHG r1,r2

XCHG m,r

XLAT

XCHG

AX,BX

XCHG

CL,CH

XCHG

SEMAFORO,AX

XCHG

AL,[BX+2]

XLAT

17+EA

11

(AL) ((BX+AL))
ltima reviso Ago/2007

3/4

15

Linguagem Assembly Famlia Intel

LAHF

LAHF

SAHF

(AH7,6,4,2,0) (SF,ZF,AF,PF,CF)

SAHF
(SF,ZF,AF,PF,CF) (AH7,6,4,2,0)

3.4.3
Instrues de Manipulao de Cadeias de Caracteres (string)
Cada uma das instrues deste grupo tem trs formatos diferentes. Para o primeiro
formato (terminado com um "S"), o montador entende que o string de bytes ou de
palavras. O segundo (terminado com um "SB") e terceiro (terminado com um "SW")
indicam explicitamente que se trata respectivamente de um string de bytes e palavras.
MOVS/MOVSB/MOVSW

MOVSB

18

MOVSW

CMPS/CMPSB/CMPSW

CMPSB

22

CMPSW

SCAS/SCASB/SCASW

SCASB

15

SCASW

LODS/LODSB/LODSW

LODSB

12

LODSW

STOS/STOSB/STOSW

STOSB

11

STOSW

REP

REP MOVSB

9+17*rep

REP

REP LODSW

9+13*rep

REP

REP STOSW

9+10*rep

REPZ/REPE

REPZ CMPS

9+22*rep

REPNZ/REPNE

REPNZ SCAS

9+15*rep

Nas cinco ltimas linhas da tabela contm prefixos usados para repetir a
ltima reviso Ago/2007

16

Linguagem Assembly Famlia Intel

execuo da instruo de manipulao de string escrita em seguida pelo nmero de


vezes especificado em CX. Diante das instrues MOVS/MOVSB/MOVSW,
LODS/LODSB/LODSW e STOS/STOSB/STOSW, pode-se usar o prefixo REP, que
decrementa o registrador CX, sem afetar os flags, e repete a instruo de string,
enquanto CX 0. Diante das instrues CMPS e SCAS, pode-se usar os prefixos
REPZ(ou REPE) ou REPNZ(ou REPNE). REPZ decrementa CX, sem afetar os flags,
e repete a instruo de string, enquanto CX
0 e ZF = 1. O prefixo REPNZ
decrementa CX, sem afetar os flags, e provoca a repetio da instruo de string,
enquanto CX

0 e ZF

0.

3.4.4
Instrues de Manipulao de Endereos
LEA
BX,[BP][DI]
LEA r16,m16

2+EA

(r16) m16
LDS r16,m32

LDS SI,DATA_SEG[DI]

16+EA

LES SI,DATA_SEG[DI]

16+EA

(r16) (m32)
(DS) (m32)+2
LES r16,m32
(r16) (m32)
(ES) (m32)+2
3.4.5

Instrues Aritmticas

3.4.5.1
Adio
ADD r1,r2

ADD AX,SI

ADD CL,DH
ADD r,m

ADD DL,[300]

9+EA

ADD CX,[BX+1234H]
ADD m,r

ADD byte ptr [300],DL

16+EA

ADD word ptr [SI+BX+2],AX


ADD r,d

ADD AL,4

(r) (r) + d

ADD AX,50

ADD m,d

ADD byte ptr [DI],54

(m) (m) + d

ADD word ptr [BX+4],4FFH

ltima reviso Ago/2007

17

17+EA

Linguagem Assembly Famlia Intel

ADC r1,r2

ADC BX,DX

ADC DH,AL
ADC r,m

ADC BL,[456]

9+EA

(r) (r) + (m) + (CF)

ADC CX,word ptr [300H]

ADC m,r

ADC byte ptr [300],DL

(m) (m) + (r) + (CF)

ADC word ptr [SI],BX

ADC r,d

ADC CL,24

(r) (r) + d + (CF)

ADC BX,50

ADC m,d

ADC byte ptr [DI],54

(m) (m) + d + (CF)

ADC word ptr [BX+4],4FFH

INC r

INC

AX

(r) (r) + 1

INC

CL

16+EA

17+EA

15+EA

INC m
(m) (m) + 1

INC

3.4.5.2
Subtrao
SUB r1,r2

SUB AX,SI

word ptr [BX+100H]

SUB CL,DH
SUB r,m

SUB DL,[300]

(r) (r) - (m)

SUB CX,[BX+1234H]

SUB m,r

SUB byte ptr [300],DL

(m) (m) - (r)

SUB word ptr [SI+BX+2],AX

SUB r,d

SUB AL,4 4

(r) (r) - d

SUB AX,50

SUB m,d

SUB byte ptr [DI],54

(m) (m) - d

SUB word ptr [BX+4],4FFH

SBB r1,r2

SBB BX,DX

(r1) (r1) - (r2) - (CF)

SBB DH,AL

ltima reviso Ago/2007

9+EA

16+EA

17+EA

18

Linguagem Assembly Famlia Intel

SBB r,m

SBB BL,[456]

9+EA

SBB CX,word ptr [300H]


SBB m,r

SBB byte ptr [300],DL

16+EA

(m) (m) - (r) - (CF)

SBB word ptr [SI],BX

SBB r,d

SBB CL,24

(r) (r) - d - (CF)

SBB BX,50

SBB m,d

SBB byte ptr [DI],54

(m) (m) - d - (CF)

SBB word ptr [BX+4],4FFH

DEC r

DEC AX

(r) (r) - 1

DEC Cl

DEC m

DEC byte ptr [SI]

17+EA

15+EA

DEC word ptr [BX+100H]


NEG r

NEG BX

NEG AL
NEG m

NEG byte ptr [BX+DI]

(m) 0 - (m)

NEG MULTIPLICADOR

CMP r1,r2

CMP BX,CX

16+EA

CMP AL.BL
CMP r,m

CMP DH, byte ptr ALPHA

(r) - (m)

CMP CH,[SI+BX+10]

CMP m,r

CMP [BP+2],SI

(m) - (r)

CMP [SI],AX

CMP r,d

CMP BL,02H

(r) - d

CMP DL,85H

CMP m,d

CMP RADAR[DI],3420H

9+EA

(m) - d

ltima reviso Ago/2007

9+EA

19

10+EA

Linguagem Assembly Famlia Intel

3.4.5.3
MUL r

Multiplicao
MUL BL

70-77

MUL CX

118-133

MUL m

MUL byte ptr MES[SI]

(76-83)+EA

(AX) (AL) * (m8)

MUL word ptr DIA[SI]

(124-139)+EA

(DX:AX) (AX) * (m16)

MUL BAUD_RATE

(sem sinal)
IMUL r

IMUL BL

80-98

(AX) (AL) * (r8)

IMUL CX

128-154

(DX:AX) (AX) * r16)


(com sinal)
IMUL m

IMUL byte ptr MES[SI]

(86-104)+EA

(AX) (AL) * (m8)

IMUL word ptr DIA[SI]

(134-160)+EA

(DX:AX) (AX) * (m16)


(com sinal)
3.4.5.4
DIV r8

Diviso

DIV r16

DIV CL

80-90

DIV DX

144-162

(sem sinal)

ltima reviso Ago/2007

20

Linguagem Assembly Famlia Intel

DIV m8

DIV byte ptr [SI]

(88-96)+EA

DIV word ptr [BX]

(150-168)+EA

(sem sinal)
DIV m16
(AX)(DX:AX)/(m16)
(DX)(DX:AX)mod(m16)
(sem sinal)
IDIV r8

IDIV CL

101-112

IDIV DX

165-184

(AL)(AX)/(r8)
(AH)(AX) mod (r8)
(com sinal)
IDIV r16
(AX)(DX:AX)/(r16)
(DX)(DX:AX) mod (r16)
(com sinal)
IDIV m8

IDIV byte ptr [SI]

(107-118)+EA

IDIV word ptr [BX]

(171-190)+EA

(AL)(AX)/(m8)
(AH)(AX) mod (m8)
(com sinal)
IDIV m16
(AX)(DX:AX)/(m16)
(DX)(DX:AX)mod(m16)
(com sinal)
CBW

CBW

Se (AL)<0,
ento (AH) 0FF
caso contrrio, (AH) 00

ltima reviso Ago/2007

21

Linguagem Assembly Famlia Intel

CWD

CWD

DX) FFFFH

Se (AX)<0, ento (

DX) 0

caso contrrio, (

3.4.5.5
nstrues de Ajuste
Estas instrues so utilizadas quando os dados manipulados pelo programa
esto em formato ASCII ou BCD. Tendo em vista que estas so instrues de uso
infreqente, este trabalho limita-se a mencion-las. So elas:
AAA

AAA

DAA

DAA

AAS

AAS

DAS

DAS

AAM

AAM

83

AAD

AAD

60

3.4.6

Instrues Lgicas

3.4.6.1
E
AND r1,r2

AND AL,BL

AND CL,AH
AND r,m

AND DL,[SI+5]

9+EA

AND CX,FLAG_WORD
AND m,r

AND ASCII[DI],DL

(m) (m) (r)

AND word ptr [SI+BX+2],AX

AND r,d

AND AX,7F7FH

(r) (r) d

AND CX,0F0H

AND m,d

AND BETA,01H

(m) (m) d

AND byte ptr [BX],6

TEST r1,r2

TEST SI,DI

17+EA

TEST CX,DX
ltima reviso Ago/2007

16+EA

22

Linguagem Assembly Famlia Intel

TEST r,m

TEST SI,END_COUNT

(r) (m)

TEST CX,[SI]

TEST r,d

TEST BX,0CC4H

(r) d

TEST AL,8

TEST m,d

TEST RETURN_CODE,01H

(m) d

TEST byte ptr [DI],3

3.4.6.2
OR r1,r2

9+EA

4/5

11+EA

OU
OR

AL,BL

OR

CL,AH

OR

DL,[SI+5]

OR

CX,FLAG_WORD

OR m,r

OR

ASCII[DI],DL

(m) (m) + (r)

OR

word ptr [SI+BX+2],AX

OR r,d

OR

AX,7F7FH

(r) (r) + d

OR

CX,0F0H

OR m,d

OR

BETA,01H

(m) (m) + d

OR

byte ptr [BX],6

3.4.6.3
OU exclusivo
XOR r1,r2

XOR AL,BL

OR r,m

9+EA

16+EA

17+EA

XOR CL,AH
XOR r,m

XOR DL,[SI+5]

9+EA

XOR CX,FLAG_WORD
XOR m,r

XOR ASCII[DI],DL

(m) (m) (r)

XOR word ptr [SI+BX+2],AX

XOR r,d

XOR AX,7F7FH

(r) (r) d

XOR CX,0F0H

ltima reviso Ago/2007

23

16+EA

Linguagem Assembly Famlia Intel

XOR m,d

XOR BETA,01H

(m) (m) d

XOR byte ptr [BX],6

3.4.6.4
NOT r

NOT AX

17+EA

Complemento
3

NOT CL
NOT m

NOT byte ptr [BX]

(m) not (m)

NOT word ptr [BX+SI]

3.4.6.5
Deslocamento
SAL/SHL r,1

SAL AL,1

SAL/SHL r,CL

SHL DX,CL

SAL/SHL m,1

SAL word ptr [BX+2],1

SAL/SHL m,CL

SHL STORE_COUNT,CL

CF

16+EA

2
8+4*(CL)
15+EA
20+EA+4*(CL)

tantas vezes quantas forem definidas pelo


segundo operando

SHR r,1

SHR AL,1

SHR r,CL

SHR DX,CL

SHR m,1

SHR word ptr [BX+2],1

SHR m,CL

SHR STORE_COUNT,CL

8+4*(CL)
15+EA
0+EA+4*(CL
)

CF

tantas vezes quantas forem definidas pelo


segundo operando

ltima reviso Ago/2007

24

Linguagem Assembly Famlia Intel

SAR r,1

SAR AL,1

SAR r,CL

SAR DX,CL

SAR m,1

SAR word ptr [BX+2],1

SAR m,CL

SAR STORE_COUNT,CL

8+4*(CL)
15+EA
20+EA+4*(CL)

CF

3.4.6.6
ROL r,1

Rotao
ROL AL,1

ROL r,CL

ROL DX,CL

8+4*(CL)

ROL m,1

ROL word ptr [BX+2],1

ROL m,CL

ROL STORE_COUNT,CL

15+EA
0+EA+4*(CL
)

CF

tantas vezes quantas forem definidas pelo


segundo operando

ROR r,1

ROR AL,1

ROR r,CL

ROR DX,CL

ROR m,1

ROR word ptr [BX+2],1

ROR m,CL

ROR STORE_COUNT,CL

CF

2
8+4*(CL)

tantas vezes quantas forem definidas pelo


segundo operando

ltima reviso Ago/2007

25

15+EA
20+EA+4*(CL)

Linguagem Assembly Famlia Intel

RCL r,1

RCL AL,1

RCL r,CL

RCL DX,CL

RCL m,1

RCL word ptr [BX+2],1

RCL m,CL

RCL STORE_COUNT,CL

CF

2
8+4*(CL)
15+EA
20+EA+4*(CL)

tantas vezes quantas forem definidas pelo


segundo operando

RCR r,1

RCR AL,1

RCR r,CL

RCR DX,CL

RCR m,1

RCR word ptr [BX+2],1

RCR m,CL

RCR STORE_COUNT,CL

CF

2
8+4*(CL)

tantas vezes quantas forem definidas pelo


segundo operando

3.4.7
3.4.7.1

Instrues de Desvio
Desvio incondicional
JMP CX

(CS:IP) alvo

JMP dword ptr [SI]


CALL CX

(CS:IP) alvo.

CALL dword ptr [SI]

O endereo de retorno
armazenado na pilha.
RET
(CS:IP)valor armazenado
no topo da pilha

ltima reviso Ago/2007

26

15+EA
20+EA+4*(CL)

Linguagem Assembly Famlia Intel

RET 8
(CS:IP)valor armazenado
no topo da pilha.
(SP)(SP)+d16
INT 21H

INT num_vetor

51

(esclarecido noutro captulo)

INTO

INTO

53 ou 4

(esclarecido noutro captulo)

IRET

IRET
(esclarecido noutro captulo)

3.4.7.2

Desvio condicional
instruo
JA / JNBE
JAE / JNB
JB / JNAE
JBE / JNA
JC
JE / JZ
JG / JNLE
JGE / JNL
JLE / JNG
JNC
JNE / JNZ
JNO
JNP / JPO
JNS
JO
JP / JPE
JS

descrio da condio de desvio


Jump if above/not below nor equal
Jump if above or equal/not below
Jump if below/not above
Jump if below or equal / not above
Jump if carry
Jump if equal / zero
Jump if greater / not less nor equal
Jump if greater or equal / not less
Jump if less or equal/ not greather
Jump if not carry
Jump if not equal / not zero
Jump if not overflow
Jump if not parit / parity odd
Jump if not sign
Jump if overflow
Jump if parity / parity even
Jump if sign

Tabela 1: Instrues de desvio condicional

ltima reviso Ago/2007

27

Linguagem Assembly Famlia Intel

JA
Como JMP alvo, desde JC

DESTINO

16 ou 4

CX

que cond seja satisfeita.

3.4.8

Controle de Iterao
LOOP LABEL

Se (CX)

16 ou 5

0, (IP)alvo

LOOPE/LOOPZ alvo

LOOPE LABEL

(CX) (CX) -1

LOOPZ LABEL

Se (CX) 0 e, (ZF)

18 ou 6

=0

ento (IP) alvo

LOOPNE/LOOPNZ alvo

LOOPE LABEL

(CX) (CX) -1

LOOPZ LABEL

Se (CX) 0 e, (ZF) )

19 ou 5

=0

ento (IP) alvo


JCXZ alvo

JCXZ ROTINA

18 ou 6

Se (CX)=0,
ento (IP) alvo

3.4.9
Manipulao da Pilha
PUSH SI
PUSH r16

11(reg) ou
10 (seg-reg)

ltima reviso Ago/2007

28

Linguagem Assembly Famlia Intel

PUSH m16

PUSH RETURN_CODE[SI]

16+EA

PUSHF

PUSHF

10

POP r16

POP SI

POP m16

POP PARAMETRO

(SP) (SP) -2
((SP)) flags

17+EA

(m16) ((SP))
(SP) (SP) + 2
POPF

POPF

(flags) ((SP))
(SP) (SP) + 2

3.4.10
(CF)

Operaes sobre flags


CLC

00
CMC

STC

CLD

STD

(CF) (CF)

(CF) 00
CLD
(DF) 0
STD
(DF) 1
ltima reviso Ago/2007

29

Linguagem Assembly Famlia Intel

CLI

CLI

STI

(IF) 0
STI
(IF) 1

3.4.11
Instrues de Entrada e Sada
IN AL,3FH
IN AL,d8

10

IN AL,00H
IN AL,DX

IN AL,DX

IN AX,DX

IN AX,DX

OUT d8,AL

OUT 24H,AL

10

OUT DX,AX

OUT DX,AX

OUT DX,AL

OUT DX,AL

3.4.12
NOP
no

"NO OPERATION"
NOP
realiza

nenhuma

operao

3.4.13

Outras Instrues

Para tornar esta relao completa, sero mencionadas instrues, cuja


compreenso demanda conhecimento ainda no disponveis ao estudante nesta
altura do curso. Por este motivo no ser apresentada uma descrio destas
instrues. So elas: ESC, HLT, LOCK, WAIT.
ltima reviso Ago/2007

30

Linguagem Assembly Famlia Intel

Subrotinas

A Figura 9 ilustra algumas tcnicas que so utilizadas para escrever


subrotinas em Assembly 86. Neste exemplo um programa chama uma subrotina
(chamada EXEMPLO) passando a ela um vetor de bytes. Dois parmetros so
passados na pilha: o primeiro contm o nmero de elementos do vetor, e o segundo
contm o endereo do primeiro elemento do vetor. Desta forma, embora a subrotina
receba sempre dois parmetros, eles podem ser usados para referenciar
indiretamente qualquer nmero de variveis na memria.
Os resultados que a rotina retorna devem estar em registradores ou em
memria, mas no podem estar na pilha. AX ou AL so freqentemente utilizados
para conter o resultado de uma rotina quando se trata de um byte ou palavra. Este
comumente o caso das chamadas functions. Alternativamente o programa principal
pode passar subrotina como parmetro o endereo (ou endereos) de uma rea
da memria onde deve ser escrito o resultado.
Cada linguagem de programao de alto nvel tem uma conveno diferente
para passagem de parmetros na pilha. A conveno aqui apresentada , portanto,
apenas um exemplo.
A Figura 10a mostra como est a pilha antes do programa principal
armazenar os parmetros na pilha. A Figura 10b mostra a pilha como a subrotina a
v, logo aps a execuo da instruo CALL.
A rotina EXEMPLO pode ser dividida em quatro sees. o prlogo, em que o
reigstrador SP preparado para ser utilizado como registrador de base nos acessos
aos dados contidos na pilha. O prximo passo no prlogo salvar o estado da
mquina. Isto feito armazenando na pilha todos os registradores alterados pela
subrotina (no caso, apenas CX e BX). Se a subrotina modifica os flags, e o
programa principal conta com que os flags estejam inalterados aps a execuo da
subrotina, o registrador de estado tambm deve ser armazenado na pilha.
A ltima instruo do prlogo aloca trs palavras na pilha para serem usadas
como variveis locais. A Figura 10c mostra a pilha aps o prlogo. O conjunto de
palavras alocadas na pilha para esta rotina chamado de quadro (frame) da
rotina.
O corpo da rotina faz o processamento propriamente dito, que, em
EXEMPLO, corresponde a nenhum processamento.
Os parmetros na pilha so endereados relativamente ao registrador BP,
como mostra a Figura 10.

ltima reviso Ago/2007

31

Linguagem Assembly Famlia Intel

EX_SEG
VETOR

SEGMENT
DB
10 DUP(?)

ASSUME
EXEMPLO
;Prlogo

CS:EX_SEG,DS:EX_SEG;SS:EX_SEG;ES:NOTHING
PROC
NEAR
PUSH
MOV
PUSH
PUSH
PUSHF
SUB

BP
BP,SP
CX
BX

MOV
MOV

CX,[BP+6] ; pega n de elementos


BX,[BP+4] ; pega endereo inicial do vetor

SP,6

; salva BP
; estabelece base
; salva estado
;

; e flags
; aloca espao para variveis locais

; fim do prlogo
; Corpo

; variveis locais esto em [BP-8], [BP-10] e [BP-12]


; fim do corpo
;Eplogo
ADD
SP,6
POPF
POP
BX
POP
CX
POP
BP
; fim do eplogo
;Retorno da subrotina
EXEMPLO
ENDP
; Programa principal
START:
MOV
PUSH
MOV
PUSH
CALL

; desaloca variveis locais


; restaura flags
; restaura estado
;

RET 4

AX, SIZE VETOR


AX
AX,OFFSET VETOR
AX
EXEMPLO

EX_SEG

ENDS
END

START

Figura 9: Exemplo do uso de passagem de parmetros e criao de variveis locais


pela pilha.

ltima reviso Ago/2007

32

Linguagem Assembly Famlia Intel

O eplogo desaloca o espao das variveis locais e restaura o valor antigo do


estado da mquina. A Figura 10d mostra a configurao na pilha logo aps o
eplogo, pouco antes da instruo de retorno. A ltima seo da rotina o retorno:
instruo RET 4, alm de restaurar o antigo valor de IP, descarta os parmetros de
entrada, acrescentado 4 ao contedo de SP.
endereo
baixo

Endereo
alto

SP
(a)

(b)

( c)

(d)

Figura 10: Condio da pilha: (a) antes do programa principal armazenar os


parmetros; (b) aps a instruo CALL; ( c) aps o prlogo; (d) aps o eplogo
(antes de RET)

Codificao das Instrues de Mquina do 8086/8088

Esta seo fornece uma idia de como as instrues codificadas em linguagem


Assembly so traduzidas para as instrues de mquina. O texto apresentado a
seguir praticamente uma traduo de parte do The 8086 Family Users Manual.
A instruo em ASM-86 "MOV" pode assumir 28 formas diferentes. Um
programador raramente precisa conhecer os detalhes da codificao das instrues
para escrever programas. Quando se deseja, por exemplo, depurar um programa a
partir de informaes obtidas pela monitorao das barras do sistema atravs de
algum aparelho qualquer. Nesta seo so apresentadas as informaes necessrias
para traduzir ou decodificar uma instruo do 8086/8088. O esquema aqui
apresentado o mesmo dos processadores posteriores da famlia (80286, 80386,
80486, Pentium etc.), a menos de algumas extenses que foram incorporadas s
novas verses.
Uma instruo de mquina pode ocupar entre 1 e 6 bytes. Instrues de 1 byte
normalmente operam sobre um nico registrador ou sinalizador e so facilmente
ltima reviso Ago/2007

33

Linguagem Assembly Famlia Intel

identificveis. Nas instrues mais longas so os primeiros dois bytes que contm a
chave para a decodificao. O formato destes bytes varia mas a maioria das intrues
segue o formato apontado na Figura 11
byte 1

byte 2

byte 3

byte 4

byte 5

byte 6

Figura 11: Formato tpico de uma instruo de mquina do 8086/8088


Os primeiros seis bits de uma instruo de mais de 1 byte geralmente contm o
cdigo da operao ("opcode") que identifica o tipo bsico da instruo: ADD, XOR,
etc. O bit seguinte, o campo D, geralmente especifica a direo da operao: 1 o
campo REG no segundo byte identifica o operando de destino, 0 o campo REG
identifica o operando fonte. O campo W distingui entre operaes sobre 8 bits ou 16
bits: 0 = byte, 1 = palavra de 16 bits.
Um entre trs campos de um bit, S, V, ou, Z aparece no formato de algumas
instrues. S usado em conjunto com W para indicar a extenso do campo imediato
nas instrues aritmticas. V distingui entre deslocamentos e rotaes de uma ou
vrias posies. Z usado como bit de comparao com o indicador ZF (zero) nas
instrues de repetio e iteraes condicionais. A Tabela 2 mostra um resumo do
significado associado a cada um destes campos de um bit.
O segundo byte da instruo usualmente identifica os operandos da instruo.
O campo MOD indica, se um dos operandos est na memria ou, se ambos os
operandos so registradores (veja Tabela 3).
O campo REG identifica o registrador que conte um dos operandos. Sua
codificao igual no campo R/M para MOD=11 (3 primeiras colunas da Tabela 3
Em vrias instrues, principalmente as do tipo "operando imediato para a
memria", REG usado como uma extenso do "opcode" para identificar o tipo de
operao. A codificao do campo R/M (registrador/memria) depende do contedo
ltima reviso Ago/2007

34

Linguagem Assembly Famlia Intel

do campo MOD. Se MOD = 11 (modo registrador-registrador), R/M identifica o


segundo registrador operando. Se MOD seleciona o modo memria, ento o campo
R/M indica como deve ser calculado o endereo efetivo do operando.
campo
S
W
D
V
Z

valor
0
1
0
1
0
1
0
1
0
1

funo
nenhuma estenso do sinal
sinal do valor de 8 bits extendido se W=1
a instruo opera sobre byte
a instruo opera sobre palavra de 16 bits
o campo REG identifica o operando fonte
o campo REG identifica o operando destino
deslocamento/rotao de uma posio
deslocamento/rotao especificado em CL
repetio/iterao, enquanto ZF = 0
repetio/iterao, enquanto ZF = 1
Tabela 2: Codificao dos campos de um bit

Os bytes 3 a 6 de uma instruo, quando esto presentes, contm usualmente


o valor do deslocamento do operando na memria e/ou o valor de um operando
imediato.
Pode haver um ou dois bytes contendo o deslocamento do endereo efetivo do
operando. O campo MOD indica quantos campos deslocamento esto presentes.
Seguindo a conveno da Intel, "little endian", se o deslocamento contm dois bytes, o
byte mais significativo armazenado em segundo lugar na instruo. Se o
deslocamento apenas um nico byte, o 8086/8088 estende este valor internamente
mantendo o sinal, para um valor de 16 bits, para ento utiliz-lo nos clculos de
endereo. Valores imediatos sempre vm depois dos valores de deslocamento,
quando presentes. O segundo byte de um valor imediato de dois bytes o mais
significativo. O data sheet deste processador possui tabelas com a decodificao de
cada instruo, baseada na descrio apresentada.

R/M
000
001
010
011
100
101
110
111

MOD=11
W=0
AL
CL
DL
BL
AH
CH
DH
BH

W=1
AX
CX
DX
BX
SP
BP
SI
DI

Clculo do Endereo Efetivo


MOD=00
MOD=01
MOD=10
(BX)+(SI)
(BX)+(SI)+d8
(BX)+(SI)+d16
(BX)+(DI)
(BX)+(DI) +d8
(BX)+(DI) +d16
(BP)+(SI)
(BP)+(SI) +d8
(BP)+(SI) +d16
(BP)+(DI)
(BP)+(DI) +d8
(BP)+(DI) +d16
(SI)
(SI) +d8
(SI) +d16
(DI)
(DI) +d8
(DI) +d16
end. direto
(BP)+d8
(BP)+d16
(BX)
(BX) +d8
(BX) +d16

Tabela 3: Codificao dos modos de endereamento do 8086/8088


ltima reviso Ago/2007

35

Linguagem Assembly Famlia Intel

Formao do Endereo no 8086/8088

No 8086/88 o contedo do registrador apontador de programa - IP - no


propriamente o endereo da prxima instruo a ser executada, mas a diferena
("offset") entre o endereo da prxima instruo a ser executada e um determinado
endereo inicial, conforme ilustra a Figura 12.

Figura 12: Relao entre o endereo lgico e fsico no 8086/88


De modo semelhante, o endereo efetivo de um operando calculado pela EU
do 8086/88 no o endereo fsico da posio de memria que contm o operando,
mas a diferena ("offset") entre o endereo da posio de memria que contm o
operando e um determinado endereo inicial. A este endereo inicial d-se o nome de

endereo de incio de segmento ou endereo de base.


Tanto num caso como no outro, o endereo de incio de segmento est em um
dos registradores de segmento (CS, DS, SS ou ES).
O endereo efetivo calculado pela EU, bem como o contedo do apontador de
programa - IP, so valores de 16 bits. Isto implica em que, usando um mesmo
endereo de incio de segmento pode-se enderear at 64 Kbytes de memria. A rea
contgua de memria endereada pelo 8086/88, ao executar um programa, utilizando
um mesmo endereo de incio de segmento chamada segmento.
A Figura 13 mostra como formado o endereo fsico das instrues no
8086/88. O endereo de incio de segmento , no caso de instrues, sempre definido
pelo contedo do registrador CS ("code segment register") e o "offset" pelo contedo
do registrador IP ("instruction pointer").
Para formar o endereo da instruo, o 8086/88 multiplica o contedo do registrador
de segmento CS por 16D e adiciona o resultado ao contedo do registrador IP. Note
que a multiplicao por 16D tem o mesmo efeito de deslocar o contedo de CS 4 bits
esquerda, preenchendo os 4 bits menos significativos com "0s".

ltima reviso Ago/2007

36

Linguagem Assembly Famlia Intel

Figura 13: Formao do endereo fsico no 8086/88 para acesso a cdigo.


No caso dos endereos de operandos, o microprocessador busca o endereo
de incio de segmento em qualquer dos registradores de segmento (CS, DS, SS e
ES). J o "offset" dos endereos de operandos pode envolver at 3 componentes:
Base,
ndice, e
Deslocamento
A Figura 14 ilustra como o 8086/88 calcula o "offset" e como formado o
endereo fsico dos operandos.
Os fatores base, ndice e deslocamento podem ser contabilizados ou no para o
clculo do "offset" dependendo do modo de endereamento utilizado pela instruo
executada.
Uma questo a ser ainda esclarecida : num acesso a um operando qual dos
registradores de segmento deve ser usado para determinar o endereo de incio de
segmento? De um modo geral vale a seguinte regra:
ltima reviso Ago/2007

37

Linguagem Assembly Famlia Intel

Figura 14: Formao do endereo no 8086/800 (a) para acesso a cdigo, (b) para
acesso a operando.

para cesso a

para acesso

DS

cdigo usa-se sempre o registrador CS,


a dados fora da pilha
usa-se normalmente

para acesso a dados na

o contedo do registrador

BP

pilha usa-se SS

usado para compor o endereo efetivo do

operando, o registrador de segmento o SS


Existem instrues, no entanto, que utilizam o registrador ES ao invs do
registrador DS para acessar dados. As instrues de manipulao de "strings"
implicam no uso do registrador ES na formao do endereo efetivo do operando nos
acessos de escrita. Desta forma a instruo MOVS transfere o byte ou palavra contida
no endereo (DS:SI) para o endereo (ES:DI). De modo semelhante a instruo
CMPS compara o byte ou palavra contido no endereo (DS:SI) com o byte ou palavra
do endereo (ES:DI). Tambm a instruo SCAS compara o contedo do acumulador
(registrador AL ou AX) com o contedo do endereo definido por (ES:DI).
ltima reviso Ago/2007
38

Linguagem Assembly Famlia Intel

Alm disso, possvel forar o microprocessador a utilizar no clculo do


endereo efetivo um registrador de segmento diferente do previsto pela regra acima
("default"). Nestes casos a instruo recebe um prefixo que impe a utilizaro de um
registrador de segmento distinto do definido por essas regras.
A instruo
cdigo

instruo

clocks
9+EA

88 9C 00 40

por exemplo, move o contedo da posio de memria, cujo endereo efetivo dado
pelo contedo do registrador DS ("default" neste caso) deslocado 4 bits esquerda,
adicionado ao valor do deslocamento, que neste caso o endereo do primeiro byte
do vetor ARRAY, adicionado ainda ao contedo do registrador de ndice SI, para o
registrador BL. Se, ao invs de utilizar o registrador de segmento "default", se deseja
utilizar, digamos, o registrador ES, a instruo em Assembly toma a seguinte forma:
cdigo

instruo

26 88 9C 00 40

clocks
9+EA

H casos, no entanto, em que no se pode utilizar outro registrador de


segmento diferente do "default". Por exemplo, nos acessos a instruo o registrador
CS sempre utilizado. Da mesma forma, quando se acessa a pilha utilizando o
registrador apontador de pilha - SP - necessariamente se utiliza o registrador SS como
registrador de segmento.
O contedo dos registradores de segmento normalmente definido no incio da
execuo do programa, utilizando instrues apropriadas. Nada impede porm que o
contedo dos registradores de segmento seja alterado vrias vezes ao longo do
programa.
A grande vantagem do uso destes registradores de segmento que tanto os
cdigos como os dados e a pilha podem ser carregados em qualquer regio da
memria, sem que seja necessrio modificar o cdigo objeto. Basta carregar os
registradores de segmento de modo adequado.
O sistema operacional de um microcomputador pessoal, por exemplo, antes de
carregar um programa na memria, verifica qual a regio da memria que est
disponvel naquele momento e carrega o programa da memria de massa naquela
regio. Antes de passar o controle para o programa carregado, o sistema operacional
carrega os registradores de segmento com os valores adequados. Na maioria dos
microprocessador de 8 bits, como o 8085, por exemplo, os endereos esto fixos no
cdigo objeto. Para se alterar a regio de memria onde um programa do 8085 ser
carregado necessrio alterar o cdigo objeto.
Programas que podem ser carregados em qualquer regio da memria sem
que o cdigo objeto precise ser alterado, so chamados programas relocveis.

ltima reviso Ago/2007

39

Linguagem Assembly Famlia Intel

O Mecanismo de Segmentao e as Instrues de Desvio

Evidentemente o mecanismo de segmentao da memria tem implicaes


sobre o conjunto de instrues do microprocessador.
O primeiro aspecto a abordar aqui diz respeito s instrues de desvio: JMP,
CALL e RET. Existem dois tipos de desvio: o intra-segmento e o inter-segmento.

7.1

Desvios intra-segmento

Numa instruo JMP intra-segmento o endereo para onde o programa deve


ser desviado, pertence ao mesmo segmento onde est armazenada a instruo JMP
em execuo. Neste caso, a instruo deve conter, alm do cdigo do JMP, a
especificao do novo valor do registrador IP. O seguintes exemplos so
esclarecedores:
cdigo

instruo

clocks

E9 00 40

15

FF E3

11
18+EA

FF A7 00 40

No primeiro exemplo o valor a ser carregado no IP definido na prpria


instruo. O valor codificado na instruo neste caso na realidade a diferena entre
o contedo atual e o novo contedo de IP. O que o microprocessador faz na prtica
somar este valor contido na instruo ao contedo de IP. Este tipo de desvio
chamado desvio direto.
No segundo e terceiro exemplos tem-se desvios indiretos. No segundo caso o
contedo do registrador BX copiado no registrador IP. No terceiro exemplo carregase em IP a palavra armazenada no endereo de memria especificado na instruo.
Em todos os exemplos acima se diz que o desvio do tipo prximo (NEAR), um
sinnimo de desvio intra-segmento.
Deve-se distinguir um tipo de instruo de desvio intra-segmento. Quando a
diferena entre o endereo que contm a instruo JMP e o endereo de desvio est
entre -128 e 127, pode se utilizar o desvio curto (SHORT). Esta situao muito
frequente em pequenos "loops". Neste caso especificado na instruo o cdigo da
instruo JMP e a diferena entre o valor atual e o novo valor do registrador IP
expresso em 8 bits. Este tipo de desvio chamado desvio relativo. Exemplo:

ltima reviso Ago/2007

40

Linguagem Assembly Famlia Intel

cdigo

instruo

clocks
15

EB 0F

Neste caso ao contedo de IP acrescido o valor 0FH. Observe que o cdigo


neste caso mais compacto.
cdigo

instruo

E9 78 01

clocks
15

Observe que o primeiro byte do cdigo do JMP diferente em cada caso.

7.2

Desvios inter-segmento

Diz-se que o desvio do tipo inter-segmento, quando o endereo para onde o


programa deve desviar est em outro segmento. Neste caso preciso especificar na
instruo os novos valores para os registradores IP e CS, como nos exemplos abaixo.
cdigo

Instruo

EA 00 30 34 02

clocks
15

FF AC 28 00

24+EA

No primeiro exemplo tm-se um desvio direto, e no segundo caso um desvio


indireto. Diz-se em ambos os casos que o desvio do tipo distante (FAR).

7.3

Desvios condicionais

Para desvios condicionais o processador s permite desvios do tipo curto


direto, em que a distncia entre a instruo e o endereo de desvio est na faixa -128
e 127. Exemplo:
cdigo

Instruo

76 3F

ltima reviso Ago/2007

clocks
16 ou 4

41

Linguagem Assembly Famlia Intel

7.4

Instrues CALL

A subrotina para instrues CALL semelhante. H 5 formas distintas de se


chamar uma subrotina, conforme mostram os exemplos a seguir.

cdigo

Instruo

clocks

E8 00 40

; direto prximo

19

FF D3

; indireto prximo

16

FF 10

; indireto prximo

21+EA

9A 00 03 27 11

; direto longo

FF AD 00 04

; indireto longo

28
37+EA

Uma diferena importante entre os CALLs prximos e distantes deve ser


mencionada aqui. Instrues CALL intra-segmento (prximas) salvam na pilha apenas
o contedo do IP para o retorno, portanto uma palavra de 16 bits. Quando ocorre um
CALL inter-segmento (distantes), so salvos na pilha tanto o contedo de IP quanto o
de CS, portanto duas palavras de 16 bits.

7.5

Instrues RET

De modo anlogo ao que ocorre com a instruo CALL, existem dois tipos de
instrues de retorno: o primeiro para o retorno de subrotinas distantes e outro para o
retorno de subrotinas prximas. As instrues do primeiro tipo restauram apenas o
contedo do IP, enquanto as do segundo tipo restauram tanto IP quanto CS.
Exemplos:

cdigo

instruo

clocks

CB

; intra-segmento (prximo

CA 08 00

; intra-segmento (prximo)

12

C3

; inter-segmento (distante)

18

C2 08 00

; inter-segmento (distante)

17

Deve-se deixar claro que o programador no precisa se preocupar com o tipo


de instruo a utilizar em cada caso. O prprio montador Assembly identifica qual o
tipo de instruo adequado para cada situao e produz o cdigo correspondente.
Antes de concluir esta seo cabe relacionar este assunto com o que foi
ltima reviso Ago/2007

42

Linguagem Assembly Famlia Intel

discutido na seo 3, sobre conveno de passagem de parmetro e alocao de


variveis locais em subrotinas. O exemplo considerado ento se baseava numa rotina
prxima. Se a subrotina EXEMPLO fosse do tipo distante a instruo CALL
armazenaria na pilha os valores de CS e de IP. A distncia do contedo de BP em
relao a cada parmetro de entrada seria maior, mais exatamente acrescida de 2.

Operao EU + BIU - Pr-busca de Instrues

J foi mencionado no incio do texto que o 8086/8088 constitudo de duas


unidades capazes de operar independentemente. A EU, que cuida exclusivamente da
execuo das instrues, e a BIU, que cuida exclusivamente da comunicao com o
restante do sistema. Quando a EU necessita alguma informao da memria, seja
para ler o cdigo de uma instruo ou ler/escrever um operando, ela gera uma
solicitao BIU que providencia a execuo do acesso.
Associada BIU existe uma fila de instrues com capacidade de 6 bytes no
8086 e 4 bytes no 8088, onde a BIU vai armazenando cdigos de instrues que
ainda no comearam a ser executadas, mas que o sero "provavelmente" logo em
seguida. Na verdade a BIU vai carregando bytes armazenados na memria em
endereos consecutivos quele que contm a instruo presentemente sendo
executada. Devido tendncia do microprocessador de executar instrues na
mesma ordem em que estas esto armazenadas na memria, h uma alta
probabilidade de que, ao a EU solicitar BIU o cdigo da prxima instrues, este j
se encontre armazenado na fila de instrues. Neste caso a EU no necessitar
aguardar ociosa at que a BIU v memria buscar as instrues, para s ento
iniciar sua execuo. Ao contrrio, a EU poder iniciar imediatamente a execuo da
instruo.
O esquema de pr-busca de instrues executado pela BIU erra na estimativa
de qual ser a prxima instruo a ser executada quando ocorrem instrues de
desvio. Nestes casos a BIU providencia o esvaziamento da fila de instrues e passa
a carregar bytes/palavras da memria a partir do endereo da nova instruo.
A BIU inicia um acesso de pr-busca de instruo sempre que as seguintes
duas condies estiverem satisfeitas:
1. h pelo menos 2 bytes (1 byte no caso do 8088) livres na fila

de instrues.
2. no existe nenhuma solicitao de acesso ao barramento
pendente vinda da EU.
A Figura 15 ilustra as aes do 8086 e o contedo da fila de instrues quando
o 8086 executa uma instruo. Admite-se que esta instruo esteja contida em dois
bytes e que a fila se encontra vazia imediatamente antes do incio da execuo. Esta
instruo gasta 7 ciclos de relgio para calcular o endereo efetivo do operando que
se encontra na memria e mais 6 ciclos de relgio para executar a operao.
A EU est ativa quando est executando instrues e inativa quando espera
ltima reviso Ago/2007
43

Linguagem Assembly Famlia Intel

que a BIU lhe fornea um dado ou instruo. A BIU s est ativa quando atende
alguma solicitao da EU ou quando h pelo menos 2 (no 8088 1) bytes livres na fila
de instrues. Quando estas duas condies esto satisfeitas ao mesmo tempo, a
prioridade sempre dada solicitao da EU. Quando chega uma solicitao da EU
enquanto a BIU realiza uma busca de instruo, a solicitao da EU s passa a ser
atendida depois de que o acesso que est em andamento for completado. Neste caso
a EU forada a esperar ociosa.

1 ciclo

2 ciclo

3 ciclo

4 ciclo

5 ciclo

6 ciclo

E
U

B
I
U
Figura 15: Diagrama de atividades da EU e da BIU

Tempo de Execuo das Instrues

O exemplo apresentado na seo anterior torna claro que o tempo consumido


na execuo de um programa depende tanto das instrues como da seqncia em
que estas instruo so executadas. Um mesmo conjunto de instrues pode ter um
tempo de execuo distinto dependendo da ordem em que as instrues do conjunto
so executadas. Esta caracterstica dificulta a tarefa de determinar por inspeo de
um programa em Assembly o tempo de execuo correspondente.
Nesta seo descrito um procedimento que permite estimar o tempo de
execuo de um programa a partir de uma simples inspeo das instrues que o
constituem.
Na descrio das instrues nas sees anteriores, apresentado no lado
direito de cada uma o nmero de ciclos de relgio necessrios para execut-la. Nas
instrues que envolvem operandos da memria "+EA" denota o nmero de ciclos de
relgio (clocks) adicionais necessrios para calcular o endereo efetivo do operando.
ltima reviso Ago/2007
44

Linguagem Assembly Famlia Intel

A Tabela 4 apresenta os tempos de clculo do endereo efetivo em nmero de ciclos


de relgio.
Para as instrues de desvio, os valores incluem os ciclos adicionais para
reiniciar a fila de instrues, bem como o tempo necessrio para trazer da memria a
instruo contida no endereo de destino. Para os desvios condicionais so dados
dois valores separados por um "/". O valor mais alto corresponde situao em que o
desvio se consuma e o valor mais baixo situao contrria.

Componentes do Endereo Efetivo


somente deslocamento
somente base ou ndice

clocks
6
5

deslocamento + base ou ndice

base + ndice

7
8
11
11
12
12

deslocamento
+ base
+ ndice

BX+SI ou BX+DI
BP+SI, BP+ DI
BP+DI+deslocamento
BX+SI+deslocamento
BP+SI+deslocamento
BX+DI+deslocamento

Tabela 4: Tempo consumido no clculo do endreo efetivo dos operandos em nmero


de ciclos de relgio.
Alm disso, deve-se acrescentar 4 ciclos de relgio para cada instruo que
referencia uma palavra de 16 bits contida num endereo mpar, pois o 8086 s
capaz de ler uma palavra de 16 bits num nico acesso se o byte menos significativo
da palavra estiver num endereo par. Se esta condio no for satisfeita, o 8086 gera
dois acessos, cada um referenciando uma das duas metades da palavra.
Quando se utiliza um 8088 deve ser acrescentado 4 ciclos para todos os
acessos a operandos de 16 bits, independentemente de estarem ou no
armazenados em endereos pares.
Quando se utiliza um prefixo definindo um registrador de segmento diferente do
"default", devem ser acrescentados mais dois ciclos de relgio.
O tempo total de execuo de um trecho de programa pode ser obtido
multiplicando-se o tempo de execuo de cada instruo particular pelo nmero de
vezes que ela executada. A soma destes produtos produz uma estimativa otimista,
mas bastante aproximada do valor real.
Vrios fatores podem aumentar o tempo de execuo relativamente a esta
estimativa. Estes tempos admitem que as instrues esto disponveis na fila de
instrues assim que a EU est pronta para execut-las. Quando se tem uma
sequncia de instrues rpidas (com menos do que 2 ciclos de relgio) a fila de
instrues pode esvaziar e obter-se um tempo de execuo maior.
Um outro aspecto evidenciado no exemplo da seo anterior, que a interao
ltima reviso Ago/2007

45

Linguagem Assembly Famlia Intel

entre a EU e a BIU pode ter efeitos sobre o tempo de execuo. Se a EU necessita


buscar um operando da memria, ela poder ter que esperar at que a BIU complete
o acesso em andamento antes de iniciar o acesso solicitado pela EU. Eventuais
ciclos espera no acesso a operandos podem tambm afetar o tempo de execuo
(vide exerccio 27).
A partir de experimentos realizados pelo fabricante do integrado, conclu-se,
contudo, que este mtodo de estimativa produz valores prximo dos valores reais. Os
tempos de execuo para outros processadores da famlia podem ser obtidos nos
data sheets especficos. O procedimento para estimativa , contudo,
aproximadamente o mesmo para todos eles.

10

Exerccios

1 Questo
Sejam m e k dois nmeros hexadecimais de 32 bits armazenados respectivamente
nos registradores DX:AX e CX:BX, de tal forma que AX e BX contm os 16 bits
menos significativos de m e k respectivamente. Escreva um trecho de programa em
ASM86 que subtraia k de m e coloque o resultado em DX:AX. Se m < k o resultado
produzido deve ser zero.
2 Questo
Repita o exerccio anterior admitindo que m e k esto armazenados respectivamente
a partir dos endereos MMMM e KKKK. DX:AX deve conter o resultado.
3 Questo:
Escreva um trecho de programa em ASM86 que multiplique o contedo do
registrador AL pelo contedo do registrador CL, deixando o resultado em AX. Voc
no poder usar a instruo MUL ou IMUL. Utilize sucessivas adies.
4 Questo:
Escreva um trecho de programa em ASM86 que divida o contedo do registrador DX
pelo contedo do registrador AX, deixando o quociente inteiro em AX. Voc no
poder usar a instruo DIV ou IDIV. Utilize sucessivas subtraes.
5 Questo:
Escreva um trecho de programa em ASM86 que eleve o contedo do registrador AX
ao contedo do registrador DX. O resultado de 32 bits deve ser colocado no par de
registradores CX:AX. Caso o valor obtido no possa ser representado em 32 bits, o
contedo de DX:AX dever ser nulo.

ltima reviso Ago/2007

46

Linguagem Assembly Famlia Intel

6 Questo:
Escreva um trecho de programa em ASM86 que zere todo o registrador AL, se o seu
nibble2 menos significativo for igual a zero e carregue o valor 0FFH em AL, caso
contrrio.
7 Questo:
Escreva um trecho de programa em ASM86 que produza nos bits de ordem mpar os
correspondentes bits do registrador BL, e nos bits de ordem par de AL os
correspondentes bits de CL.
8 Questo:
Escreva um trecho de programa em ASM86 que produza nos bits de ordem par de
AL o ou exclusivo dos bits correspondentes dos registradores BL e CL, e nos bits de
ordem mpar mantenha o mesmo valor inicial.
9 Questo:
Escreva um trecho de programa em ASM86 que faa o ou exclusivo entre os dois
nibbles2 do registrador AL.
10 Questo:
Escreva um trecho de programa em ASM86 que transforme um nmero em formato
BCD armazenado em AL no seu correspondente valor hexadecimal Voc no pode
usar as instrues de multiplicao, diviso, e de ajuste a BCD.
11 Questo:
Escreva um trecho de programa em ASM86 devolva no registrador CL a paridade do
contedo de AX, isto , se o nmero de 1s em AX for mpar, CL=0, e CL=1, caso
contrrio.
12 Questo:
Voc tem uma regio da memria no segmento apontado por DS do tipo:
BUFFER DB 80 DUP(?)
onde so armazenados strings de caracteres vindos de um teclado. Um string pode
ter no mximo 80 caracteres e sempre terminado pelo caracter "CR" (0DH).
Escreva uma subrotina em ASM86 que determine o tamanho do string desta regio.
Admita que os registradores de segmento esto convenientemente carregados.
13 Questo:
A tabela abaixo construda de tal maneira que o contedo de i-simo elemento
exatamente o correspondente cdigo EBCEDIC de i, onde i est codificado em
ASCII.
CONV_TAB
DB
64 DUP(0H)
DB
1
20H
DB
9
DUP(0H)
2

Nibble o termo em ingls que denota os quatro bits de cada uma das metades de um byte.

ltima reviso Ago/2007

47

Linguagem Assembly Famlia Intel

DB
7
DB
9
DB
8
DB .....

'','.','<','(','+',0h,'&'
DUP(0H)
'!','$','*',')',';',' ','-','/'

Voc tem ainda duas regies da memria no segmento apontado por DS do tipo:
BUFFER_ASCII
DB 80 DUP(?)
BUFFER_EBCDIC DB 80 DUP(?)
Na primeira regio so armazenados strings de caracteres vindos de um teclado. Um
string pode ter no mximo 80 caracteres e sempre terminado pelo caracter "CR"
(0DH). Escreva um programa em ASM86 que coloque na segunda regio de
memria o string produzido pelo teclado, devidamente traduzido para o cdigo
EBCDIC.
14 Questo:
Embora o 8086/8088 possua instrues de multiplicao e diviso inteira, escreva
um programa (MULT) que multiplique dois nmeros inteiros sem sinal m,
armazenado em AH, e k, armazenado em AL, utilizando o seguinte algoritmo
MULT(m,k)=[(k x 20 x m0]+[(k x 21 x m1]+...[(k x 27 x m7]
O resultado deve estar no registrador AX.
15 Questo:
Escreva um programa que divida o contedo de AX pelo contedo de AL, utilizando
algoritmo anlogo ao do exerccio anterior, sem usar as instrues de diviso do
8086/8088. O quociente deve ser colocado em AL e o resto em AH.
16 Questo:
Escreva uma rotina (SROT) que tome o parmetro de entrada, um valor de 16 bits, e
troque de posio o byte mais e o byte menos significativo, retornando este valor em
AX. O parmetro de entrada passado para a subrotina SROT pelo programa
principal atravs da pilha, utilizando o mecanismo de passagem de parmetros visto
neste material.
17 Questo:
Escreva uma subrotina (TWOCP) em ASM-86 que calcule o complemento de dois de
um valor de 32 bits contido nos registradores DX:AX. O valor complementado deve
retornar no prprio par de registradores DX:AX. O contedo dos demais
registradores no pode ser modificado por TWOCP.
18 Questo:
Escreva uma subrotina (LOG) em ASM-86 que calcule o ln(x+1). O valor de x um
nmero inteiro menor do que 256, expresso em 16 bits e passado a LOG pela
ltima reviso Ago/2007
48

Linguagem Assembly Famlia Intel

pilha, usando o mtodo apresentado neste material. O resultado dever ser devolvido
em 16 bits ao programa principal no registrador AX. Utilize a aproximao de Taylor:
x2 x3 x 4 x5
ln( x + 1) = x
+

+
2
3
4
5
Voc j dispe da subrotina POWER que eleva o contedo do primeiro parmetro,
ao valor do segundo parmetro retornando o resultado em AX. Ambos os parmetros
so valores inteiros menores do que 256,expressos em 16 bits, passados atravs da
pilha. POWER no altera o contedo de nenhum registrador a menos de AX. Se
ocorrer overflow, seu programa deve retornar o valor zero. Crie uma varivel
temporria que contenha os valores parciais do clculo do logaritmo.
19 Questo:
Escreva uma rotina (INTER) em ASM-86 que determine a interseco entre dois
conjuntos de nmeros de 8 bits. Os parmetros de entrada so todos expressos em
16 bits e so passados rotina na seguinte ordem: endereo inicial do vetor
contendo o primeiro conjunto, nmero de elementos do primeiro conjunto, endereo
inicial do vetor contendo o segundo conjunto, nmero de elementos do segundo
conjunto, endereo inicial do vetor contendo o conjunto interseco. Alm disso, a
subrotina deve retornar em AX a cardinalidade do conjunto interseco. Admita que
no h repeties de nmeros num mesmo conjunto, e que ambos os conjuntos tm
pelo menos um elemento.
20 Questo:
Escreva a rotina (MEDIA) em ASM-86 que calcule a mdia de n nmeros (x1, x2, ...,
xn) inteiros, sem sinal, expressos em um byte. Os parmetros - endereo a partir de
onde esto armazenados os nmeros e n - so expressos em 16 bits e so
passados a MEDIA pela pilha, conforme a conveno vista em aula. O resultado, de
16 bits, deve ser passado ao programa principal pelo registrador AX. O flag Carry,
dever quando setado que houve overflow.
21 Questo:
Escreva uma rotina (SORT) em ASM-86 que faa o sort dos bytes contidos num
determinado vetor. O endereo inicial do vetor, bem como o nmero de elementos
deste vetor, so passados rotina pela pilha. Os elementos do vetor so nmeros
inteiros com sinal. Utilize variveis auxiliares locais.
22 Questo:
Escreva a rotina MAXIMO em ASM86 que determine o maior de um conjunto de n
nmeros inteiros sem sinal expressos em 16 bits. O valor de n, expresso em 16 bits,
e os n bytes so passado a MAXIMO pela pilha, conforme o mtodo discutido neste
material. O maior valor encontrado deve retornar no registrador AX. Escreva a rotina
de modo que todos os parmetros de entrada sejam retirados da pilha antes de
retornar ao programa principal. Utilize uma varivel local para conter o valor mximo
temporrio.
ltima reviso Ago/2007

49

Linguagem Assembly Famlia Intel

23 Questo: Escreva uma subrotina (ESCALAR) em ASM-86 que execute o produto


escalar entre dois vetores de inteiros de 16 bits com sinal. O tamanho dos vetores
(expresso em 16 bits) e o endereo inicial de cada um dos dois vetores de entrada,
bem como o do endereo do vetor de sada so passados rotina pela pilha. O
resultado deve retornar ao programa principal pelo registrador AX. Admita que no
haver overflow nos clculos parciais. Utilize varivel(eis) local(is).
24 Questo
O programa abaixo soma as palavras contidas numa tabela armazenada na memria
a partir do endereo TABLE, deixando o resultado no registrador AX. Codifique este
trecho de programa em ASM86.

ADD_NEXT:

SUB AX,AX
MOV CX,25
MOV SI,50
SUB SI,2
ADD AX,TABLE[SI]
LOOP ADD_NEXT

;carrega CX c/ tamanho da tabela

25 Questo
Repita o exerccio anterior para a rotina abaixo. Este programa controla um canal de
comunicao assncrono.
USART_DATA EQU 0FF0H
USART_STAT EQU 0FF2H
CHAR_IN
AGAIN:

CHAR_IN

PROC NEAR
MOV DX,USART_STAT
IN
AL,DX
AND AL,2
JZ AGAIN
MOV DX,USART_DATA
IN
AL,DX
RET
ENDP

26 Questo
O programa abaixo um gerador de nmeros aleatrios. Repita o exerccio anterior
para este programa.
SAVE
RANDOM

DW ?
PROC NEAR
MOV CX,2053
MUL CX
ADD AX,13849

ltima reviso Ago/2007

; o "offset" de SAVE 000AH

50

Linguagem Assembly Famlia Intel

MOV SAVE,AX
SUB DX,DX
MOV CX,6
DIV CX
MOV AX,DX
RET
RANDOM

ENDP

27 Questo:
O programa abaixo calcula o fatorial de um nmero maior do que zero colocado em
AX. Estime o tempo de execuo da rotina abaixo em funo do contedo de AX.
Admita que os acessos a dados esto afetados de ciclos de espera, conforme a
tabela abaixo:
leitura
escrita
dados na pilha
1
2
dados fora da pilha
3
4
FATORIAL

ACABOU:
FATORIAL

PROC
CMP
JE
PUSH
DEC
CALL
POP
MUL
RET
ENDP

NEAR
AX,1
ACABOU
AX
AX
FATORIAL
BX
BX

28 Questo:
Nas subrotinas descritas abaixo, ALFA uma constante. Estime o tempo de
execuo das subrotinas em funo de ALFA, desde o instante em que inicia sua
execuo at o momento em que ocorre o retorno ao programa principal. Observe se
vale a pena utilizar as instrues de manipulao de string neste caso, do ponto de
vista do desempenho. Admita que cada acesso de leitura ou escrita a dados
afetado respectivamente por um ou dois ciclos de espera.
VERSAO_1

VOLTA:

PROC
NEAR
MOV
CX,ALFA
SUB BL,BL
XOR BL,[SI]

ltima reviso Ago/2007

VERSAO_2

PROC

NEAR

MOV CX,ALFA
CLD

VOLTA:
51

SUB BL,BL
LODSB

Linguagem Assembly Famlia Intel

VERSAO_1

INC SI
DEC CX
JNZ VOLTA
RET
ENDP

XOR BL,AL
LOOP VOLTA
RET
VERSAO_2

ENDP

29 Questo:
Escreva seqncias de instrues equivalentes a cada uma das instrues de
manipulao de string. Determine em seguida o tempo de execuo da instruo de
"string" e da seqncia equivalente. Compare os resultados.

ltima reviso Ago/2007

52