Você está na página 1de 27

Escola Superior de Tecnologia e Gesto

Instituto Politcnico de Leiria

Microprocessador Intel 8086

Apontamentos de
Arquitectura de Computadores

Arquitectura de Computadores / ESTG-IPL

1 - MICROPROCESSADOR 8086

Motivao
Embora j hajam microprocessadores derivados do 8088/8086 muito mais evoludos
(80188, 80186, 80286, 8386 e 80486), vai-se comear um estudo de base pelo 8086
da Intel devido a duas razes essenciais:
- foi aquele que deu origem ao aparecimento em 1978 do chamado PC atravs do
seu uso pela IBM no chamado IBM PC/XT;
- o seu conjunto de instrues continua totalmente compatvel, inclusiv com o
Pentium.

ESTRUTURA DE UM MICROCOMPUTADOR BASEADO NO 8086


MICROCOMPUTADOR

Sistema constitudo basicamente por uma unidade de processamento central (CPU),


memria e portos. A respectiva interligao feita por intermdio de 3 barramentos:
barramento de endereos, de controlo e de dados.
MICROCOMPUTADOR BASEADO NO 8086

Se o pino MN / MX permanecer ao nvel lgico "0", o 8086 opera no seu modo


mximo; se o nvel lgico for "1" ento a operao ser no modo mnimo.
de notar que o 8088 apenas difere do 8086 no barramento de dados, que de 8 bits.
(Figura 1- "Pin-out" e operao em modo mximo.)
(Figura 2- operao em modo mnimo.)
CPU
Unidade de Processamento Central - microprocessador.
RAM
"Random-Acess Memory" - memria voltil para escritas/leituras.
ROM
"Read-Only Memory" - memria no voltil para leituras.
Portos
Portos para ligao de dispositivos em paralelo (p. ex. uma PRN) e em srie (p. ex.
um rato) e tambm a ligao de teclados e CRTs.
BUS de controlo
No modo mnimo este constitudo basicamente pelos sinais:
M / IO - permite escolher entre operaes de memria e de I/O;
RD - vai a "0" para operaes de leitura;
2

Arquitectura de Computadores / ESTG-IPL

WR - vai a "0" para operaes de escrita.


No modo mximo os sinais de controlo vo codificados nas linhas de estado S 0 , S1,
S2.
BUS de endereos/dados
sada do P este barramento tem 20 linhas (16 linhas de endereos multiplexadas
nas 16 linhas de dados AD0-AD15 em conjunto com 4 linhas de endereos adicionais
A16-A19).
O 8086 um P de 16 bits porque tem um BUS de dados de 16 bits.
O 8086 tem a capacidade de enderear at 1 Mbyte de memria pois o BUS de
endereos de 20 bits.
Latch
Quando o sinal ALE ("Address Latch Enable") vai a "1" o endereo colocado nas
sadas das "latches" e portanto o barramento ADDR/DATA j pode ser usado para
escrita/leitura de dados. Fazendo-se esta desmultiplexagem, evita-se a existncia de
pinos adicionais e a cpsula do P no necessita de ser maior.
Transceiver
Costitudo por "buffers tri-state" bidireccionais e tem como objectivo fornecer
corrente para regenerar os nveis lgicos do barramento de dados que se vo
degradando medida que se interligam mais dispositivos.
A bidireccionalidade escolhida pelo P atravs do sinal DT / R (transmite
dados/recebe dados).
A caracterstica "tri-state" seleccionada pela linha DEN quando se pretende colocar
o BUS de dados em alta impedncia, como p. ex. quando o P est a exteriorizar os
16 bits menos significativos de um endereo no BUS ADDR/DATA.
Controlador externo
usado no modo mximo de operao do 8086 para gerar um conjunto mais
completo de sinais de controlo.
Gerador de relgio
Usa um cristal para produzir um sinal (CLK) com uma frequncia de relgio estvel
que faz avanar o P de instruo em instruo.
O sinal RESET inicializa o sistema colocando o P no endereo FFFF0h para ir buscar
a sua prxima instruo.
O sinal READY quando est a "1" origina que o 8086 opere normalmente. Se estiver a
"0" no instante certo, so inseridos um ou mais "wait states" no ciclo de mquina
(aumenta o perodo de tempo desde endereos estveis a dados vlidos e portanto as
memrias podero ter tempos de acesso maiores e consequentemente sero mais
baratas).
ARQUITECTURA INTERNA

Arquitectura de Computadores / ESTG-IPL

O P divide-se internamente em duas unidades separadas que funcionam de forma


independente: BIU e EU.
(Figura 3 - arquitectura interna do 8086)
BIU ("BUS INTERFACE UNIT")

- retira instrues da memria, l operandos, escreve


resultados;

Fila de instrues
Grupo de registos tipo FIFO (First-In-First-Out) que podem comportar at 6 Bytes de
instrues retiradas antecipadamente ("prefetched") da memria. Isto servir para
diminuir o tempo de execuo dos programas sobrepondo ("overlapping") a retirada
de instrues da memria com a respectiva execuo - "pipelining".
Somador dedicado
Usado para calcular endereos fsicos de 20 bits.
Lgica para o BUS de controlo
Gera todos os sinais do barramento de controlo, tais como M / IO , RD e WR .
Registos de segmento
O 8086 pode enderear at 1 Mbyte de memria, contudo de uma s vez apenas pode
enderear 254 Kbytes em blocos de 64 Kbytes (segmentos)
CS ("code segment register") - aponta para o segmento de cdigo;
SS ("stack segment register") - aponta para o segmento de pilha;
DS ("data segment register") - aponta para o segmento de dado;
ES ("extra segment register") - aponta para o segmento de dados extra.
Nota:
Cada um destes registos contm os 16 bits mais significativos do endereo fsico
correspondente a cada um dos segmentos.
EU ("EXECUTION UNIT")

