Escolar Documentos
Profissional Documentos
Cultura Documentos
Apontamentos de
Arquitectura de Computadores
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.
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")
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)
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
.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
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.
10
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
(...)
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.
12
OPERADORES
13
CONJUNTO DE INSTRUES
MODOS DE ENDEREAMENTO
14
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
16
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
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
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
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
SP->
Par1
Par2
E.Ret
21
Funcao1 PROC
POP SI
;endereo dos parmetros
MOV DI, SI ;clculo do
ADD DI, 3 ;endereo de retorno
PUSH DI
...
Parmetros
End.Ret.
Contexto
Variveis
locais
<- SP
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
23
24
INCPROG.ASM
mov bx, 5
add ax, bx
...
.CODE
mov ax, 1
mov bx, 5
add ax, bx
push ax
...
Programa equivalente:
25
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
27