Você está na página 1de 29

8086

MICROPROCESSADOR
Linguagem Assembly

Maria Joo Nicolau


Universidade do Minho Portugal
http://piano.dsi.uminho.pt/~joao/Computacao2/node16.html

Pesquisa realizada pelos alunos:


CARLOS AUGUSTO PETRINI
PAULO TEODORO PINTO JNIOR
VALDECIR REINALDO TASCA
3 PD Noturno
Faculdade de Tecnologia de Americana

Agosto/2002

O MICROPROCESSADOR 8086
Introduo
Os computadores podem ser divididos em diferentes tipos tendo em conta o seu tamanho e capacidade.
Os maiores e mais poderosos so os chamados mainframes e chegam por vezes a ocupar uma sala. No
outro extremo esto os chamados microcomputadores, usados habitualmente como computadores
pessoais.
Os microprocessadores mais usados no fabrico de microcomputadores so os produzidos pela Intel,
que constituem j uma famlia numerosa. O 8086 foi o primeiro membro desta famlia e apesar de ter
sido h muito ultrapassado pelos seus sucessores continua a ser utilizado como um ponto de partida
para o estudo dos microprocessadores.
Durante as prximas sesses de trabalho vamos debruar-nos sobre variados aspectos dos
microprocessadores, utilizando o 8086 como caso prtico. O objetivo deste texto de apoio somente
fazer a reviso de alguns conceitos j estudados e introduzir o microprocessador 8086, a sua
arquitetura, registros, modelo de programao, etc.

Arquitetura dos microcomputadores - Revises


Um microcomputador constitudo pelos seguintes componentes:
?

O CPU (Central Processing Unit), que controla todo o funcionamento do computador. O CPU
vai buscar instrues memria, descodifica-as e executa-as.

A memria, onde se guarda instrues e dados.

A unidade de entradas/sadas, que permite ao computador receber e enviar dados para o


exterior atravs de perifricos.

Estas componentes esto ligadas entre si por conjuntos de linhas paralelas que se designam por
barramentos. Os barramentos podem ser agrupados em trs tipos:
?

Barramento de Endereos. atravs deste barramento que o CPU consegue enderear as


posies de memria de onde quer ler ou para onde quer escrever dados ou instrues. O
nmero de linhas que constitui o barramento de endereos determina a quantidade de memria
que o CPU consegue enderear. Por exemplo, um CPU com 16 linhas de endereos consegue
enderear 64 kbytes de memria (216 = 65 536).

Barramento de Dados. Este barramento constitudo por linhas bidirecionais e usado pelo
CPU para ler ou escrever dados na memria ou nas vrias portas que constituem a unidade de
entradas/sadas.

Barramento de Controle. atravs deste barramento que o CPU envia os sinais que lhe
permitem ler e escrever em posies de memria e nas vrias portas de entrada/sada.

Exemplos tpicos de sinais que o CPU envia atravs do barramento de controle so os sinais:
memory read, memory write, I/O read e I/O write.

A famlia de microprocessadores 8086


O microprocessador 8086 da Intel um microprocessador de 16 bits que suposto ser usado como
CPU num microcomputador. Quando se diz que um processador de 16 bits, quer-se dizer que a sua
unidade lgica e aritmtica, os seus registros internos, e a maior parte das suas instrues foram
concebidos para trabalhar com palavras de 16 bits. Alm disso o 8086 tem um barramento de dados de
16 bits, ou seja, pode ler e escrever na memria ou nas portas 16 bits de uma s vez. O barramento de
endereos de 20 bits, ou seja o 8086 consegue enderear 1 Mb (220) posies de memria. Cada uma
destas posies de memria ocupada por um byte.

Arquitetura
O 8086 est dividido em duas unidades distintas: a BIU (Bus Interface Unit) e a EU (Execution Unit).
A BIU envia endereos para o barramento de endereos, l instrues da memria, l e escreve dados
nas portas e na memria, etc. Por outras palavras a unidade responsvel por todas as transferncias
de dados e endereos atravs dos barramentos. A EU diz BIU onde que h de ir buscar instrues
ou dados, descodifica as instrues e executa-as.

Registros
No total este processador composto por 14 registros de 16 bits cada.

Registros Genricos
Oito desses registros so chamados registros genricos e encontram-se divididos em dois grupos de
quatro registros cada. O primeiro grupo contm os chamados data registers (AX, BX, CX e DX) e o
segundo os index registers (SI e DI) e os pointer registers (BP e SP).
Apesar de todos os registros deste microprocessador serem registros de 16 bits, os registros de dados,
AX, BX, CX e DX podem ser utilizados como registros de oito bits. Utilizamos para isso o byte mais
significativo e o byte menos significativo de cada registro (AH e AL respectivamente, para o caso do
registro AX).

Registro das Flags


Este registro um registro de condio que reflete em cada um dos seus bits situaes que ocorrem no
interior do microprocessador durante as operaes aritmticas e lgicas.

Registros de Segmento e Deslocamento


O endereamento de memria feito a partir dos registros de segmento e registros de deslocamento
(offset).
Como j foi referido, os registros internos do 8086 so todos de 16 bits e, como tambm j sabemos,
com 16 bits conseguimos apenas enderear 216 bytes, ou seja 64 Kbytes. Para enderear 1 MByte foi
necessrio recorrer a uma tcnica designada por segmentao e que consiste no seguinte: em vez de
um registro, so utilizados dois registros. Um desses registros aponta para um valor de memria
chamado base do segmento, enquanto o outro determina o deslocamento em relao a essa base num
valor mximo de 64 Kbytes.
Os registros que so a base do segmento so os registros de segmento e os registros que determinam o
deslocamento do endereo em relao a essa base chamam-se registros de deslocamento.
Existem 4 registros de segmento, so eles:
?

O CS (Code Segment) que enderea cdigo (instrues que constituem programas);

O DS (Data Segment) que enderea dados (reas de memria que contm dados);

o SS (Stack Segment) que enderea a zona de stack (zona de arquivo temporrio do contedo
de registros e variveis);

o ES (Extra Segment) que enderea dados;

Os registros de deslocamento trabalham associados aos registros de segmento.


?

O IP (Instruction Pointer) est associado ao registro CS;

O SP (Stack Pointer) est associado ao registro SS;

Associado aos registros DS e ES podem aparecer qualquer dos registros genricos embora se
usem com mais freqncia os index registers e os pointer registers.

Um endereo representado a partir de dois valores de registros tem o nome de endereo lgico. O
endereo fsico ou endereo real calculado a partir desse endereo lgico, deslocando o valor de base
do endereo, 4 bits para a esquerda, e somando ao resultado o valor do deslocamento.