- descodifica e executa as instrues que o BIU retira da


memria.

Unidade aritmtica e lgica ALU


Responsvel por:
- operaes aritmticas e lgicas;
- manuteno do estado do P e das "flags" de controlo;
- manipulao dos registos de uso geral e dos operandos das instrues.
Registos de uso geral
Os registos de 16 bits de uso geral AX, BX, CX, DX podem ser usados como registos
de 8 bits (AH, AL; BH, BL; CH, CL; DH, DL), que representam respectivamente o
byte mais e menos significativo do correspondente conteudo.
Podem ser usados para funcionalidades genricas, contudo tm utilizaes especificas
que os caracterizam.

Arquitectura de Computadores / ESTG-IPL

AX ("Accumulator Register") - assumido por algumas instrues como p. ex. IN,


OUT, MUL, DIV, etc..
BX ("Base Register") - o nico registo que alm de ser de uso geral, tambm pode
ser usado para endereamento de memria.
CX ("Counter Register") - utilizado como contador em instrues como p. ex.
SHIFT, ROTATE, LOOP.
DX ("Data Register") - utilizado em instrues como p. ex. MUL e DIV.
Registos de pilha
So registos de 16 bits que se usam para aceder a dados no segmento de pilha.
SP ("Stack Pointer Register") - usado como "offset" ou deslocamento a partir de um
endereo corrente no segmento de pilha em instrues como
p. ex. POP e PUSH.
BP ("Base Pointer Register") - usado como "offset" ou deslocamento a partir de um
endereo corrente no segmento de pilha em instrues que o
modo de endereamento baseado.
Registos de ndice
So registos de 16 bits que se usam para endereamentos indexados.
SI ("Source Index Register") - usado no modo de endereamento indexado e utilizase em instrues de processamento de "strings" no segmento
de dados para indicar o endereo fonte.
DI ("Destination Index Register") - usado no modo de endereamento indexado e
utiliza-se em instrues de processamento de "strings" no
segmento extra de dados para indicar o endereo destino.
Registo das "flags"
Este registo de 16 bits contm o estado das vrias "flags".

AF ("Auxiliary Carry Flag") - est a "0" e s colocada a "1" se h um "carry" do


"nibble" menos significativo no mais significativo ou um
"borrow" do "nibble" mais significativo no menos significativo
relativamente nos 8 bits de um registo de 16 bits. Esta "flag"
usada em instrues aritmticas BCD.
CF ("Carry Flag") - vai a "1" se h um "carry" numa adio ou um "borrow" numa
subtraco.
OF ("Overflow Carry Flag") - est a zero e s vai a "1" se acontecer algum
"overflow" aps uma instruo aritmtica, isto , quando o
tamanho do resultado excede a capacidade do local de destino.
SF ("Sign Flag") - est a zero e s vai a "1" se o bit mais significativo de um resultado
for "1".

Arquitectura de Computadores / ESTG-IPL

PF ("Parity Flag") - vai a "0" quando um resultado tem paridade "even" e vai a "1"
quando a paridade for "odd".
ZF ("Zero Flag") - est a "0" se um resultado for no nulo e vai a "1" se for nulo.
O 8086 tem 3 "flags" adicionais para controlo de bits que podem ser alteradas
pelo programador:
DF ("Direction Flag") - colocando-a a "0" possibilita-se que as instrues para
"strings" auto-incrementem, caso contrrio auto-decrementam.
IF ("Interrupt Flag") - colocando-a a "1" possibilita-se ao 8086 que este reconhea
interrupes externas mascarveis.
TF ("Trap Flag") - colocando-a a "1" coloca-se o 8086 no modo passo-a-passo,
gerando uma interrupo aps a execuo de cada instruo.
Assim o utilizador pode fazer uma rotina de servio para que
aps cada interrupo se visualize o contedo de registos e
posies de memria desejados - "debugging".
SEGMENTAO DE MEMRIA

O 8086 pode enderear at 1 Mbyte de memria, contudo de uma s vez apenas pode
enderear 254 Kbytes em blocos de 64 Kbytes (segmentos):
segmento de cdigo
segmento de pilha
segmento de dados
segmento de dados extra
Em qualquer instante que o 8086 acede memria, calculado no BIU o necessrio
endereo fsico de 20 bits a partir do valor base (ou de incio) de um segmento e de
um "offset", pois o P no tem registos de 20 bits.
Os 4 segmentos da memria podem eventualmente estar totalmente sobrepostos,
parcialmente sobrepostos, contguos ou disjuntos.
(Figura 4 - disposio dos segmentos de forma disjunta)
(Figura 5 - exemplos de clculo de endereos fsicos)

Endereo fsico no segmento de cdigo


Cada uma das instrues de um programa encontram-se localizadas no segmento de
cdigo, num endereo calculado a partir do par de registos CS:IP.
Endereo fsico no segmento de pilha
calculado a partir do par de registos SS:SP, em instrues de pilha como p. ex.
PUSH e POP ou ento a partir do par de registos SS:BP, no caso de se usar um
endereamento baseado.
Endereo fsico no segmento de dados
calculado a partir dos pares de registos DS:SI, DS:DI ou DS:BX.

Arquitectura de Computadores / ESTG-IPL

Endereo fsico no segmento extra de dados


calculado a partir do par de registos ES:DI.
Nota:
Para representar endereos fsicos tm-se 2 alternativas (p. ex. o endereo 5FFE0h
pode ser representado tambm por 5000:FFE0h).
PROGRAMAO EM ASSEMBLER
PORQU PROGRAMAR EM ASSEMBLER?

