Você está na página 1de 26

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 utiliza-se 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 autodecrementam. 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. 6

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 PTR[BX]; 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 -2[BP],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. MOV AX, 3[SI]; 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] ). 15

Arquitectura de Computadores / ESTG-IPL

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, 2[BX][SI]; 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: 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:

16

Arquitectura de Computadores / ESTG-IPL

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.
T o p o d a M e m r ia

B a s e d a P i lh a S e n tid o d e C r e s c im e n to d a P ilh a

P i lh a

T o p o d a P i lh a [S P ] L o c a l d e e n tr a d a d o p r x im o e le m e n to

B a s e d a M e m ria [0 0 0 0 H ]

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.

C ALL F1
F1 R ET

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: MYPROC Passagem de PROC parmetros PUSH AX PUSH SI PUSH DS ... SP-> POP DS POP SI POP AX RET ENDP

SP->

E.Ret SP-> CALL

E.Ret AX SI DS Contexto

MYPROC

19

Antes

Arquitectura de Computadores / ESTG-IPL

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. 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

SP->

Par1 Par2 Par3 SP-> Parmetros

Par1 Par2 Par3 E.Ret DX SI

SP->

Res2 Res1 E.Ret

CALL, Contexto

Retorno

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. 20

Arquitectura de Computadores / ESTG-IPL

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 ... 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 ...

SP->

Par1 Par2 E.Ret

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 21

Arquitectura de Computadores / ESTG-IPL

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 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

Funo 4CH 01H

Registos Input Output AH=4CH AL=cod. ret. AH=01H AL=caracter

22

Arquitectura de Computadores / ESTG-IPL

caracter com eco Output de um caracter para a impressora Criar um ficheiro

05H 3CH

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). 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

23

Arquitectura de Computadores / ESTG-IPL

... .DATA GLOBAL FinalString: BYTE .CODE GLOBAL ConcatenateStrings:PROC ConcatenateStringsPROC ... ConcatenateStrings ENDP END Directiva INCLUDE - Se no se quiser dividir o programa em vrios mdulos, pode-se utilizar a directiva INCLUDE. 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

... Programa equivalente: .CODE mov ax, 1 mov bx, 5 add ax, bx push ax ...

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

24

Arquitectura de Computadores / ESTG-IPL

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. 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

25

Arquitectura de Computadores / ESTG-IPL

directiva encarrega-se 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.

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

26

Você também pode gostar