Exerccios:
?

Qual o endereo fsico associado ao endereo lgico 0020h:0056h;

Qual o endereo lgico associado ao endereo fsico 02100h;

Programao do 8086 - Introduo


Introduo
Para compreendermos a estrutura de um microcomputador e os seus circuitos internos, nada melhor do
que recorrermos a programa desenvolvidos em linguagem Assembly, uma vez que esta linguagem est
muito prxima dos circuitos eletrnicos da mquina.
Como j foi referido os microcomputadores que vamos estudar so os baseados nos
microprocessadores 8086 da Intel. Todos os modelos que se seguiram ao 8086 so compatveis com
este em instrues e modo de funcionamento. Os microprocessadores posteriores ao 8086 (286, 386,
496 e Pentium) podem trabalhar em modo real ou em modo protegido. O modo real, onde o
endereamento da memria feito usando a segmentao, totalmente compatvel com o modo de
funcionamento do 8086.
O objetivo desta sesso de trabalho introduzir a linguagem Assembly do 8086. Os registros do 8086
e a forma como este enderea a memria foram introduzidos na sesso de trabalho anterior. No fim
desta sesso de trabalho os alunos devero ser capazes de escrever e compreender o cdigo de
programas muitos simples desenvolvidos em linguagem Assembly do 8086, bem como estar
familiarizados com as ferramentas necessrias ao desenvolvimento de programas nesta linguagem.

Linguagens de Programao
Para executar um programa, o microcomputador tem de ter na memria a seqncia de instrues que
o constituem, na forma binria. Existem mltiplas linguagem de programao alternativas, mas
basicamente ela dividem-se em trs tipos. So eles:
?

Linguagem Mquina. Esta a linguagem entendida pelo computador. Um programa em


linguagem mquina uma seqncia de cdigos binrios que correspondem s instrues que
se pretende que o computador execute. Esta linguagem muito pouco usada pelos
programadores, uma vez que muito difcil memorizar os milhares de cdigos binrios de
instrues que tem um microprocessador.

Linguagens Assembly. Com o objetivo de tornar mais fcil a programao sem perder o
controle do hardware muitos programadores utilizam a linguagem Assembly. A linguagem
Assembly constituda por um conjunto de instrues simblicas que so mapeadas
diretamente para linguagem mquina usando assemblers. Os assemblers traduzem, uma a
uma, as instrues da linguagem Assembly em instrues da linguagem mquina. Uma
instruo em Assembly corresponde a uma instruo em linguagem mquina.

Linguagens de alto nvel. Estas linguagens esto mais prximas da linguagem natural do que
da linguagem mquina. O trabalho de traduzir uma linguagem na outra cabe a programas
bastante complexos que se designam por compiladores. Uma instruo numa linguagem de
alto nvel corresponde normalmente a vrias instrues em linguagem mquina.

A linguagem Assembly do 8086


Para introduzir a linguagem Assembly do 8086 vamos utilizar o programa exemplo.asm. Trata-se de
um programa completo, embora muito simples, que tem como objetivo multiplicar dois nmeros de 16
bits.
DATA_HERE

SEGMENT
MULTIPLICANDO DW 204AH
MULTIPLICADOR DW 382AH
PRODUTO DW 2 DUP(0)

DATA_HERE

ENDS

CODE_HERE

SEGMENT
ASSUME CS:CODE_HERE, DS:DATA_HERE
MOV AX, DATA_HERE
MOV DS, AX
MOV AX, MULTIPLICANDO
MUL MULTIPLICADOR
MOV PRODUTO, AX
MOV PRODUTO+2, DX
MOV AH, 4CH
INT 21H

CODE_HERE

ENDS
END

Este programa multiplica dois nmeros de 16 bits e d como resultado um nmero de 32 bits que
guardado em memria.

Instrues de inicializao
Como em todas as linguagens de programao existem na linguagem Assembly uma srie de
instrues que necessrio incluir antes de se comear a escrever o programa propriamente dito. A
essas instrues vamos chamar instrues de inicializao. A finalidade destas instrues efetuar
uma srie de inicializaes que permitem a correta execuo do programa.

As diretivas SEGMENT e ENDS e a diretiva ASSUME


As diretivas SEGMENT e ENDS so usadas para identificar o grupo de dados ou de instrues que
pretendemos que faam parte do mesmo segmento. Todas os dados ou instrues que aparecem entre a
diretiva SEGMENT e a diretiva ENDS fazem parte do mesmo segmento lgico.
Um programa em linguagem Assembly do 8086 pode ter vrios segmentos de dados e vrios
segmentos de cdigo, no entanto no momento em que o executamos s trabalha com 4 segmentos
fsicos. So eles o code segment, o data segment, o stack segment e o extra segment. A diretiva
ASSUME indica ao assembler quais dos segmentos lgicos correspondem a cada um destes
segmentos.

Inicializao dos registros de segmento


Uma das inicializaes que precisa de ser sempre feita a inicializao dos registros de segmento.
Estes registros precisam de ser carregados com os endereos de memria onde queremos que os
segmentos comecem.
Como j foi referido a diretiva ASSUME diz ao assembler quais os nomes dos segmentos lgicos que
se pretende usar como code segment, data segment, stack segment e extra segment. Com excepo do
registro CS, todos os outros registros de segmento necessitam de ser inicializados. No programa
exemplo.asm as instrues MOV AX,DATA_HERE e MOV DS,AX servem para inicializar o
segmento de dados.

Nomes para os dados


Os programas trabalham com trs tipos de dados: constantes, variveis e endereos. O Assembly do
8086 permite dar nomes a qualquer um destes tipos de dados, o que permite referenci-los de forma
muito mais fcil.
As diretivas DB, DW e DD so usadas para atribuir nomes a variveis. A diretiva DB depois de um
nome significa que esse nome corresponde a uma varivel do tipo byte (8 bits), a diretiva DW significa
que o nome corresponde a uma varivel do tipo word (16 bits) e a diretiva DD significa que o nome
corresponde a uma varivel do tipo double word (32 bits).
No programa exemplo.asm a instruo MULTIPLICANDO DW 204AH declara uma varivel do tipo
word e inicializa-a com 204AH. A instruo MULTIPLICADOR DW 3B2AH declara uma varivel

tambm do tipo word e inicializa-a com o valor 3B2AH. A declarao PRODUTO DW 2 DUP(0)
guarda espao para duas words em memria, d ao endereo do inicio da primeira word o nome
PRODUTO, e inicializa as duas words com o valor zero.

Como acessar os dados