Permite uma maior aproximao mquina (o cdigo aproxima-se do cdigo de


mquina);
Os programas em assembler ocupam menos espao (cerca de 10 vezes menos que os
equivalentes em C ou Pascal);
Os programas em assembler so mais rpidos (2 a 3 vezes mais rpidos que os
equivalentes em C ou Pascal).
Existe a possibilidade de programas elaborados em alto nvel usarem pequenas rotinas
feitas em assembler.
DADOS, ENDEREOS DE DADOS E DE INSTRUO

Dados
So nmeros de 8, 16 ou 32 bits, com ou sem sinal, sobre os quais as operaes so
imediatas (sem haver descodificao de endereos). Note-se que os caracteres so
representados com nmeros de 8 bits sem sinal por meio de um cdigo ASCII).
Endereos de dados
So endereos que permitem determinar onde se iro buscar os dados a manipular
(so os "offsets" nos segmentos de dados). Estes "offsets" sero o contedo de vrios
ponteiros para dados (como p. ex. ponteiro para byte - DB, ponteiro para palavra DW, ponteiro para palavra dupla - DD, etc.).
Endereos de instruo
So endereos que permitem ir buscar as instrues memria e so definidos por
etiquetas "Labels"
DIRECTIVAS PARA OS SEGMENTOS

As directivas, tal como o prprio nome indica, so direccionamentos para o assembler


e no so instrues.
Existem dois tipos de directivas para os segmentos:
directivas simplificadas;
directivas "standard".
Directivas simplificadas

Arquitectura de Computadores / ESTG-IPL

Facilitam o controlo dos segmentos e so ideais para "linkar" mdulos em assembler


s linguagens de alto nvel. No entanto, apenas suportam algumas caractersticas de
controlo dos segmentos que o "Turbo Assembler" pode proporcionar.
.DOSSEG - origina um agrupamento dos segmentos num programa em assembler
segundo uma ordem convencionada pela "Microsoft" (alguns programas
no funcionam bem quando se omite esta directiva).
.MODEL - especifica o modelo de memria para um mdulo em assembler que use
directivas simplificadas. Os modelos de memria disponveis so:
Tiny - o cdigo e os dados cabem num mesmo segmento de 64 K (ambos
"near");
Small - o cdigo e os dados cabem em segmentos separados de 64 K
(ambos "near");
Medium - o cdigo pode exceder 64 K e os dados devem caber num
segmento de 64K (cdigo "far", dados "near");
Compact - o cdigo cabe em 64 K e os dados podem exceder (cdigo
"near", dados "far");
Large - o cdigo e os dados podem exceder 64 K, mas nenhum array
de dados singular pode exceder 64 K (ambos "far");
Huge - o cdigo e os dados podem exceder 64 K e os arrays de dados
podem exceder 64 K (ambos "far");
Nota:
"near" e "far" indicam respectivamente que os endereos fsicos nos
respectivos segmentos podem ser obtidos a partir de "offsets" ou a partir
de pares "segment:offset".

Arquitectura de Computadores / ESTG-IPL

.STACK - define o tamanho da pilha para programas que faam uso dela ( normal
encontrar o tamanho de 200h (512 bytes) para programas no
muito "pesados", como o caso dos que usam recursividade).
Exemplo:
.STACK 200H
.DATA - define o incio do segmento de dados ou do segmento extra de dados.
Exemplo:
.DATA
variavel_x DB 'Ola'
Nota:
Para se aceder a posies de memria nestes segmentos de dados deve-se carregar o
registo DS com o smbolo @data:
mov AX,@data ; para o segmento de dados
mov DS,AX
mov DX,@data ; para o segmento extra de dados
mov ES,DX
.CODE - define o incio do segmento de cdigo (diz ao turbo assembler onde deve
colocar as instrues).
Exemplo:
.CODE
Inicio_Codigo:
(...)
Directivas "standard"
So mais complicadas de usar, mas permitem explorar todas as capacidades de
controlo dos segmentos por parte do TASM.
SEGMENT - define o incio de um segmento e a "label" que a acompanha o nome
dado ao segmento.
ENDS - define o fim de um segmento e a "label" que a acompanha o nome dado ao
segmento.
ASSUME - indica ao TASM a que registo de segmento est atribudo um segmento.
Exemplos:
pilha SEGMENT
DB 200 DUP(?)
pilha ENDS
dados SEGMENT
variavel_x DB 'Ola'
dados ENDS
9

Arquitectura de Computadores / ESTG-IPL

codigo SEGMENT
ASSUME CS:codigo,DS:dados,SS:pilha
(...)
codigo ENDS
OUTRAS DIRECTIVAS

DB ("Define Byte") - usada para declarar uma varivel do tipo byte ou ento reservar
uma ou mais posies de memria do tipo byte.
Exemplos:
PRECOS DB 49H,98H,29H ;declara um array de 3 ;bytes chamado
PRECOS e inicializa-o ;daquela forma.
NOME DB 'Sergio' ;declara um array de 6 bytes ;com aquele nome
inicializando-o com os ;cdigos ASCII das letras do nome Sergio.
ARMAZENA DB 100 DUP(?) ;reserva 100 bytes ;de memria no
inicializados e d-lhe ;aquele nome.
ARMAZENA DB 49H DUP(0) ;declara 49h bytes ;inicializados com zeros e
d-lhe aquele ;nome.
DW ("Define Word") - usada para declarar uma varivel do tipo word ou ento
reservar uma ou mais posies de memria do tipo word
inicializadas , ou no.
Exemplos:
NUMERO DW 437AH; declara uma varivel do ;tipo word cujo nome
NUMERO e d-lhe ;aquele valor.
Nota:
Para declarar variveis existem adicionalmente as directivas:
DD ("Define Double Word");
DQ ("Define Quadword");
DT ("Define Ten Bytes").
END ("End Program") - colocada na ltima linha de um programa para o terminar.
O assemblador ignora tudo o que estiver depois dela.
ENDP ("End Program") - usada em conjunto com o nome de um procedimento para
o terminar. Esta directiva utilizada em conjunto com a directiva
PROC para delimitar um procedimento.
Exemplo:
CALCULO PROC; incio do procedimento.
(...)

