8086 MICROPROCESSADOR - Linguagem Assembly - Univ Minho
8086 MICROPROCESSADOR - Linguagem Assembly - Univ Minho
8086 MICROPROCESSADOR - Linguagem Assembly - Univ Minho
MICROPROCESSADOR
Linguagem Assembly
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.
O CPU (Central Processing Unit), que controla todo o funcionamento do computador. O CPU
vai buscar instrues memria, descodifica-as e executa-as.
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 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.
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).
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);
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:
?
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:
?
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.
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.
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.
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
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].
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.
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
?
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.
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
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
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:
?
JE - Jump if 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:
?
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
...
ENTAO
JMP FIMSE
ENTAO:
FIMSE:
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
...
FIMSE:
Exerccios:
?
JMP BL
JNZ [BX]
CNTDOWN:
MOV
DEC
BL,
72H
BL
JNZ CNTDOWN
?
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).
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.
CMP AX, BX
JB FAZER
JMP FIMENQUANTO
FAZER:
INC AX
JMP ENQUANTO
FIMENQUANTO:
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
...
INC AX
CMP AX, BX
JB REPETIR
ADD CL, 07H
...
INC AX
CMP AX, BX
JNB FIMREPETIR
JMP REPETIR
FIMREPETIR:
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
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
A instruo LEA utilizada para ir buscar o endereo efetivo (deslocamento em relao ao registro de
segmento) da varivel ARRAY.
?
LEA
Exerccios
?
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
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
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.
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
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:
?
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.
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
PUSH
POP
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.
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.
Altere o programa anterior de forma a que a passagem de parmetros seja feita atravs de
apontadores contidos em registros.
Altere o programa anterior de forma a que a passagem de parmetros seja feita utilizando a
stack
Exerccios
?
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