As diferentes formas que o microprocessador utiliza para acessar aos dados chamam-se modos de
endereamento. Na linguagem Assembly o modo de endereamento usado indicado na prpria
instruo. No caso do Assembly do 8086 podemos encontrar os seguintes modos de endereamento.
?

Modo de endereamento imediato. possvel que num programa haja necessidade de carregar
um nmero num registro. Por exemplo, no programa exemplo.asm uma das primeiras
instrues tem como objetivo carregar o nmero 204AH no registro AX. Para fazer isso
poderamos ter usado a instruo MOV AX, 204AH. Este modo de endereamento chama-se
modo endereamento imediato porque o nmero que vai ser carregado em AX posto nas
duas posies de memria imediatamente a seguir ao cdigo binrio da instruo MOV.

Modo de endereamento por registros. Acontece sempre que um registro usado como
operando fonte numa dada instruo, por exemplo, na instruo MOV DS,AX;

Modo de endereamento direto. Como j foi referido para aceder a dados que esto em
memria o 8086 necessita de especificar um endereo de 20 bits. Esse endereo
normalmente obtido a partir do DS e do endereo efetivo. O endereo efetivo um nmero de
16 bits que nos d um deslocamento em relao base do segmento de dados. A instruo
MOV AX, MULITPLICANDO um exemplo de endereamento direto. Esta instruo

equivalente instruo MOV AX, [0000]. O deslocamento da varivel MULTIPLICANDO em


relao ao inicio do segmento de dados 0 uma vez que esta varivel a primeira a ser
declarada. Para calcularmos o endereo fsico do dado que queremos somar a AX basta-nos
fazer um shift de 4 bits ao DS e somar o endereo efetivo, neste caso o 0, ao resultado.
?

Modo de endereamento indireto. Acontece quando o endereo efetivo est contido num
registro em vez de aparecer diretamente na instruo, por exemplo na instruo MOV AX,
[BX].

Instrues para transferncia de dados


?

MOV
A instruo MOV do 8086 tem o seguinte formato: MOV <destino>, <fonte>
Quando executada, esta instruo, copia uma palavra ou um byte da localizao especificada por
<fonte> para a localizao especificada por <destino>. A fonte pode ser um nmero, um
registro, ou uma posio de memria. O destino pode ser um registro ou uma posio de
memria. A fonte e o destino no podem ser simultaneamente posies de memria.

Operaes aritmticas
?

ADD
A instruo ADD do 8086 tem o seguinte formato: ADD <destino> <fonte>
Quando executada esta instruo soma dois nmeros, o <destino> e a <fonte>. O resultado
colocado no <destino>.

SUB
A instruo SUB do 8086 tem o seguinte formato: SUB <destino> <fonte>
Quando executada esta instruo subtrai o nmero especificado por <fonte> ao nmero
especificado por <destino> e guarda o resultado em <destino>.

MUL
A instruo MUL do 8086 tem o seguinte formato: MUL <fonte>
Quando executada esta instruo multiplica um nmero contido em AL ou em AX pelo nmero
especificado por <fonte>. Quando o nmero especificado por <fonte> um nmero de oito bits
esse nmero multiplicado pelo contedo de AL e o resultado colocado no registro AX.
Quando o nmero especificado por fonte um nmero de 16 bits esse nmero multiplicado
pelo contedo de AX e o resultado (produto) colocado no registro DX (a palavra mais
significativa do produto) e em AX (a palavra menos significativa do produto).
No programa exemplo.asm, a instruo MUL MULTIPLICADOR, multiplica o contedo do
registro AX pelo nmero 382AH.

DIV
A instruo DIV do 8086 tem o seguinte formato: DIV <fonte>
Quando executada esta instruo divide uma double word por uma word ou uma word por um
byte. Se o nmero especificado por <fonte> for um byte, a instruo DIV divide o contedo do

registro AX por esse nmero. Depois da diviso concluda, o quociente colocado no registro
AL e o resto no registro AH. Se o nmero especificado por <fonte> for uma word a instruo
DIV forma o dividendo com os registros DX (word mais significativa do dividendo) e AX (word
menos significativa do dividendo). Depois da diviso concluda, o quociente colocado no
registro AX e o resto no registro DX.

Operaes lgicas
?

AND
A instruo AND do 8086 tem o seguinte formato: AND <destino> <fonte>
Quando executada esta instruo faz o e lgico bit a bit da <fonte> e do <destino>. O resultado
da operao colocado no <destino> e a <fonte> no sofre alteraes.

OR
A instruo OR do 8086 tem o seguinte formato: OR <destino> <fonte>
Quando executada esta instruo faz o ou lgico bit a bit da <fonte> e do <destino>. O resultado
da operao colocado no <destino> e a <fonte> no sofre alteraes.

NOT
A instruo NOT do 8086 tem o seguinte formato: A NOT <destino>
Quando executada esta instruo inverte todos os bits do <destino> e guarda o resultado no
prprio <destino>.

Outras operaes
?

ROL e ROR

As instrues ROL e ROR do 8086 tm o seguinte formato: ROL <destino>, <count> ROR
<destino>, <count>
Estas instrues quando executadas rodam todos os bits de um byte ou de uma word (<destino>)
um determinado nmero de posies para a esquerda (ROL) ou para a direita (ROR). O nmero
de posies a rodar dado por <count> e o resultado colocado em destino.
?

SHL e SHR

As instrues SHL e SHR do 8086 tm o seguinte formato: SHL <destino>, <count> SHR
<destino>, <count>
Estas instrues quando executadas afastam todos os bits de byte ou de uma word (<destino>)
um determinado nmero de posies para a esquerda (SHL) ou para a direita (SHR) inserindo
zeros no lugar dos bits que foram afastados. O nmero de posies a afastar dado por <count>
e o resultado colocado em destino.

A diretiva END
A diretiva END serve para dizer ao assembler para parar de ler o programa uma vez que ele terminou.
Quaisquer instrues depois desta diretiva so ignoradas.

Ferramentas necessrias para programar em Assembly


Como as todas as outras linguagens tambm a linguagem Assembly pressupe o domnio de algumas
ferramentas. So elas: um editor de texto, um assembler, um linker e um debugger.

Editor
A primeira coisa a fazer escrever o programa fonte usando um editor de texto. O formato do
programa deve ser ASCII puro para que os dgitos de controle que os processadores de texto
geralmente juntam ao documento no apaream no programa.
Depois de escrito o programa deve ser gravado em disco com a extenso ASM.