; instrues do procedimento.

CALCULO ENDP; fim do procedimento.

10

Arquitectura de Computadores / ESTG-IPL

EQU ("Equate") - usada para dar um nome a um valor ou smbolo. Cada vez que o
assembler encontra o referido nome num programa, ele substitui
o valor ou smbolo com esse nome.
Exemplo:
FACTOR_EXEMPLO EQU 03H ;o valor 03h substitudo por aquele nome.
EVEN ("Align on Even Memory Address") - usada para dizer ao assemblador que
incremente o contador de posio (que contm um "offset" num
segmento) para o prximo endereo par, se este ainda no for
par. Assim, possibilita-se uma leitura mais rpida daquilo que est
nesse endereo.
Exemplo:
.DATA
MEDIA DB 9 DUP(?); reserva um array de 9 ;bytes no inicializados e o
contador de ;posio aponta para 0009h.
EVEN; avana para 000Ah.
RESULTADO DW 100 DUP(0); "array" de 100 ;words inicializados a zero
que comea em ;000Ah. Neste endereo a leitura ser mais
;rpida.
EXTRN - ver programas multimdulo.
GLOBAL - ver programas multimdulo.
GROUP ("Group-Related Segments") - diz ao assemblador para agrupar os
segmentos num nico segmento de 64 Kbytes. Isto permite que o
contedo desses segmentos seja acedido a partir do mesmo
endereo de base.
Exemplo:
AGRUPA GROUP CODIGO,DADOS; agrupa os ;segmentos num nico.
ASSUME CS:AGRUPA, DS:AGRUPA; os ;registos CS e DS contm o
endereo base ;do segmento.
INCLUDE - permite inserir um bloco de cdigo fonte, editado num outro ficheiro, no
cdigo fonte actual.
Exemplo:
(...)
.CODE
(...)
INCLUDE OUTRO_FICHEIRO.ASM; incluso ;do cdigo fonte existente
noutro ficheiro.

11

Arquitectura de Computadores / ESTG-IPL

(...)
LABEL - usada para dar um nome ao valor actual do contador de posio. Se for
usada para instrues de salto ou de chamada de procedimentos, esta
deve ser especificada como sendo "near" ou "far". Se for usada para
referenciar um tem de dados deve ser especificada com o tipo de
dados.
Exemplo:
PILHA SEGMENT
DW 100 DUP(0) ; reserva 100 bytes para a pilha.
TOPO_PILHA LABEL WORD; d um nome ;proxima posio aps a
ltima palavra na ;pilha.
PILHA ENDS
REPETE LABEL FAR; pode-se fazer um salto ;para esta posio de um
outro qualquer ;segmento.

NAME - ver programas multimdulo.


ORG (Originate) - Quando o assemblador comea a a ler um segmento, o contador
de posio vai para 0000h. Com esta directiva pode-se impr que
esse valor seja outro. O smbolo $ indica o valor actual dessa
posio.
Exemplos:
ORG 2000H; diz ao assemblador para colocar o ;contador de posio em
2000h.
ORG $+100 ; incrementa o contador de posio ;em 100 a partir do seu valor
actual.

PROC (Procedure) - indica o incio de um procedimento (ver directiva ENDP).


PUBLIC - ver programas multimdulo.

12

Arquitectura de Computadores / ESTG-IPL

OPERADORES

DUP - permite definir blocos de memria inicializados com um determinado valor


(ver exemplos para a directiva DB).
LENGTH - diz ao assemblador para determinar o nmero de elementos que existem
num determinado tem de dados.
Exemplos:
MOV CX,LENGTH STRING1; ao ser executada ;esta linha de cdigo, o
registo CX fica ;com o comprimento da string em bytes ou
words.
OFFSET - diz ao assemblador para determinar o offset ou deslocamento de uma
varivel de dados a partir do incio do segmento que a contm.
Exemplos:
MOV BX,OFFSET PRECOS; determina o offset ;da varivel PRECOS no
segmento de ;dados ;ficando BX com esse valor.
ADD AL,BYTE PTRBX; soma o valor de AL ao ;valor cujo endereo
dado pelo offset ;que est em BX.
PTR (pointer) - atribui um tipo especfico a uma varivel ou label.
Exemplos:
INC BYTE PTR BX; incrementa o byte ;apontado por BX.
INC WORD PTR BX; incrementa a palavra ;apontada por BX.
ADD AL,BYTE PTR BX; soma a AL o valor de 8 bits ;cujo endereo
dado pelo offset que ;est em BX.
JMP WORD PTR BX; faz um salto near.
JMP DWORD PTR BX; faz um salto far.
SHORT - usado em conjunto com a instruo JMP e diz ao assemblador que apenas
necessrio reservar um byte para essa instruo (em vez de dois).
Contudo, este tipo de saltos apenas atinge labels compreendidas
entre -128 bytes e +128 bytes a partir do endereo de instruo aps
o salto.
Exemplos:
JMP SHORT NOME_LABEL; faz um salto curto ;(short).

13

Arquitectura de Computadores / ESTG-IPL

CONJUNTO DE INSTRUES

O conjunto de instrues pode ser dividido em 8 grupos consoante, a funcionalidade


destas:
Movimentao de dados
Aritmticas
Lgicas e de deslocamento
Controlo
Derivao
Manipulao de blocos e strings

(Tabela 1 - conjunto de instrues do 8086)

MODOS DE ENDEREAMENTO