Assembler
O assembler um programa que traduz as instrues da linguagem Assembly nos seus cdigos binrios
correspondentes. Faz normalmente duas passagens pelo cdigo fonte do programa. Na primeira
passagem calcula os deslocamentos dos vrios itens de dados e dos labels, construindo a tabela se
smbolos. Na segunda passagem o assembler produz o cdigo binrio para cada instruo e insere os
deslocamentos que calculou durante a primeira passagem.
O assembler gera os seguintes ficheiros.
?

Um ficheiro com a extenso OBJ que contm os cdigos binrios das instrues e informao
acerca dos seus endereos. este ficheiro que depois de ser processado pelo linker carregado
em memria para ser executado.

O outro ficheiro produzido pelo assembler tem a extenso LST e utilizado pelo programador
para testar e diagnosticar problemas no programa. Este ficheiro contm o cdigo Assembly e
os cdigos binrios e deslocamentos de cada instruo. Para que o TASM (Turbo Assembler)
gere este ficheiro necessrio usar o switch /l.

Linker
O linker um programa que alm de preparar o cdigo objeto para ser carregado em memria e
executado, pode juntar partes de cdigo num nico programa executvel.
O linker gera um ficheiro com a extenso EXE que contm o cdigo mquina necessrio execuo do
programa.
Existem dois tipos de ficheiros executveis, os ficheiros EXE e os ficheiros COM. Os ficheiros EXE
podem utilizar mais do que um segmento de memria na sua execuo. Os ficheiros COM, so
ficheiros de dimenses mais reduzidas que s utilizam um segmento de memria, e comeam
geralmente num endereo cujo deslocamento 0100H. Os ficheiros COM podem ser obtidos a partir
de ficheiros EXE utilizando para isso o programa EXE2BIN.

Debugger
O debugger um programa que permite carregar um programa executvel em memria, e execut
-lo
testando-o. possvel examinar e at modificar contedo dos registros e posies de memria
medida que o programa executado. Por exemplo se se parar no fim de executar cada instruo,
consegue-se analisar todas as alteraes nos valores dos registros ou em posies de memria pelas
quais o programa em execuo responsvel. Em vez de parar no fim da execuo de cada instruo
podem inserir-se breakpoints nalguns pontos do programa. Nesse caso a execuo s pra quando
encontra um breakpoint.
Para executar um programa usando o Turbo Debugger necessrio usar os switchs /zi quando usa o
TASM e o switch /v quando usa o TLINK.

Exerccios
?

Descreva o funcionamento e o resultado de cada uma das seguintes instrues:

MOX AX, BX
MOV CL, 37H
MOV CX, [246BH]
MOV CX, 246BH
MOV AX, [BX]
ADD AL, DH
MUL BX
DIV BL
SUB AX, DX
OR CL, BL
NOT AH
ROL BX, 1
ROR BX, CL
AND AL, 0FH
Descubra erros nas seguintes instrues:
MOX BH, AX
MOV DX, CL
ADD AL, 2073H
MOV 7632H, CX
Explique o funcionamento e o resultado dos seguintes grupos de instrues:
ADD BL, AL
MOV [0004], BL
MOV CL, 04
ROR DI, CL
MOV BX, 0004H
MOV AL, [BX]
SUB AL, CL
INC BX
MOV [BX], AL

Escreva um programa em Assembly do 8086 que soma dois nmeros e guarda esse resultado
em memria. Utilize o programa desenvolvido para somar os nmeros +115e +79 e interprete
o resultado.

Escreva um programa, em linguagem Assembly do 8086, que calcula a mdia entre dois
nmeros.

Escreva um programa em Assembly do 8086 que converte dois dgitos decimais representados
em ASCII para o cdigo packet BCD.

Linguagem Assembly do 8086 - Implementao de


Expresses condicionais
Introduo e Objetivos
Quando temos em mo um problema de programao para resolver, o primeiro passo a dar pensar no
que queremos de fato que o programa faa e de que forma queremosque o faa. Como sabe,
seqncia de operaes usadas para resolver um problema no contexto da programao chama
-se
algoritmo. Depois do algoritmo escrito, o prximo passo traduzi-lo para a linguagem de
programao em causa, neste caso para a linguagemAssembly do 8086.
Os programas que implementamos na sesso de trabalho anterior so simples seqncias de instrues.
No entanto, muitos dos algoritmos exigem funcionalidades mais complicadas, como por exemplo,
escolher entre duas ou mais seqncias de instrues dependendo de alguma condio ou repetir a
mesma seqncia de instrues at que uma dada condio ocorra.
O objetivo desta sesso de trabalho mostrar aos alunos como se implementam algoritmos com
expresses condicionais na linguagem Assembly do 8086.

Saltos, Flags e Saltos Condicionais


Como j foi dito numa sesso anterior, o registro CS (Code Segment Register) contm os 16 bits mais
significativos do endereo fsico onde comea o segmento de cdigo. Esse segmento contm os
cdigos binrios das instrues que constituem o programa que est a ser executado. O registro IP
(Instruction Pointer Register) referencia dentro do segmento de cdigo qual a prxima instruo a ser
executada, ou seja, o seu valor representa o deslocamento em relao ao CS que tem a prxima
instruo.

Se o programa em causa for uma simples seqncia de instrues o endereo da prxima instruo a
executar sempre o imediatamente a seguir instruo anterior. Isto j no assim se o programa
contiver saltos (jumps).
As instrues JMP so usadas para indicar ao processador que a prxima instruo a executar no a
que est imediatamente a seguir mas sim outra. Existemjumps condicionais que ocorrem se uma
determinada condio se verificar ejumps incondicionais que ocorrem sempre, sem estarem sujeitos a
qualquer condio.
O 8086 calcula o endereo fsico da prxima instruo a executar adicionando o deslocamento contido
no registro IP ao endereo de base representado pelo nmero contido no registro CS. Quando o 8086
executa a instruo JMP, carrega um novo nmero (deslocamento) no registro IP e por vezes tambm
um novo nmero no registro CS.
?

JMP

A instruo JMP do Assembly do 8086 tem o seguinte formato: JMP <destino>


Se o destino est num segmento de cdigo diferente do da prpria instruo ento necessrio
alterar no s o valor do registro IP, mas tambm o valor do registro CS. Neste caso, diz-se que
estamos perante um far jump. Se, pelo contrrio o destino est no mesmo segmento diz
-se que
estamos perante um near jump.
Os jumps podem tambm ser diretos ou indiretos. So diretos se o destino for um nmero,
nmero esse que referencia um deslocamento em relao localizao atual. Nesse caso o novo
valor do IP ficar a ser IP+<destino>. So indiretos se o destino for um registro ou localizao
de memria. Nesse caso o 8086 ter de ir buscar o contedo do registro ou localizao de
memria, contedo esse que passar a ser o novo valor do registro IP.
No caso dos jumps diretos do tipo near o destino pode ser um nmero de 8 bits ou de 16 bits. No
caso de ser um nmero de 16 bits pode variar desde 32767 a-32768. No caso de ser um nmero
de 8 bits diz-se tambm que do tipo short e referencia um deslocamento que varia entre 127 e128 em relao localizao atual.
O 8086 tem seis flags condicionais: a carry flag (CF), a parity flag (PF), a auxiliary parity flag (AF), a
zero flag (ZF), a sign flag (SF) e a overflow flag (OF).

As vrias instrues do Assembly 8086 alteram os valores das vrias flags, por exemplo, quando se
somam dois nmeros de 16 bits e o resultado no cabe em 16 bits a CF fica com o valor 1.
Como j foi referido um jump condicional est sujeito a uma determinada condio. A instrues que
especificam jumps condicionais analisam o contedo de determinadas flags para decidir se o jump se faz
ou no,

Todos os jumps condicionais so do tipo short, isto significa que o destino tem de especificar um
endereo dentro do mesmo segmento da instruo JMP e alm disso o deslocamento em relao
localizao atual varia apenas de 127 a -128.
Estas instrues aparecem normalmente depois de instrues de operaes aritmticas e lgicas (que
alteram os valores das flags), e quase sempre depois da instruo CMP.
?

CMP

A instruo CMP tem o seguinte formato: CMP<destino>, <fonte>


Quando executada esta instruo compara o byte ou word especificada por <fonte> pelo byte ou
word especificada por <destino>. A fonte pode ser um nmero, um registro, ou uma posio de

memria. O destino pode ser um registro ou uma posio de memria. A fonte e o destino no
podem ser simultaneamente posies de memria.
Esta instruo muitas vezes usada com as seguintes instrues que implementamjumps condicionais:
?

JA/JNBE - Jump if Above ou Jump if Not Below or Equal

JAE/JNB - Jump if Above or Equal ou Jump if Not Below

JB/JNAE - Jump if Below ou Jump if Not Above or Equal

JBE/JNA - Jump if Below or Equal ou Jump if Not Above

JG/JNLE - Jump if Greater ou Jump if Not Less or Equal

JAE/JNB - Jump if Greater or Equal ou Jump if Not Less

JB/JNAE - Jump if Less ou Jump if Not Greater or Equal

JBE/JNA - Jump if Less or Equal ou Jump if Not Greater

JE - Jump if Equal

JNE - Jump if Not Equal

Os termos above e below utilizam-se quando queremos comparar nmeros sem sinal. Os termosgreater
e less utilizam-se quando queremos comparar nmeros com sinal.
Alm destas instrues, existem outras que fazem depender osjumps diretamente dos valores das flags.
So elas:
?

JC - Jump if Carry (CF=1)

JNC - Jump if Not Carry (CF=0)

JZ - Jump if Zero (ZF=1)

JNZ - Jump if Not Zero (ZF=0)

JO - Jump if Overflow (OF=1)

JNO - Jump if Not Overflow (OF=0)

JP - Jump if Parity (PF=1)

JNP - Jump if Not Parity (PF=0)

JS - Jump if Sign (SF=1)

JNS - Jump if Not Sign (SF=0)

Expresses Condicionais

If-Then
A expresso algortmica If-Then tem o seguinte formato:
if <condicao> then
accao
accao
...
endif

Esta expresso quer dizer que, se a <condio> se verificar a seqncia de aes que est entre othen
e o endif deve ser executada.
Na linguagem Assembly do 8086 esta expresso implementada com umjump condicional.
Por exemplo, o algoritmo:
if AX=BX then
AX=AX+2
CL=7
...

Seria traduzido para linguagem Assembly do 8086 da seguinte forma:


CMP AX, BX
JNE FIMSE
ADD AX, 0002H
FIMSE:

ADD CL, 07H


...

Outra hiptese seria:


CMP AX, BX
JE

ENTAO

JMP FIMSE
ENTAO:

ADD AX, 0002H

FIMSE:

ADD CL, 07H


...

Se a seqncia de instrues entre o then e o endif contiver muitas instrues a segunda hiptese a
mais aconselhvel, uma vez que, como j foi referido, osjumps condicionais so do tipo short.

If-Then-Else
A expresso algortmica if-then-else tem o seguinte formato:
if <condicao> then
accao
accao
...
else
accao
accao
...
endif

Esta expresso quer dizer que, se a <condio> se verificar a seqncia de aes que est entre othen
e o else deve ser executada. Caso contrrio a seqncia de aes que est entre oelse e o endif deve ser
executada.
Na linguagem Assembly do 8086 esta expresso implementada com umjump condicional e um jump
incondicional.
Por exemplo, o algoritmo:
if AX=BX then
AX=AX+2
else
AX=AX-2
CL=7
...

Seria assim traduzido para linguagem Assembly:


CMP AX, BX
JNE SENAO
ADD AX, 0002H
JMP FIMSE
SENAO:

SUB AX, 0002H

FIMSE:

MOV CL, 07H


...

Exerccios:
?

Descubra erros nas seguintes instrues ou grupos de instrues:

JMP BL

JNZ [BX]

CNTDOWN:

MOV

DEC

BL,

72H
BL

JNZ CNTDOWN
?

Escreva um programa em Assembly do 8086 que encontra o maior de doisnmeros e


armazena-o numa varivel em memria.

Escreva um programa em Assembly do 8086 que converta um byte (constitudo por dois
dgitos Hexadecimais) em dois cdigos ASCII (os dois cdigos ASCII correspondentes aos
dois dgitos Hexadecimais).

Linguagem Assembly do 8086 - Implementao de


Ciclos e Arrays
Introduo e Objetivos
A resoluo de problemas de programao passa, muitas vezes, pela repetio da mesma seqncia de
aes. Existem vrias expresses algortmicas que tm como objetivo a implemen
tao de ciclos, ou
seja a repetio da mesma seqncia de instrues at que determinada condio se verifique.
Exemplos de expresses que implementam ciclos so as expressesWhile-Do, Repeat-Until e For-ToDo. Estas expresses so particularmente teis quando se pretende repetir a mesma operao sobre um

conjunto de items de dados.


O objetivo desta sesso de trabalho mostrar aos alunos como se implementam algoritmos com ciclos
na linguagem Assembly do 8086

Ciclos

While-Do
A expresso algortmica While-Do tem o seguinte formato:
while <condio> do
accao
accao
...
endwhile

Esta expresso quer dizer que, enquanto a <condio> se verificar, a seqncia de aes que est entre
o do e o endwhile deve ser repetida. De notar que a <condio> verificada antes de qualquer das
aes ser levada a cabo.
Na linguagem Assembly do 8086 esta expresso implementada com umjump condicional e dois
jumps incondicionais.