O 8086 tem 12 modos de endereamento, que podem ser classificados em 5 grupos:


Modo registado e imediato;
Modo de endereamento de memria;
Modo de endereamento de portos;
Modo de endereamento relativo;
Modo de endereamento implcito.
Modo registado e imediato
Registado - os operandos fonte, os operandos destino ou ambos esto contidos em
registos.
Exemplos:
MOV AL,BL; move o contedo de 8 bits de BL ;para AL.
Imediato - os dados na forma de 8 bits ou 16 bits podem ser especificados como
fazendo parte da instruo.
Exemplo:
MOV CX,5062h; move o dado de 16 bits 5062h ;para o registo CX.
Modo de endereamento de memria
Directo - o endereo efectivo do operando (offset) no correspondente segmento
obtido directamente a partir de um determinado dado, sem envolver
quaisquer registos.
Exemplo:
.DATA
START DW 39FAH
(...)

14

Arquitectura de Computadores / ESTG-IPL

MOV BX,START; move o contedo que est no ;endereo de 20 bits


(calculado a partir de ;DS:START.
Indirecto registado - o endereo efectivo de um operando na memria pode ser
obtido a partir de um dos registos de base ou de ndice (BX, BP,
SI, DI).
Exemplo:
.DATA
START DW 39FAH
(...)
MOV BX, OFFSET START; BX contm o ;offset daquela varivel.
MOV CX,BX; move o contedo que est no ;endereo de 20 bits
(calculado a partir de ;DS:BX).
MOV AX,ES:BX; move o contedo que est no ;endereo de 20 bits
(calculado a partir de ;ES:BX - agora o segmento de dados o
;extra).
Baseado - o endereo efectivo calculado a partir de uma contante e dos registos de
base BX ou BP. Quando no se acede pilha o endereo de 20 bits
calculado a partir de DS:BX. Quando se acede pilha esse endereo
calculado a partir de SS:BP (note-se que BP o ponteiro de pilha
para o utilizador, enquanto que o SP o ponteiro de pilha do
sistema, sendo usado em instrues como p. ex. CALL).

Exemplo:
MOV BP,SP; inicializa BP.
MOV -2BP,BX; move o contedo de BX para o ;endereo de 20 bits da
pilha (calculado a partir ;de S:BP-2). O operando destino
poder-se-ia representar alternativamente por BP-2 ou por BP2.
Indexado - O endereo efectivo obtido a partir de uma constante e dos registos de
ndice SI ou DI.
.DATA
CARACTERES DB ABCD$
(...)
MOV SI, OFFSET CARACTERES; SI contm o ;offset daquela varivel
no segmento de ;dados.

15

Arquitectura de Computadores / ESTG-IPL

MOV AX, 3SI; move-se o caractere D para o ;registo AX ( o caractere


que se encontra ;no endereo fsico de 20 bits calculado a ;partir
de DS:3+SI ).
Indexado baseado - o endereo efectivo calculado a partir de uma constante, dos
registos de base (BX, BP) e dos registos de ndice (SI, DI).
.DATA
CARACTERES DB ABCD$
(...)
MOV SI, OFFSET CARACTERES; SI contm o ;offset daquela varivel
no segmento de ;dados.
MOV BX,1; carrega-se BX com o valor 1.
MOV AX, 2BXSI; move-se o caractere D ;para o registo AX ( o
caractere que se ;encontra no endereo fsico de 20 bits
;calculado a partir de DS:2+BX+SI ).
De strings - neste modo usa-se o registo SI para apontar para o primeiro byte ou
word de uma string origem e o registo DI para apontar para o
primeiro byte ou word do destino, quando utilizada uma
instruo para strings (p. ex. MOVS).
Modo de endereamento de portos
Modo directo - o nmero da porta um operando de 8 bits que utilizado em
conjunto com o acumulador (conseguem-se enderear at 256
portos).
Exemplo:
IN AL,02; move o contedo do porto 2 para o ;registo AL.
Modo indirecto - o nmero da porta provm de um do registo DX e utilizado em
conjunto com o acumulador (conseguem-se enderear at
64Kbytes de portos).
Exemplo:
IN AX,DX; move o contedo do porto ;especificado em DX para o registo
AX.
Modo de endereamento relativo
Neste modo de endereamento especifica-se um operando como sendo um
deslocamento de 8 bits (positivo ou negativo), que vai ser somado ao valor actual do
IP.
Exemplo:

16

Arquitectura de Computadores / ESTG-IPL

JNC START; se o carry for nulo (not carry) o ;programa continua a


partir da label ;START. Por outras palavras, somado ao ;IP o
endereo de 8 bits da label.
Modo de endereamento implcito
As instrues que usam este modo no tm operandos.
Exemplo:
CLC; coloca a zero a carry flag.

PILHA E CHAMADAS DE FUNES


Uma pilha uma estrutura LIFO: o ltimo elemento a entrar o primeiro a sair.
Existem instrues prprias para colocar e retirar elementos da pilha: PUSH e POP.
O processador acede pilha por meio do registo SP. Este registo contm o endereo
do ltimo elemento da pilha.
A pilha cresce no sentido decrescente dos endereos.
Topo da Memria

Base da Pilha
Sentido de
Crescimento
da Pilha

Pilha

Topo da Pilha
[SP]
Local de entrada do
prximo elemento

Base da Memria
[0000H]

O registo BP, que indexa o segmento da pilha, no tem qualquer funo directa na
manipulao da pilha. Utiliza-se para aceder aos elementos da pilha pela posio que
nela ocupam.

17

Arquitectura de Computadores / ESTG-IPL

Manipulao da pilha
PUSH - Permite colocar na pilha (na posio indicada por SS:SP) uma palavra,
contedo de um registo ou posio de memria.
A instruo PUSH decrementa o registo SP em duas unidades e coloca o
operando no novo topo da pilha.
Para colocar o registo FLAGS na pilha existe a instruo PUSHF.
PUSH AX
PUSH CS
PUSH [BX+SI]
PUSHF
POP - Permite retirar a palavra armazenada no topo da pilha, colocando-a no registo
ou posio de memria especificada.
De seguida incrementa o registo SP em duas unidades.
Para carregar o registo FLAGS a partir da pilha existe a instruo POPF.
POP CX
POP DS
POP [DI]
POPF
Chamada de funes
Uma subrotina uma parte de um programa. O programa chama a subrotina e esta
devolve o controlo ao programa quando acaba.
A chamada de subrotina um salto com a particularidade de guardar o endereo onde
o programa estava a executar.
A instruo CALL permite chamar uma subrotina.
A rotina pode ser chamada directamente, atravs de labels dentro do segmento de
cdigo, ou indirectamente, usando-se registos que contm o endereo da rotina.
O endereo da instruo a ser executada ao retornar da rotina (registo IP) guardado
na pilha. Nas chamadas FAR, alm do IP necessrio guardar tambm o registo CS.
Assim, numa chamada NEAR, o SP decrementado de 2 e numa chamada FAR, o SP
decrementado de 4.
A instruo RET permite fazer o retorno da subrotina, transferindo a execuo para a
instruo seguinte chamada da sub-rotina.
O endereo dessa instruo retirado do topo da pilha e colocado no registo IP, sendo
o registo SP incrementado de 2. No caso de uma chamada far, so retiradas duas
palavras que so colocadas nos registos CS e IP.

18

Arquitectura de Computadores / ESTG-IPL

Se for especificado um valor imediato como parmetro da instruo RET, este ser
tambm adicionado ao valor do SP, servindo para libertar parmetros colocados na
pilha a quando da chamada da rotina.

CALL F1
F1
RET

CALL Subrotina1
CALL BX
CALL double word ptr [SI]
RET
RET 6

Conselhos:
A documentao fundamental e deve incluir o fundamental sobre o
comportamento da rotina.
A rotina deve evitar acessos directos a variveis globais. Os dados a serem
acedidos devem ser passados como parmetros
A rotina deve ser de aplicao geral. Em vez de uma rotina que faa a mdia
de 100 valores, ser mais til colocar o nmero de valores como parmetro.
A rotina deve ser robusta. Deve prever a ocorrncia de casos estranhos,
como por exemplo o nmero de dados a fazer a mdia ser 0.
Modelo Black-box - a rotina deve ser conhecida apenas pelas entradas e sadas, sem
necessidade de preocupao em relao ao modo como as mesmas so
tratadas.
Contexto de uma rotina - todas as rotinas utilizam, normalmente variveis locais.
Essas variveis podem ser clulas de memria ou registos.
Se as variveis forem registos, necessrio salvaguardar os valores que esses
registos continham ao ser chamada a rotina. Esses valores so guardados
(normalmente na pilha) no princpio da rotina e restaurados (por ordem
inversa) no final da rotina.
Exemplo de uma rotina que faz uso dos registos AX, SI e DS:

19

Arquitectura de Computadores / ESTG-IPL

MYPROC

MYPROC

PROC
PUSH AX
PUSH SI
PUSH DS
...
POP DS
POP SI
POP AX
RET
ENDP

SP->
SP->

E.Ret

E.Ret
AX
SI
DS

SP->
Antes

CALL
Contexto

Passagem de parmetros
Os parmetros de uma rotina podem ser de entrada, de sada ou entrada /
sada.
Passagem por registo
Utiliza registos para a passagem da informao. Evita passagens pela
memria mas h poucos registos disponveis.
MOV AX, 100
;n de elementos
LEA DX,Dados
;Vector dos dados
CALL Media
; Calcula a mdia
MOV Res,AX
;Guarda-a
Passagem por memria partilhada
Utiliza clulas de memria fixas para passagem da informao. Poupa os
registos mas tem pouca flexibilidade pois exige a utilizao de variveis
globais.
Passagem pela pilha
este o modo mais utilizado para passar parmetros. A pilha o local onde
so postos os dados e de onde so retirados os resultados.

SP->

Par1
Par2
Par3
SP->

Par1
Par2
Par3
E.Ret
DX
SI

Parmetros
CALL, Contexto Retorno

SP->

Res2
Res1
E.Ret

20

Arquitectura de Computadores / ESTG-IPL

Um exemplo: esta chamada coloca 3 parmetros na pilha e devolve 2


resultados.
PUSH AX
PUSH BX
PUSH CX
CALL Func1
POP AX
POP DX
Para se aceder aos parmetros dentro da rotina, utiliza-se o registo BP, que
opera sempre no segmento de pilha.
Para se aceder ao 1 parmetro Par1 do exemplo acima pode-se, por
exemplo, inicializar o BP a SP no incio da rotina depois de se guardar o
contexto e utilizar [BP+10] (se se fizessem POPs, retirava-se tambm o
endereo de retorno!).
N de parmetros de entrada e de sada

Igual. Neste caso, os parmetros de sada vo ocupar os lugares dos de


entrada.

H mais parmetros de entrada do que de sada. Neste caso,


necessrio retirar alguns elementos da pilha no retorno.

H mais parmetros de sada do que de entrada. Neste caso,


necessrio mover o endereo de retorno na pilha, para clulas mais abaixo na
memria de modo a reservar espao na pilha para os resultados da funo.
Outra alternativa reservar espao para os parmetros de sada antes da
chamada:
...
SUB SP, 6;reserva espao para
; parmetros de sada
PUSH AX
;parmetro de entrada 1
PUSH BX
;parmetro de entrada 2
CALL F1
POP AX
;resultado 1
POP DX
;resultado 2
...

SP->

Par1
Par2
E.Ret

21

Arquitectura de Computadores / ESTG-IPL

Passagem na sequncia da chamada


Colocam-se os parmetros no meio do cdigo, imediatamente a seguir
instruo CALL. O endereo inicial dos parmetros dado pelo endereo de
retorno, que se encontra na pilha. O endereo de retorno real o endereo da
primeira instruo que aparece depois dos parmetros.
Este modo de passagem pouco utilizado.
CALL Funcao1
DB 63, 12, ? ; parmetros
INC AX
; instruo seguinte

Funcao1 PROC
POP SI
;endereo dos parmetros
MOV DI, SI ;clculo do
ADD DI, 3 ;endereo de retorno
PUSH DI
...

Variveis locais a uma subrotina - Podem guardar-se em clulas de memria,


registos do processador, espao reservado na pilha.
Clulas de memria
Utiliza-se esta opo quando se deseja ter uma varivel esttica (diferente de
global), i.e., uma varivel que se mantm inalterada entre execues
consecutivas da funo.
Registos do processador
O nmero restrito de registos disponveis, obriga geralmente ao recurso a
outros lugares para guardar variveis locais.
Espao reservado na pilha
Este o mtodo mais utilizado. O meio de acesso a
estas variveis idntico ao meio de acesso aos
parmetros passados por pilha.
aconselhvel fazer um mapa da pilha na entrada da
subrotina.

Parmetros
End.Ret.
Contexto
Variveis
locais

<- SP

SERVIOS DA ROM BIOS


O BIOS (Basic Input Output System) um conjunto de rotinas (device-drivers)
residentes numa memria ROM que responsvel pela inicializao de perifricos (tal
como teclado, vdeo, disco, etc.) e pela carga do sistema operativo a partir do disco.
O ficheiro IO.SYS um dos componentes do DOS e contm extenses ao ROM
BIOS.
As funes disponibilizadas pelo BIOS so acedidas atravs da instruo INT nn onde
nn o nmero da interrupo que se pretende executar. Normalmente, cada nmero
de interrupo disponibiliza vrias funes, sendo a seleco feita atravs do registo
22

Arquitectura de Computadores / ESTG-IPL

AH. Outros parmetros necessrios para cada funo so passados atravs de outros
registos.
( Tabela 2 - Servios ROM BIOS )
FUNES DO DOS
O ficheiro MSDOS.SYS outro dos componentes do DOS, responsvel pela gesto
de directrios e ficheiros em disco e contm as rotinas de funes do DOS.
Estas funes podem ser invocadas pelo programador atravs de interrupes. As
principais interrupes de DOS esto listadas na tabela 3.
Destas, a interrupo 21H de longe a mais til, fornecendo acesso geral a quase
todas as funes do DOS.
As interrupes de terminao 20H e 27H j no se utilizam, tendo sido substitudas
por funes da interrupo 21H.
As interrupes de acesso absoluto a disco 25H e 26H, podem ser ocasionalmente
necessrias para ultrapassar o interface habitual de acesso a ficheiros de DOS.
Interrupo
20H
21H
25H
26H
27H

Descrio
Terminao normal de programa
Funes de DOS gerais
Leitura absoluta em disco
Escrita absoluta em disco
TSR - Termina e fica residente
Tabela 3 - As cinco principais interrupes de DOS
( Tabela 4 - Funes da interrupo 21H )

Servio
Terminao com
cdigo de retorno
Standard input de um
caracter com eco
Output de um caracter
para a impressora
Criar um ficheiro

Funo
4CH
01H
05H
3CH

Registos
Input
Output
AH=4CH
AL=cod. ret.
AH=01H
AL=caracter
AH=05H
DL=caracter
AH=3CH
CX=atributos
DS:DX ->
caminho para o
ficheiro

se erro:
CF set
AX=cdigo de erro
se no:
CF clear
AX=handle

Tabela 5 - Exemplos de funes da interrupo 21H


PROGRAMAS UNIMDULO E MULTIMDULO
possvel partir um programa grande (unimdulo) em vrios mdulos ( programa
multimdulo).

23

Arquitectura de Computadores / ESTG-IPL

Depois de se editar o cdigo fonte s necessrio reassemblar o mdulo alterado, em


vez de todas as linhas do programa.
Directiva GLOBAL - Torna as labels associadas disponveis para vrios mdulos.
Uma label global deve ter uma directiva GLOBAL em cada mdulo onde seja
utilizada.
Uma label global deve ser definida (com DB, DW, PROC, LABEL, etc.) num
e um s dos mdulos onde utilizada.
necessrio informar o Turbo Assembler sobre o tipo de cada label. Os tipos
possveis so:
ABS, BYTE, DATAPTR, DWORD, FAR, FWORD, NEAR, PROC,
QWORD, Structure Name, TBYTE, UNKNOWN, WORD
O tipo ABS utiliza-se para labels definidas com EQU ou =, i.e., labels
constantes que no esto associadas com um endereo.
Existe um esquema alternativo directiva global formado pelas directivas
EXTERN e PUBLIC, mantido apenas por questes de compatibilidade. A
directiva PUBLIC utiliza-se no mdulo onde definida a label. A directiva
EXTERN utiliza-se nos mdulos onde tambm utilizada a label.
MAIN.ASM
...
.DATA
GLOBAL
FinalString: BYTE
FinalString DB
50 DUP (?)
.CODE
GLOBAL
ConcatenateStrings:PROC
ProgramStart:
...
call ConcatenateStrings
...
END ProgramStart
SUB1.ASM
...
.DATA
GLOBAL FinalString: BYTE
.CODE
GLOBAL ConcatenateStrings:PROC
ConcatenateStringsPROC
...
ConcatenateStrings ENDP
END
Directiva INCLUDE - Se no se quiser dividir o programa em vrios mdulos, podese utilizar a directiva INCLUDE.

24

Arquitectura de Computadores / ESTG-IPL

Quando o Turbo Assembler encontra uma directiva INCLUDE, vai a disco


buscar o ficheiro especificado e trata as linhas a contidas como se
pertencessem ao mdulo corrente.
MAINPROG.ASM
...
.CODE
mov ax, 1
INCLUDE INCPROG.ASM
push ax
...

INCPROG.ASM
mov bx, 5
add ax, bx

...
.CODE
mov ax, 1
mov bx, 5
add ax, bx
push ax
...

Programa equivalente:

INTERFACE DO TURBO ASSEMBLER COM O TURBO PASCAL


O Turbo Pascal permite o acesso quase totalidade dos recursos da mquina
atravs dos arrays Port[], Mem[], MemW[], MemL[] e permite usar a BIOS e
o sistema operativo com os procedimentos Intr() e MsDos().
As razes mais provveis para se utilizar linguagem assembly no Turbo Pascal
so: executar as poucas operaes que no esto directamente disponveis a
partir do Turbo Pascal e tirar vantagem da velocidade que s a linguagem
assembly pode fornecer.
O Turbo Pascal impe algumas restries a nvel de utilizao de registos.
Quando feita uma chamada a uma funo ou procedimento, os valores dor
registos SS, DS e BP devem ser preservados. O DS aponta para o segmento de
dados global (DATA), o SS aponta para o segmento de pilha. O BP usado
por cada rotina para referenciar o espao que usa na pilha para parmetros e
variveis locais. Todas as rotinas devem tambm ajustar o SP antes de terminar.

25

Arquitectura de Computadores / ESTG-IPL

Para que uma subrotina seja do tipo far utiliza-se a directiva de compilador
{$F}.
A directiva {$L MYFILE.OBJ} faz com que o Turbo Pascal procure o ficheiro
MYFILE.OBJ e a linque com o programa em Turbo Pascal.
Cada rotina em Turbo Assembler que se deseje tornar visvel no programa
Turbo Pascal deve ser declarada como um smbolo PUBLIC e ter uma
declarao external correspondente no programa.
Se um programa em Turbo Pascal declarar as seguintes variveis globais:
var
a: byte;
b: integer;
c: real;
d: pointer;
Podem aceder-se estas variveis dentro do programa em assembly com as
declaraes EXTRN:
EXTRN a: byte
; 1 byte
EXTRN b: word
; 2 bytes
EXTRN c: fword ; 6 bytes
EXTRN d: dword ; 4 bytes
Convenes de passagem de parmetros do Turbo de Pascal
O Turbo Pascal passa parmetros atravs da pilha.
Parmetros de 1 byte so passados como uma palavra de 16 bits sendo o byte
mais significativo ignorado.
Em parmetros de 4 bytes, colocada primeiro na pilha a palavra mais
significativa.
Em parmetros do tipo ponteiro, colocada primeiro na pilha a palavra que
contm o segmento, depois a do deslocamento. No programa em Turbo
Assembler pode usar-se as instrues LDS ou LES para se ter acesso a um
parmetro do tipo ponteiro.
Parmetros do tipo string, no so colocados na pilha. Em vez disso o Turbo
Pascal coloca na pilha um ponteiro far para a string.
Os parmetros variveis (var) so passados como um ponteiro para a sua
localizao na memria.
Quando as rotinas do Turbo Assembler recebem controlo, o topo da pilha
contm um endereo de retorno (uma ou duas palavras) e, acima dele,
quaisquer parmetros a serem passados. Uma forma de aceder os parmetros
passados para a rotina em Turbo Assembler usar o registo BP para enderear
a pilha.
A directiva .MODEL com o parmetro TPASCAL fornece suporte simplificado
de segmentao, modelo de memria e de linguagem. Esta directiva encarregase da salvaguarda e restauro do registo BP, de lhe atribuir o valor de SP e de
fazer a gesto do espao ocupado pelos parmetros na pilha.
As funes no Turbo Pascal devolvem os seus valores em registos ou na pilha.
Valores de 1 byte so devolvidos no registo al, 2 bytes no ax, 4 bytes em dx:ax.

26

Arquitectura de Computadores / ESTG-IPL

MICROPROCESSADORES x86 MAIS EVOLUDOS


O Turbo Asembler pode suportar, alm do processador 8086, vrios outros
tipos de procesadores, atravs de directivas como: .186, .286, .386, etc.
As principais caractersticas que cada um destes processadores veio
acrescentar foram novas instrues e novos modos de endereamento.
O 386 fornece, entre outras inovaes:
- novas instrues e extenses a instrues existentes,
- um conjunto extendido de registos de 32 bits e segmentos lineares de at 4
GB (32 bits) e
- instrues privilegiadas (.386P) destinadas apenas a serem usadas pelo
sistema operativo.
O 386 extende os registos gerais, o registo de flags e o ponteiro de instruo
para 32 bits e adiciona dois novos registos de segmento: fs e gs.
Surgem novos modos de endereamento: os 8 registos de 32 bits de uso geral
(eax, ebx, ecx, edx, esi, edi, ebp e esp) podem ser utilizados como registos
base ou ndice.
No existe acesso directo aos 16 bits mais significativsos dos registos de 32
bits. Para se usarem os 16 bits mais significativsos de eax, necessrio rodar o
registo 16 bits, aceder os 16 bits (agora) menos significativos e rodar
novamente 16 bits. Para, por ex., colocar ax na palavra mais significativa de
edx:
ror edx, 16
mov dx, ax
ror edx, 16

27

Você também pode gostar