Por exemplo, o algoritmo:


while AX<BX do
AX=AX+1
CL=7
...

Seria traduzido para linguagem Assembly do 8086 da seguinte forma:


ENQUANTO:

CMP AX, BX
JB FAZER
JMP FIMENQUANTO

FAZER:

INC AX
JMP ENQUANTO

FIMENQUANTO:

ADD CL, 07H


...

Repeat-Until
A expresso algortmica Repeat-Until tem o seguinte formato:
repeat
accao
accao
...
until <condio>
endrepeat

Esta expresso tem o mesmo significado que a expressowhile-do com a diferena de que a condio
verificada apenas no fim de ser executada a seqncia de aes. Isto faz com que a seqncia de aes
seja sempre executada uma vez, quer a condio se verifique, quer no.
Na linguagem Assembly do 8086 esta expresso implementada com umjump condicional.
Por exemplo, o algoritmo:
repeat
AX=AX+1
until AX<BX
endrepeat

CL=7
...

Seria traduzido para linguagem Assembly do 8086 da seguinte forma:


REPETIR:

INC AX
CMP AX, BX
JB REPETIR
ADD CL, 07H
...

Outra hiptese seria:


REPETIR:

INC AX
CMP AX, BX
JNB FIMREPETIR
JMP REPETIR

FIMREPETIR:

ADD CL, 07H


...

Se a seqncia de instrues a repetir (seqncia de instrues que est entr


e o Repeat e o Until
contiver muitas instrues a segunda hiptese a mais aconselhvel, uma vez que, como j foi
referido, os jumps condicionais so do tipo short.

For-To-Do
A expresso algortmica For-To-Do tem o seguinte formato:
for <count=1> to <count=n>
accao
accao
...
endfor

Esta expresso uma variante da expresso while-do onde se sabe partida quantas vezes queremos
executar a seqncia de aes. Por cada vez que a seqncia de aes executada a varivelcount
incrementada um valor. Quando atingir o valorcount o ciclo termina.
Na linguagem Assembly do 8086 esta expresso implementada com a instruoLOOP.
?

LOOP

A instruo LOOP do 8086 tem o seguinte formato: LOOP <label>


Quando executada, esta instruo, repete uma seqncia de instrues um determinado nmero
de vezes contido no registro CX. Cada vez que a instruo LOOP executada o contedo do
registro CX decrementado um valor. Se depois de decrementado o contedo do registro CX
for diferente de zero a instruo LOOP implementa um jump para o endereo referenciado por

<label>. O <label> referencia um deslocamento em relao ao registro CS onde est a primeira


instruo do ciclo. Esse valor tem de estar contido entre-128 e +127.
Por exemplo, o algoritmo:
for count=1 to count=10
AX=AX+1
endfor
CL=7
...

Seria traduzido para linguagem Assembly do 8086 da seguinte forma:


MOV CX, 0AH
REPETIR:

INC AX
LOOP REPETIR
ADD CL, 07H
...

Arrays
Os ciclos so especialmente teis quando se pretende implementar a mesma operao ou a mesma
seqncia de operaes para um conjunto de items de dados guardados em posies contguas de
memria. Um conjunto de items de dados do mesmo tipo armazenados em posies contguas de
memria chama-se um array.
Na linguagem Assembly do 8086 um array de 10 bytes podia ser declarado e inicializado da seguinte
forma:
DATA SEGMENT
...
ARRAY

DB

00H, 10H, 20H, 30H, 40H, 50H, 60H, 70H, 80H, 90H

...
DATA ENDS

Neste caso deu-se ao array o nome ARRAY. Quando o programa for carregado em memria para ser
executado, dez bytes do segmento de dados vo ser carregados com os valores 00H, 10H, 20H, 30H,
40H, 50H, 60H, 70H, 80H e 90H, em posies contguas de memria.
Para aceder aos items de dados que constituem o array pode-se utilizar endereamento direto ou
indireto. Por exemplo, para mover para o registro AL o quinto elemento doarray, utilizando o
endereamento direto, poderamos usar a seguinte instruo:
MOV AX, ARRAY+0005H

Utilizando o endereamento indireto seria necessrio a seguinte seqncia de instrues:


LEA BX, ARRAY+05H

MOV AL, [BX]

A instruo LEA utilizada para ir buscar o endereo efetivo (deslocamento em relao ao registro de
segmento) da varivel ARRAY.
?

LEA

A instruo LEA do 8086 tem o seguinte formato: LEA <destino>, <fonte>


Quando executada, esta instruo, carrega o deslocamento da posio de memria especificada
por <fonte> no registro de 16 bits especificado por <destino>.
Tambm possvel indexar os vrios elementos de umarray. Neste caso a seqncia de instrues
seria:
MOV BX, 05H
MOV AL, ARRAY[BX]

Aqui, o endereo efetivo do elemento do array calculado somando o endereo do ARRAY e o


contedo de BX.

Exerccios
?

Implemente um programa em Assembly do 8086 que calcule a mdia de 4bytes armazenados


num array em memria.

Altere o programa anterior para que este seja capaz de calcular a mdia de qualquer nmero de
bytes armazenados em memria numarray, supondo que a dimenso do array est guardada na

primeira posio do array.

Linguagem Assembly do 8086 - Procedimentos


Introduo e Objetivos
Na sesso de trabalho anterior estudamos a implementao de ciclos usando a linguagem Assembly do
8086. Um ciclo a repetio da mesma seqncia de aes at que determinada condio se verifique.
Por vezes necessitamos de repetir a mesma seqncia de aes no no mesmo ponto, mas sim em
diferentes pontos de um programa. Para evitar escrever a mesma seqncia de instrues de cada vez
que necessitamos dela podemos escrev-la como se fosse um sub-programa separado do programa
principal e, nesse caso, sempre que precisarmos da seqncia de instrues nele contidas, invocamo
lo. Estes sub-programas designam-se habitualmente por procedimentos.
O objetivo desta sesso de trabalho mostrar aos alunos como se implementam programas com
procedimentos usando a linguagem Assembly do 8086.

Escrever e invocar procedimentos


Para delimitar o conjunto de instrues que constituem um procedimento utili
zam-se as diretivas
PROC e ENDP. Se, em conjunto com cada uma destas diretivas usarmos um nome label
( ), podemos

invocar o procedimento usando esse label. A diretiva PROC indica o inicio do procedimento e a
diretiva ENDP o fim.
Suponhamos que pretendamos implementar um procedimento para calcular a mdia entre doisbytes.
As fronteiras do procedimento podero ser estabelecidas da seguinte forma:
MEDIA

PROC NEAR
<conjunto de instrues que constituem o procedimento MEDIA>

MEDIA

ENDP

Sempre que precisamos de executar a seqncia de instrues contida num procedimento usamos a
instruo CALL. esta instruo que indica ao processador qual o endereo da primeira instruo do
procedimento. A instruo RET tem que aparecer no fim do procedimento paraindicar ao processador
que deve voltar ao programa chamador e executar a instruo que est imediatamente a seguir
instruo CALL.
?

CALL

A instruo CALL do 8086 tem o seguinte formato: CALL <destino>


Quando executada, esta instruo, executa duas operaes. Primeiro armazena o endereo da
instruo que est imediatamente a seguir instruo CALL. Este endereo chamado o
endereo de retorno porque o endereo para o qual a execuo volta depois do procedimento
ser executado. Se a instruo CALL invoca um procedimento dentro do mesmo segmento de
cdigo ento diz-se que estamos perante um call do tipo near. Nesse caso s necessrio
armazenar o contedo do registro IP, uma vez que o valor do registro CS se mantm inalterado.
Se a instruo CALL invoca um procedimento noutro segmento de cdigo ento necessrio
armazenar o contedo do registro CS e do registro IP. A segunda operao da instruoCALL
consiste em alterar o contedo do registro IP, e por vezes tambm o do registro CS, em funo
do <destino>. O novo par CS e IP dever apontar para a primeira instruo do procedimento.
A maior parte dos programas invoca os procedimentos usando o prprio nome label
( ). Neste
caso diz-se que estamos perante um call direto. No entanto semelhana do que acontece com a
instruo JMP, pode haver calls diretos e indiretos e calls intra ou inter-segmento.
?

RET
A instruo RET do 8086 no tem operandos.
Como j foi dito, quando executada a instruo CALL, o endereo de retorno armazenado.
Caso se trate de um call do tipo near esse endereo constitudo apenas pelo valor do IP. A
instruo RET, quando executada, vai buscar esse valor e carrega-o de novo no registro IP.

Escrever e invocar procedimentos


Para delimitar o conjunto de instrues que constituem um procedimento utilizam-se as diretivas
PROC e ENDP. Se, em conjunto com cada uma destas diretivas usarmos um nome label
( ), podemos

invocar o procedimento usando esse label. A directiva PROC indica o inicio do procedimento e a
diretiva ENDP o fim.
Suponhamos que pretendamos implementar um procedimento para calcular a mdia entre dois
bytes.
As fronteiras do procedimento podero ser estabelecidas da seguinte forma:
MEDIA

PROC NEAR
<conjunto de instrues que constituem o procedimento MEDIA>

MEDIA

ENDP

Sempre que precisamos de executar a seqncia de instrues contida num procedimento usamos a
instruo CALL. esta instruo que indica ao processador qual o endereo da primeira instruo do
procedimento. A instruo RET tem que aparecer no fim do procedimento para indicar ao processador
que deve voltar ao programa chamador e executar a instruo que est imediatamente a seguir
instruo CALL.
?

CALL

A instruo CALL do 8086 tem o seguinte formato: CALL <destino>


Quando executada, esta instruo, executa duas operaes. Primeiro armazena o endereo da
instruo que est imediatamente a seguir instruo CALL. Este endereo chamado o
endereo de retorno porque o endereo para o qual a execuo volta depois do procedimento
ser executado. Se a instruo CALL invoca um procedimento dentro do mesmo segmento de
cdigo ento diz-se que estamos perante um call do tipo near. Nesse caso s necessrio
armazenar o contedo do registro IP, uma vez que o valor do registro CS se mantm inalterado.
Se a instruo CALL invoca um procedimento noutro segmento de cdigo ento necessrio
armazenar o contedo do registro CS e do registro IP. A segunda operao da instruoCALL
consiste em alterar o contedo do registro IP, e por vezes tambm o do registro C
S, em funo
do <destino>. O novo par CS e IP dever apontar para a primeira instruo do procedimento.
A maior parte dos programas invoca os procedimentos usando o prprio nome label
( ). Neste
caso diz-se que estamos perante um call direto. No entanto semelhana do que acontece com a
instruo JMP, pode haver calls diretos e indiretos e calls intra ou inter-segmento.
?

RET
A instruo RET do 8086 no tem operandos.
Como j foi dito, quando executada a instruo CALL, o endereo de retorno armazenado.
Caso se trate de um call do tipo near esse endereo constitudo apenas pelo valor do IP. A
instruo RET, quando executada, vai buscar esse valor e carrega-o de novo no registro IP.

A stack do 8086
Na seo anterior vimos que a instruo CALL necessitava de um local para armazenar o endereo de
retorno, para que no fim da execuo do procedimento a instruo RET o pudesse ir buscar. Esse local
uma zona de memria de alguma forma especial designada porstack.
Alm de servir para armazenar o endereo de retorno a stack tem tambm outras funes,
nomeadamente:
?

Armazenar o contedo de registros que queremos preservar;

Passar parmetros para/de procedimentos

O 8086 trata a stack como um segmento de memria que semelhana dos outros tem no mximo
64kbytes. Existem dois registros especficos para trabalhar com a stack: o registro SS (Stack Segment)
que semelhana dos registros DS e CS dever conter os 16 bits mais significativos do endereo de
inicio da stack, e o SP (Stack Pointer) que contm o deslocamento em relao ao SS da ltima palavra
escrita na stack. A posio ocupada pela ltima palavra escrita na stack, designa-se habitualmente por
topo da stack e para esta posio que aponta o registro SP.
O SP automaticamente decrementado dois valores antes de alguma palavra ser escrita na stack, por
isso este registro deve ser inicializado com o tamanho dastack e no com zero.

Guardar o endereo de retorno


J foi dito que o endereo de retorno era armazenado nastack pela instruo CALL e de l retirado
pela instruo RET.
Quando a instruo CALL executada para efetuar um call do tipo near o SP automaticamente
decrementado dois valores e o contedo do registro IP copiado para a nova posio apontada por SP.
Quando o processador encontra a instruo RET no fim do procedimento, copia o contedo da posio
de memria apontada por SP para o registro IP e incrementa o SP dois valores.
Por exemplo, assumindo que o valor do SS 7000H e o valor de SP 0050H, ento o endereo fsico do
topo da stack 70050H. Depois de um call do tipo near o SP ficar com o valor 004EH e o endereo
fsico do topo da stack passaria a ser 7004EH. Quando a instruo RET for executada, o valor
armazenado em stack (a palavra apontada por SP) voltava a ser colocado no registro IP e o registro SP
depois de incrementado voltava ao valor 0050H.
Para usarmos a stack num programa a primeira coisa a fazer declar-la. Como j foi dito o 8086 trata
a stack como outro segmento qualquer. Ento para declararmos umastack poderamos usar a seguinte
seqncia de instrues:

STACK_SEG SEGMENT
DW 40 DUP(0)
STACK_TOP LABEL WORD
STACK_SEG ENDS

Esta seqncia de instrues declara uma stack com espao para 40 words. Como as palavras so
escritas na stack a partir do topo convenienteter um label que nos permita referenci-lo.
Como todas as instrues que escrevem palavras nastack decrementam primeiro o SP dois valores e s
depois que escrevem a palavra, convm inicializarmos o SP com o primeiro endereo par depois das
40 palavras que constituem a stack.
tambm necessrio inicializar o registro SS para que este aponte para o inicio dastack. Para fazermos estas inicializaes poderamos usar as seguinte seqncia de instrues:
CODE_SEG SEGMENT
ASSUME: CS:CODE_SEG, SS:STACK_SEG
MOV AX, STACK_SEG
MOV SS, AX
LEA SP, STACK_TOP
..........
CODE_SEG ENDS

Gravar o contedo dos registros


por vezes necessrio usar registros dentro do procedimento que tambm esto a ser usados c fora
no programa chamador. Para que o uso de registrosdentro dos procedimentos no interfira com a sua
utilizao aqui fora usa-se a stack para guardar os seus valores originais. A idia escrever nastack os
valores dos registros que so usados no procedimento antes do procedimento comear a us
-los e
consequentemente a alter-los, e no fim do procedimento voltar a pr tudo como estava.
Para isso usam-se as instrues PUSH e POP.
?

PUSH

A instruo PUSH do 8086 tem o seguinte formato: PUSH <fonte>


Quando executada, esta instruo, executa duas operaes. Primeiro decrementa o SP dois
valores e depois copia para a posio da stack apontada por SP o contedo de <fonte>. A fonte
pode ser um registro de 16 bits ou uma palavra em memria.
?

POP

A instruo POP do 8086 tem o seguinte formato: POP <destino>


Quando executada, esta instruo, executa duas operaes. Primeiro copia para o contedo de
<destino> a palavra em stack apontada pelo registro SP e depois incrementa SP dois valores. O
destino pode ser um registro de 16 bits ou uma palavra em memria.

Como a stack funciona segundo o principio last-in-first-out os pops tem que ser efetuados pela ordem
inversa pela qual foram efetuados os pushs.

Passagem de argumentos de/para procedimentos


Muitos procedimentos atuam sobre dados ou endereos e devolvem resultados ao programa chamador.
Aos dados e endereos que passamos para/de procedimentos chamam-se parmetros.
Existem vrias formas possveis de passar parmetros para e de procedimentos. So elas:
?

Atravs dos registros;

Atravs de posies de memria;

Atravs de apontadores para posies de memria contidos em registros;

Atravs da prpria stack

Passagem de parmetros em registros


Neste caso necessria escolher quais os registros que vo ser usados para transportar os parmetros
para o procedimento. e quais os que vo ser usados para devolver os resultados ao programa
chamador.
Tomando como exemplo o procedimento que calcula a mdia entre doisbytes, vamos necessitar de
dois registros de 8 bits (por exemplo o AL e o AH) para passar os bytes para o procedimento e um
registro de 8 bits (por exemplo o AL) para devolver o resultado (mdia) ao programa chamador.
?

Implemente um procedimento que calcula a mdia entre doisbytes e escreva um programa que
o invoca. Utilize registros para passagem de parmetros e para retornar o resultado.

Passagem de parmetros em posies de memria


tambm possvel pr um procedimento a aceder a variveis em memria atravs do seu prprio
nome. Embora se use por vezes, este mtodo no o mais aconselhvel uma vez que to
rna os
procedimentos pouco flexveis e pouco versteis.
?

Altere o programa anterior para que o procedimento v buscar os dados diretamente


memria e guarde tambm diretamente em memria o resultado.

Passagem de parmetros atravs de apontadores contidos


em registros
Para ultrapassar as limitaes do mtodo anterior usa-se muitas vezes a passagem de parmetros
atravs de apontadores para posies de memria, apontadores esses contidos em registros.
Para isso carregam-se os registros com os endereos das posies de memria que contm as variveis
que queremos manipular dentro dos procedimentos, por exemplo usando a instruoLEA. Dentro do
procedimento usamos os parntesis retos para aceder s posies apontadas pelos registros.
Este mtodo mais verstil que o anterior pois permite que se passe para o procedimento apontadores
para quaisquer posies de memria. Alm disso tanto possvel passar apontadores para dados
simples como para arrays ou strings.
?

Altere o programa anterior de forma a que a passagem de parmetros seja feita atravs de
apontadores contidos em registros.

Passagem de parmetros utilizando a stack


Para usar este mtodo necessrio que algures no programa principal antes de se invocar o
procedimento se utilize a instruo PUSHpara escrever na stack os vrios parmetros.
Dentro do procedimento as instrues vo ler os argumentos stack de acordo com as necessidades. O
mesmo se passa para retornar os resultados ao programa chamador, mas desta vez ao contrrio. Neste
caso so as instrues do procedimento que escrevem os resultados nastack e o programa principal
que os vai l buscar.
Para usar este mtodo necessrio fazer uma mapa da stack, para que facilmente se saiba onde que
esto os vrios parmetros e tambm para onde que est a apontar, em cada instante, o registro SP.
?

Altere o programa anterior de forma a que a passagem de parmetros seja feita utilizando a
stack

Exerccios
?

Suponha que um determinado programa precisava em vrios pontos de converter bytes em


packet BCD para bytes com o valor equivalente representados em cdigo binrio.

Escreva um procedimento em linguagem Assembly do 8086 que converte umbyte em BCD


para o seu equivalente em binrio. Como parmetro de entrada este procedimento dever
receber o byte em BCD a converter. Como resultado este procedimento dever retornar o byte
em binrio convertido. Utilize os vrios mtodos que conhece para efetuar a passagem de
parmetros e para retornar os resultados.

Escreva um programa em Assembly do 8086 que invoca o procedimento implementado na


alnea anterior para converter um nmero com 4 dgitos BCD.

Referncias
1 Douglas V. Hall, Microprocessors and Interfacing - Programming and Hardware,
McGrawHill International Editions, 1992
2 Antnio Sampaio, HARDWARE para Profissionais, FCA - Editora de Informtica, 1998

Você também pode gostar