Académique Documents
Professionnel Documents
Culture Documents
NDICE
NDICE ............................................................................................................................................................... 2 PREFCIO DA EDIO ELETRNICA ...................................................................................................................... 3 1 INTRODUO ............................................................................................................................................. 4 1.1 1.2 1.3 2 O PC-IBM E O MICROPROCESSADOR 8088.......................................................................................................................4 A FAMLIA DE MICROPROCESSADORES 8088/86/188/186/286 ........................................................................................4 O QUE UM ASSEMBLER .............................................................................................................................................5
CONCEITOS BSICOS ................................................................................................................................... 6 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 2.10 2.11 2.12 COMO O 8088 ENDEREA MEMRIA................................................................................................................................6 OS REGISTRADORES DO 8088..........................................................................................................................................6 SMBOLOS .....................................................................................................................................................................8 ELEMENTOS DA LINGUAGEM ASSEMBLY ............................................................................................................................9 FORMATO DE UM PROGRAMA EM LINGUAGEM ASSEMBLY ................................................................................................10 DEFININDO E REFERENCIANDO SEGMENTOS.....................................................................................................................11 DEFININDO VARIVEIS ..................................................................................................................................................12 DEFININDO RTULOS ...................................................................................................................................................13 DEFININDO CONSTANTES ..............................................................................................................................................14 ACESSANDO E ALTERANDO CARACTERSTICAS DE UM SMBOLO ..........................................................................................14 MODOS DE ENDEREAMENTO .......................................................................................................................................14 INTERRUPES DE HARDWARE E SOFTWARE ....................................................................................................................15
AS INSTRUES ........................................................................................................................................ 17 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 INTRODUO...............................................................................................................................................................17 INSTRUES DE MOVIMENTAO ..................................................................................................................................18 INSTRUES ARITMTICAS.............................................................................................................................................26 INSTRUES LGICAS ...................................................................................................................................................41 INSTRUES DE ENTRADA E SAIDA..................................................................................................................................52 INSTRUES DE MANIPULAO DE CADEIAS ....................................................................................................................53 INSTRUES DE DESVIO ................................................................................................................................................60 INSTRUES DE CONTROLE DO PROCESSADOR .................................................................................................................75
TPICOS AVANADOS .............................................................................................................................. 80 4.1 4.2 4.3 4.4 MDULOS ..................................................................................................................................................................80 MAIS DETALHES SOBRE SEGMENTOS ..............................................................................................................................81 DIRETIVA RECORD E OS OPERADORES MASK E WIDTH..................................................................................................83 DIRETIVA STRUC.........................................................................................................................................................84
Pgina 2
Daniel Quadros
Junho/2010
Pgina 3
INTRODUO
1.1 O PC-IBM E O MICROPROCESS ADOR 8088
Em 1981 o panorama do mercado de microcomputadores sofreu um forte abalo: o lanamento pela IBM do seu primeiro microcomputador, o PC (Personal Computer). Rapidamente o PC-IBM transformou-se no padro de fato para os microcomputadores profissionais. Uma grande quantidade de hardware e software de boa qualidade, est atualmente disponvel no mercado, permitindo o emprego do PC-IBM nos mais diversos ambientes. No Brasil os micros compatveis com o PC-IBM surgiram em 1983. No final de 1985 j atingiam a marca de mais de duas dzias de modelos no mercado, com uma venda da ordem de 500 unidades por ms. Um dos motivos bsicos do sucesso do PC-IBM foi o uso de um microprocessador de 16 bits. O uso do 8088 no PC-IBM forneceu maior capacidade de processamento e de endereamento que os micros de 8 bits ento existentes, permitindo o desenvolvimento de uma nova gerao de hardware e software. Estranhamente, apesar do grande domnio do PC-IBM no mercado de microcomputadores, existe uma falta de bons livros sobre a programao do 8088. Este livro se prope basicamente a duas finalidades: Ensinar o programador que j conhea outros microprocessadores a programar o 8088 e Ser uma referncia para o programador que j conhece o 8088. 1.2 A FAMLIA DE MICROPROCESSADORES 8088/86/ 188/186/286
O microprocessador 8086 foi desenvolvido pela INTEL Corporation, firma que j havia sido responsvel pelo primeiro microprocessador , o 4004, e pelo processador de 8 bits mais difundido, o 8080. Um dos primeiros microprocessadores de 16 bits, o 8086 se caracteriza por: Ter internamente registradores de 16 bits, Ter um conjunto completo de instrues aritmticas de 16 bits, inclusive multiplicao e diviso e Ter uma via de dados externa (de comunicao com memria e perifricos) tambm de 16 bits. Posteriormente a INTEL lanou o 8088, que idntico ao 8086 exceto pela via de dados externa que de 8 bits. Esta diferena transparente ao programador, que utiliza as mesmas instrues e continua acessando nmeros de 16 bits na memria. O 8088 cuida internamente de transformar os acessos a um WORD (nmero de 16 bits) em dois acessos a BYTEs (nmeros de 8 bits). Do ponto de vista de hardware, o 8088 permite uma forte simplificao, sem grande impacto no desempenho. Mais recentemente a famlia foi ampliada com o lanamento de trs novos membros, capazes de executar o mesmo conjunto de instrues e mais algumas outras:
Pgina 4
Programao Assembler no PC-IBM e Compatveis 80188 / 80186 - incluem em uma nica pastilha o microprocessador e circuitos de apoio como controladores de DMA e interrupo 80286 - amplia a capacidade de endereamento, atravs da incorporao de um gerenciador de memria que fornece recursos de proteo de memria e memria virtual. 1.3 O QUE UM ASSEMBLER
Um processador executa instrues, que so armazenadas em memria como nmeros - na chamada "linguagem de mquina". A programao destas instrues diretamente nesta linguagem bastante trabalhosa. Em primeiro lugar necessrio consultar uma tabela dos cdigos das vrias instrues. Em seguida necessrio determinar o endereo das instrues para as quais so efetuados desvios. Uma vez obtido o programa, se houver necessidade de incluir ou retirar instrues, estes endereos tero de ser redeterminados. O Assembler (ou Montador) um programa que automatiza estas tarefas (e outras mais). Ele recebe como entrada o programa escrito em outra forma - na "linguagem Assembly1". Nesta linguagem as instrues so referenciadas por MNEMNICOS - abreviaes de fcil memorizao - e os endereos por SMBOLOS - nomes aos quais o Assembler associa os endereos reais. Na linguagem Assembly temos tambm instrues para o programa Assembler - so as DIRETIVAS. Neste livro so utilizados os mnemnicos e nomes das diretivas definidos pelo fabricante do 8088 (a INTEL), que so utilizados tambm pelos assemblers disponveis no mercado. O Assembler do 8088 possui algumas caractersticas especiais: O nmero de mnemnicos bastante reduzido em comparao com o nmero de instrues em linguagem de mquina. A cada mnemnico corresponde uma classe de instrues correlatas, sendo a instruo definida pelos operandos. Por exemplo, o mnemnico "MOV" corresponde tanto movimentao do contedo de um registrador para outro como movimentao de um valor para uma posio da memria. Existe um forte conceito de TIPO nos smbolos. Por exemplo, ao se reservar uma rea para o armazenamento de dados, necessrio especificar qual o tipo de dado (byte, word, etc.) que ser armazenado. Esta informao utilizada para gerar o tipo correto de instruo e para verificar a validade dos operandos. Em alguns casos existem duas instrues, correspondentes a um mesmo mnemnico, que executam a mesma operao, porm com diferente ocupao de memria e/ou tempo de execuo. Por este motivo o Assembler tem que ter a capacidade de otimizar o cdigo.
A edio impressa utilizava a terminologia linguagem Assembler. Nesta nova edio estou usando linguagem Assembly que a terminologia mais usual atualmente.
Pgina 5
CONCEITOS BSICOS
2.1 COMO O 8088 ENDEREA MEMRIA
O 8088 capaz de enderear at 1 Mbyte de memria (1024x1024 bytes), o que corresponde a 20 bits de endereo, embora os seus registradores se limitem a 16 bits. Para obter estes 20 bits os endereos so normalmente tratados como duas partes: o SEGMENTO e o DESLOCAMENTO ("offset"). O endereo final obtido multiplicando-se o segmento por 16 e somando-se o deslocamento, ignorando o "vai um" do bit mais significativo. Por exemplo, podemos acessar a posio de endereo "fsico" 100H (hexadecimal) atravs do seguinte par segmento:offset :
0001H:00F0H + 00010H <- segmento * 16 00F0H <- deslocamento -----00100H <- endereo "fsico"
A mesma posio pode ser acessada atravs de 0000H:0100H ou 0010H:000H ou FF00H:1100H (neste caso, o "vai um" do resultado ignorado). Ao armazenar um word na memria, o 8088 coloca primeiro o byte MENOS significativo e depois o MAIS significativo. Por exemplo, o valor 1234H armazenado na posio de endereo "fsico" 300H da seguinte forma:
300H -> 34H 301H -> 12H
Da mesma forma, um valor de 32 bits (um "DOUBLE WORD", como um endereo composto por segmento e deslocamento) armazenado com o word MENOS significativo precedendo o MAIS. Por exemplo, o endereo 1234H:5678H seria armazenado em quatro bytes na seguinte ordem:
78H, 56H, 34H, 12H
2.2
OS REGISTRADORES DO 8088
O 8088 possui um conjunto de 14 registradores internos, que podemos classificar em quatro categorias: de uso geral, de base e ndice, de segmento e de controle. Registradores de uso geral Esta categoria composta por 4 registradores de 16 bits, referenciados pelos nomes AX, BX, CX e DX. Estes mesmos registradores podem ser acessados como 8 registradores de 8 bits: AH, AL, BH, BL, CH, CL, DH e DL. Os registradores "H" contm a parte mais significativa dos correspondentes "X" e os "L" a parte menos significativa. Apesar de estes registradores poderem ser utilizados indistintamente na maioria das instrues, eles tm algumas peculiaridades e usos mais comuns:
Pgina 6
Programao Assembler no PC-IBM e Compatveis AX - o "acumulador". Tem uso especial nas instrues de entrada e sada, multiplicao, diviso, e manipulao de cadeia. De forma geral, as movimentaes entre registradores e memria e as instrues aritmticas e lgicas com operando imediato possuem variantes mais curtas (e rpidas) quando o registrador utilizado o acumulador. BX - o registrador de "base", usado para acesso indireto da memria, principalmente tabelas. CX - o "contador". Tem uso especial nas instrues repetitivas - "LOOP" e de manipulao de cadeias. DX - um registrador auxiliar. Tem uso especial nas operaes de entrada e sada e serve de "extenso" do acumulador nas instrues de multiplicao e diviso. Registradores de Base e ndice Estes registradores so normalmente utilizados para apontar para dados, isto , armazenar um deslocamento. Ao contrrio dos de uso geral, no possvel acessar independentemente as partes mais e menos significativas destes registradores. Os registradores deste grupo so denominados: SP - ("stack pointer") o ponteiro para a pilha do processador, indicando sempre o ltimo dado nela colocado. utilizado pelas instrues "PUSH", "POP", "CALL", "RET", "INT" e "IRET". BP - ("base pointer") utilizado normalmente como ponteiro para acessar dados armazenados na pilha. SI - ("source index") e DI - ("destination index") podem conter o deslocamento de uma posio de memria que se deseja acessar ou um valor ("ndice") a ser somado a um registrador base (BX ou BP) para se obter o deslocamento de uma posio de memria. Tem tambm uso especial nas instrues de manipulao de cadeias. Registradores de Segmento Conforme j dito, o acesso memria feito sempre a partir de dois valores: o segmento e o deslocamento. Os deslocamentos so obtidos a partir das instrues, dos registradores de base e ndice (BX, BP, SP, SI e DI) ou de uma combinao destes elementos. J os segmentos so sempre obtidos de um dos quatro registradores de segmento: CS - aponta para o segmento de cdigo, no qual so acessadas as instrues; SS - aponta para o segmento da pilha, utilizado pelas instrues PUSH / POP / CALL / RET / INT e IRET; DS - aponta para o segmento de dados, utilizado preferivelmente no acesso a dados na memria e ES - aponta para o segmento extra, que uma alternativa para o acesso a dados na memria e utilizado nas instrues de manipulao de cadeias.
Pgina 7
Programao Assembler no PC-IBM e Compatveis Registradores de Controle Neste grupo temos dois registradores: IP - ponteiro de instrues, contm o deslocamento (em relao ao segmento de cdigo apontado por CS) da prxima instruo a executar. Este registrador no acessvel diretamente, sendo manipulado pelas instrues de desvio. "F" - este registrador ("flags") contm vrios bits que so utilizados pelo 8088 para indicar resultados ou controlar operaes: Indicadores de resultado AF "vai um" auxiliar, utilizado em operaes compactado". sobre nmeros no formato "BCD
CF "vai um" ("carry"), indica que o resultado de uma operao no coube na rea destinada. Usado tambm nas instrues de deslocamento e rotao. OF "overflow", indica que o resultado de uma operao aritmtica com sinal no coube na rea destinada. PF paridade, contm "1" quando o resultado da ltima operao continha um nmero par de "1"s. SF sinal, corresponde ao bit mais significativo do resultado da ltima operao. ZF zero, indica se o resultado da ltima operao foi zero. flags de controle DF controla as operaes de manipulao de cadeias, selecionando auto-incremento ("0") ou auto-decremento("1"). IF habilita ("1") ou desabilita ("0") interrupes externas
TF quando em "1" coloca o processador no modo "passo a passo", usado para depurao. Quando os flags so colocados na pilha (por uma instruo PUSHF ou uma interrupo) eles assumem a seguinte forma:
bit Flag 15 14 13 12 11 10 9 8 7 6 X X X X OF DF IF TF SF ZF 5 4 X AF 3 2 X PF 1 0 X CF
As posies marcadas com "X" correspondem a bits no utilizados e de contedo indefinido. Esta organizao tal que o byte menos significativo contm flags equivalentes aos do microprocessador 8080. 2.3 SMBOLOS
Os SMBOLOS so os nomes definidos pelo programador para indicar os endereos de instrues e variveis. No assembler do 8088 existe uma forte distino entre duas classes de smbolos:
Pgina 8
Os RTULOS - que correspondem a endereos de instrues, e As VARIVEIS - que correspondem a endereos de dados Todo smbolo possui trs caractersticas: O SEGMENTO em que ele foi definido O DESLOCAMENTO em relao a esse segmento O TIPO de smbolo Se rtulo: NEAR neste caso os desvios para este rtulo envolvem apenas alterao de deslocamento (registrador IP) ou FAR neste caso os desvios envolvem alterao de segmento e deslocamento (registradores CS e IP) Se varivel: BYTE ocupa um byte WORD ocupa dois bytes DWORD ocupa quatro bytes O tipo de smbolo ir distinguir entre as variantes de uma mesma instruo. Por exemplo, a instruo
INC XIS
pode significar o incremento de um byte ou um word; o tipo associado a XIS que ir definir qual das duas operaes desejada. 2.4 ELEMENTOS DA LINGUAGEM ASSEMBLY
A linguagem assembler do 8088 utiliza os seguintes elementos: Constantes Numricas Uma constante numrica pode ser fornecida em binrio (base 2), octal (base 8), decimal (base 10) ou hexadecimal (base 16). A base de uma constante numrica indicada atravs de uma letra ao final da constante: B - binrio O - octal D - decimal (pode ser omitida) H - hexadecimal, deve comear por um dgito (se necessrio, colocar um "0" no inicio)
Pgina 9
Programao Assembler no PC-IBM e Compatveis Uma constante pode ser precedida do sinal "-", para indicar um valor negativo. Vejamos alguns exemplos:
10011B -10011B 23O -23O 19D 19 -19D 13H -13H ; ; ; ; ; ; ; ; ; 19 em -19 em 19 em -19 em 19 em idem -19 em 19 em -19 em binrio binrio octal octal decimal decimal hexadecimal hexadecimal
Cadeias de Caracteres Uma cadeia de caracteres uma sequncia de caracteres cercada por apostrofes ('), por exemplo:
'Cadeia'
Nomes Um nome formado por uma sequncia de letras e dgitos, iniciada por uma letra. Normalmente os caracteres @ _ e ? so considerados como letras e um nome pode ter at 31 caracteres. No caso de ? ser permitido, ele no pode ser usado sozinho como um nome. Alguns nomes vlidos:
NOME_125 E_QUE_TAL_@? UM_NOME_GRANDE_PARA_TERMINAR
2.5
Um programa escrito em linguagem assembly composto por: linhas em branco, linhas de comentrio, linhas de instruo e linhas de diretiva As linhas de COMENTRIO se caracterizam por terem como primeiro caractere no branco um ";". Os caracteres seguintes ao ";" so ignorados pelo Assembler. (Observao: o termo BRANCO usado aqui no sentido de englobar tanto o caractere ESPAO como o caractere TAB).
Pgina 10
Programao Assembler no PC-IBM e Compatveis As linhas de INSTRUO so as que contm um mnemnico e iro gerar uma instruo de mquina. Tem o seguinte formato:
nome: prefixo mnemnico operandos ; comentrio
O nico campo sempre obrigatrio o do mnemnico; o campo de operandos ser obrigatrio ou opcional dependendo da instruo. No caso de se ter mais de um operando eles so separados por uma vrgula. As linhas de DIRETIVA tem o seguinte formato:
nome diretiva operandos ; comentrio
O nico campo sempre obrigatrio a diretiva; os campos de nome e operandos podem ser obrigatrios ou opcionais conforme a diretiva. Notar que (ao contrrio da linha de instruo) o nome inicial NO seguido de ":". Finalmente, todo programa termina com uma diretiva END:
END rtulo
O rtulo (que opcional) indica a primeira instruo a ser executada. 2.6 DEFININDO E REFERENC IANDO SEGMENTOS
Todos os smbolos declarados entre estas duas diretivas tero associados a si o segmento "nome". Para verificar se um determinado smbolo pode ser acessado e como ele deve ser acessado, o assembler necessita saber que valores o programador colocou nos registradores de segmento. Isto feito atravs da diretiva ASSUME:
ASSUME segreg:segnome {,segreg:segnome ...}
onde "segreg" corresponde ao nome de um registrador de segmento (CS, DS, ES ou SS) e "segnome" ao nome de um segmento ou a palavra NOTHING. Vejamos agora como escolhido o registrador de segmento a ser utilizado em um acesso memria: 1. A execuo de instrues sempre feita no segmento indicado por CS; 2. O acesso pilha via SP utiliza sempre o segmento indicado por SS; 3. Algumas instrues de manipulao de cadeias utilizam sempre o segmento contido em ES; Nos demais casos, existe um registrador padro, imposto por "hardware", que pode ser substitudo por outro atravs da colocao de um "prefixo" na instruo (o "SEGMENT OVERRIDE"). O registrador padro DS, exceto quando utilizado como base o registrador BP (neste caso o padro SS). Consideremos alguns exemplos: 1986, Daniel Quadros Pgina 11
A utilizao de um segmento diferente do padro pode ser forada pelo programador, precedendo o operando por "segreg:", como no exemplo abaixo:
INC CS:XIS
Neste caso a varivel XIS ser acessada atravs de CS ao invs de DS. O "segment override" pode tambm ser gerado automaticamente pelo assembler. Isto ocorre quando o assembler sabe (pelos ASSUMEs) que o segmento desejado no est no registrador padro mas sim em um outro. Por exemplo, suponhamos que a varivel XIS foi definida no segmento X e codificou-se os seguintes comandos:
ASSUME INC DS:Y, CS:X XIS
Neste caso o assembler se encarrega de colocar o prefixo "CS:" na instruo. Finalmente, temos a palavra "NOTHING". Ela permite informar ao assembler que o contedo de um registrador indefinido, s sendo possvel o seu uso atravs da codificao explicita do "segment override". 2.7 DEFININDO VARIVEIS
A definio de variveis feita atravs de trs diretivas: DB ("define byte"), DW ("define word") e DD ("define double-word"), que definem variveis de 8, 16 e 32 bits. Alm de definir os smbolos e reservar espao, estas diretivas permitem especificar o contedo inicial da varivel:
XIS DB 0
define trs bytes, com valores iniciais 1, 2 e 3. O smbolo ZE permite acessar o primeiro byte;
NOME DB "123"
define trs bytes, tendo como valores iniciais os caracteres "1", "2" e "3" (o que diferente dos nmeros 1, 2 e 3);
ZEROS DW 10 DUP(0)
A forma mais comum de se definir um rtulo colocando no inicio da linha o nome do rtulo, seguido de ":", como abaixo:
AQUI: INC ALI: INC YPS XIS
O rtulo AQUI aponta para a instruo "INC XIS", o rtulo ALI para a instruo "INC YPS". Utilizando esta forma de definio o rtulo fica sempre com o tipo "near". No caso de rotinas, prefervel o uso das diretivas PROC e ENDP:
nome ; ; ; nome PROC tipo
Neste caso, "nome" aponta para a instruo seguinte diretiva PROC e tem o tipo "NEAR" ou "FAR" nela especificado. Este tipo ir influir na chamada ao procedimento, que pode ser: Intra-segmento - se envolve apenas a alterao de deslocamento, sendo salvo na pilha apenas IP, ou; Inter-segmento - se envolve alterao de segmento e deslocamento, sendo salvo na pilha IP e CS. A instruo de retorno (RET) de subrotina tem que ser "casada" com a instruo de chamada (CALL). O tipo da instruo CALL determinado pelo tipo do rtulo da rotina. J o tipo da instruo RET determinado pelo tipo da rotina (delimitada por PROC / ENDP) em que ela foi usada. As instrues RET fora de rotinas so do tipo NEAR (intra-segmento). Por exemplo, consideremos o trecho abaixo:
XIS PROC FAR RET
; 1
YPS YPS
XIS
ENDP
Os RETs 1 e 3 esto dentro da rotina XIS, que FAR - logo eles so do tipo inter-segmento. O RET 2 est dentro da rotina YPS (por sua vez dentro de XIS) e um RET NEAR - prevalece o tipo da rotina mais interna. Existe ainda mais uma forma de definir smbolos, que pode ser utilizada tanto para variveis como rtulos:
nome LABEL tipo
Pgina 13
Programao Assembler no PC-IBM e Compatveis que associa o smbolo "nome" do tipo especificado prxima posio definida. Desta forma, possvel definir um tipo alternativo para uma posio de memria:
A_BYTE A_WORD LABEL DW BYTE ?
define um word, referencivel por A_WORD, cujo primeiro byte acessvel pelo smbolo A_BYTE. 2.9 DEFININDO CONSTANTES
Na definio de rtulos e variveis associamos nomes a endereos de memria. possvel tambm associar nomes a valores, isto definir CONSTANTES. Isto feito atravs da diretiva EQU ("equate"):
nome EQU expresso
por exemplo:
TAMANHO AREA EQU DB 20 TAMANHO DUP (?)
associa o nome TAMANHO ao valor 20 e o utiliza para definir uma rea de 20 bytes. A vantagem do uso do EQU a melhora da legibilidade do programa e a possibilidade de alterar todas as referncias a um valor alterando uma nica linha. 2.10 ACESSANDO E ALTERANDO CARACTERSTICAS DE UM SMBOLO Ao se referenciar um smbolo possvel precede-lo de um OPERADOR de forma a acessar ou alterar uma de suas caractersticas. Os operadores utilizados so: (nos exemplos abaixo supomos definida a varivel VAR do tipo word) OFFSET smbolo Ex: Fornece o deslocamento do smbolo
MOV BX,OFFSET VAR
Coloca em BX o deslocamento de VAR no segmento em que VAR foi definida SEG smbolo Ex: Fornece o segmento do smbolo
MOV BX,SEG VAR
Coloca em BX o segmento que VAR foi definida Tipo PTR smbolo Ex: Permite alterar o tipo de um smbolo
INC BYTE PTR VAR
Incrementa o primeiro byte de VAR SHORT rtulo Usado com a instruo JMP para indicar que o rotulo est a uma distncia de -128 a +127 bytes da instruo seguinte, sendo possvel um desvio curto (ver Instrues de Desvio, item 3.7).
JMP NEAR DESTINO
Ex
Programao Assembler no PC-IBM e Compatveis Os operandos das instrues do 8088 podem vir de vrios lugares: Registradores, Da prpria instruo (valor imediato) ou Da memria. No caso de operando obtido da memria, necessitamos de um segmento e de um deslocamento. J vimos como determinado o segmento, vejamos agora como pode ser especificado o deslocamento: 1) atravs de um valor direto, armazenado na prpria instruo:
MOV AX,VAR
2) indiretamente, atravs de um registrador de base ou ndice, opcionalmente somado a uma distncia de 8 (-128 a +127) ou 16 (-32268 a +32267) bits:
MOV MOV MOV AX,[BX] AX,[BX+1] AX,TABELA[BX]
3) indiretamente, pela soma de um registrador base e um registrador ndice, opcionalmente somado a uma distncia de 8 ou 16 bits:
MOV MOV AX,[BX+SI] AX,TABELA[BP][DI-300]
2.12 INTERRUPES DE HARDWARE E SOFTWARE Uma INTERRUPO um desvio causado por: a) Um evento externo, normalmente uma sinalizao de um dispositivo de entrada ou sada, ou b) Um evento interno, associado instruo sendo executada. No primeiro caso, a interrupo ser assncrona ao programa (poder ocorrer aps a execuo de qualquer instruo) e causada por hardware externo ao processador. No segundo caso temos quatro possibilidades: b1) Interrupo por erro de diviso (o quociente no cabe no registrador destino), b2) Interrupo de execuo passo a passo, que controlada pelo flag TF, b3) Interrupo causada pela execuo da instruo INTO ("interrupt on overflow") com o flag OF ativo, ou b4) Interrupo causada pela execuo da instruo INT - este tipo de interrupo chamado de INTERRUPO DE SOFTWARE. 1986, Daniel Quadros Pgina 15
Programao Assembler no PC-IBM e Compatveis As interrupes do 8088 so ditas VETORIZADAS: a cada interrupo est associado um nmero de 0 a 255 que utilizado para acessar uma tabela localizada a partir do endereo "fsico" 0. Esta tabela contem o endereo (deslocamento e segmento) da rotina que ir tratar a interrupo. Por exemplo, o endereo da rotina que trata a interrupo 40H est armazenado a partir da posio "fsica" 100H (4 * 40H). Alguns vetores tm funes pr-definidas: 0 - erro em diviso 1 - passo a passo 2 - interrupo no mascarvel de hardware 4 - interrupo causada pela instruo INTO Quando ocorre uma interrupo as seguintes aes ocorrem: 1. O registrador de flags colocado na pilha, 2. Os flags TF e IF so limpos, desabilitando interrupes externas e de passo a passo, 3. CS e IP so colocados na pilha e 4. feito o desvio para a rotina cujo endereo est no vetor correspondente. Uma instruo especial (IRET) normalmente utilizada ao final do tratamento de uma interrupo para retirar IP, CS e os flags da pilha, retornado ao trecho interrompido.
Pgina 16
AS INSTRUES
3.1 INTRODUO
Neste captulo so descritas todas as instrues da linguagem Assembly do 8088. A descrio segue sempre o seguinte formato: Mnemnico - nome da instruo Codificao Operao realizada Flags afetados Comentrios e exemplos Na descrio da codificao so usados os seguintes termos: reg um registrador de uso geral ou de base/ndice (AX, BX, CX, DX, AH, AL, BH, BL, CH, CL, DH, DL, SI, DI, BP ou SP) um registrador de segmento (CS, DS, ES ou SS)
segreg
regword um registrador de uso geral de 16 bits ou de base/ndice (AX, BX, CX, DX, SI, DI, BP ou SP) mem imed rtulo uma referncia (direta ou indireta) memria uma constante um rtulo qualquer
Pgina 17
* no permitido CS Operao: A instruo MOV movimenta dados (byte ou word) entre registradores e memria. Flags Afetados Nenhum Comentrios e Exemplos A instruo MOV bastante regular no que diz respeito ao uso com registradores e memria. No caso de registradores de segmento, notar que no existe a movimentao de valor imediato. Notar tambm que no permitido escrever em CS. Alguns exemplos vlidos:
MOV MOV MOV MOV AX,VALOR_IMEDIATO DS,AX SI,TABELA[SI] AX,CS
Pgina 18
Operao: O registrador SP decrementado de 2 e o operando colocado nas posies SS:[SP] e SS:[SP+1]. Flags Afetados Nenhum Comentrios e Exemplos A instruo PUSH normalmente utilizada para salvar temporariamente um registrador (que ser recuperado atravs da instruo POP) ou passar um parmetro para uma sub-rotina. Cabe lembrar que SP aponta sempre para o ltimo dado colocado na pilha e que o segmento utilizado sempre SS. Notar que no existe PUSH de um valor imediato. Por outro lado, PUSH uma das poucas instrues capazes de fazer dois acessos memria. A sequncia
PUSH POP VARIAVEL_1 VARIAVEL_2
move o contedo de VARIAVEL_1 para VARIAVEL_2 sem uso de registradores intermedirios. Alguns exemplos:
PUSH PUSH PUSH PUSH PUSH AX DS SS SP CS:[BX+SI+1]
; salva SP j decrementado de 2
Pgina 19
( * CS no permitido) Operao: O operando recebe o contedo das posies SS:[SP] e SS:[SP+1]; o registrador SP incrementado de 2. Flags Afetados Nenhum Comentrios e Exemplos A instruo POP normalmente utilizada para recuperar um registrador armazenado na pilha atravs da instruo PUSH. Cabe lembrar que SP aponta sempre para o ltimo dado colocado na pilha e que o segmento utilizado sempre SS. Notar que "POP CS" no permitido. Por outro lado, POP uma das poucas instrues capazes de fazer dois acessos memria. A sequncia
PUSH POP VARIAVEL_1 VARIAVEL_2
move o contedo de VARIAVEL_1 para VARIAVEL_2 sem uso de registradores intermedirios. Alguns exemplos:
POP POP POP POP POP AX DS SS SP CS:[BX+SI+1]
Pgina 20
Operao: Os contedos dos dois operandos so trocados. Flags Afetados Nenhum Comentrios e Exemplos Esta instruo bastante poderosa, pois realiza a troca sem usar registradores ou variveis auxiliares. Permite tambm ler e alterar uma posio de memria com uma nica instruo. Notar que no permitida referncia a registradores de segmento. Alguns exemplos:
XCHG XCHG XCHG XCHG AX,BX AH,AL AH,BL AL,VARIAVEL
Operao: A instruo XLAT substitui o contedo de AL pelo byte em [BX+AL]. Flags Afetados Nenhum Comentrios e Exemplos A instruo XLAT ao mesmo tempo uma instruo poderosa (uma rotina equivalente teria pelo menos trs instrues e alteraria pelo menos um registrador) e limitada (utiliza sempre AL e BX). Seu uso tpico a converso de um byte atravs de uma tabela:
MOV MOV XLAT AL,VALOR_A_CONVERTER BX,OFFSET TABELA TABELA
Pgina 21
Programao Assembler no PC-IBM e Compatveis importante notar que o operando NO ir especificar o offset inicial da tabela (que obtido de BX). Sua finalidade permitir que o assembler determine qual o registrador de segmento a utilizar. Exemplos:
XLAT XLAT TAB_1 CS:TAB_2
Operao: A instruo LEA carrega em um registrador o deslocamento do operando. Flags Afetados Nenhum Comentrios e Exemplos Para entendermos a instruo LEA interessante comparar as trs instrues abaixo:
MOV MOV LEA BX,XIS BX,OFFSET XIS BX,XIS
A primeira carrega BX com o CONTEDO da varivel XIS; as duas ltimas carregam BX com o DESLOCAMENTO (offset) da varivel XIS. A instruo LEA tem duas diferenas em relao ao "MOV OFFSET": Carrega um registrador com o offset correspondente a uma referncia qualquer memria, inclusive com indexao e Leva em conta o valor dos registradores de segmentos (especificado via ASSUME). Por outro lado, no caso mais comum de carga do deslocamento de um smbolo em relao ao segmento onde ele foi definido, o "MOV OFFSET" mais curto e rpido. Alguns exemplos:
LEA LEA AX,VAR SI,TABELA[BX+SI+3]
Pgina 22
Operao: A instruo LDS carrega um ponteiro de 32 bits da memria para DS (segmento) e um registrador (deslocamento). Flags Afetados Nenhum Comentrios e Exemplos As instrues LDS e LES so as nicas a permitir o acesso a ponteiros "completos" (segmento + deslocamento). O deslocamento pode ser carregado tanto nos registradores de base e ndice como nos registradores de uso geral de 16 bits, inclusive em registradores que no possam ser usados para acesso indireto memria. Infelizmente, no existe uma instruo que execute a operao inversa, isto , mova um ponteiro "completo" de registradores para a memria; isto deve ser feito atravs de dois "MOVs". Exemplos:
LDS LDS SI,PONTEIRO_ORIGEM AX,ENDERECO
Operao: A instruo LES carrega um ponteiro de 32 bits da memria para ES (segmento) e um registrador (deslocamento). Flags Afetados Nenhum Comentrios e Exemplos As instrues LES e LDS so as nicas a permitir o acesso a ponteiros "completos" (segmento + deslocamento). O deslocamento pode ser carregado tanto nos registradores de base e ndice como nos registradores de uso geral de 16 bits, inclusive em registradores que no possam ser usados para acesso indireto memria. Infelizmente, no existe uma instruo que execute a operao inversa, isto , mova um ponteiro "completo" de registradores para a memria; isto deve ser feito atravs de dois "MOVs". 1986, Daniel Quadros Pgina 23
Operao: O byte menos significativo dos Flags movido para AH. Flags Afetados Nenhum Comentrios e Exemplos Os bits de AH tero os seguintes contedos aps a execuo da instruo LAHF: Bit 7 6 5 4 3 2 1 0 Contedo flag de sinal flag de zero Indefinido flag de vai um auxiliar Indefinido flag de paridade Indefinido flag de vai um
A finalidade bsica desta instruo permitir salvar, sem o uso da pilha, o contedo dos flags equivalentes aos do microprocessador 8080. Ela foi criada pela INTEL para facilitar a converso de programas assembler 8080 para 8088. Os flags salvos em AH podem ser restaurados atravs da instruo SAHF. Exemplo:
LAHF INC SAHF ;Salva Flags em AH ;Altera Flags ;Recupera valor dos Flags antes do INC
BX
Pgina 24
Operao: O contedo de AH movido para o byte menos significativo dos Flags. Flags Afetados SF, ZF, AF, PF, CF Comentrios e Exemplos Os bits de AH ocuparo os seguintes flags aps a execuo da instruo SAHF: Bit 7 6 4 2 0 Flag Sinal Zero Vai um auxiliar Paridade Vai um
Normalmente esta instruo utilizada para restaurar os flags salvos atravs da instruo LAHF. Ela foi criada pela INTEL para facilitar a converso de programas assembler 8080 para 8088. Exemplo:
LAHF INC SAHF ;Salva Flags em AH ;Altera Flags ;Recupera valor dos Flags antes do INC
BX
Operao: O registrador SP decrementado de 2 e os flags so colocados nas posies SS:[SP] e SS:[SP+1]. Flags Afetados Nenhum Comentrios e Exemplos Esta instruo normalmente utilizada para salvar temporariamente o contedo dos flags, que sero restaurados depois atravs da instruo POPF. Um uso menos comum colocar os flags na pilha para serem restaurados atravs da instruo IRET.
Pgina 25
Programao Assembler no PC-IBM e Compatveis Cabe lembrar que SP aponta sempre para o ltimo dado colocado na pilha e que o segmento utilizado sempre SS. Exemplo:
PUSHF
Operao: Os flags recebem o contedo das posies SS:[SP] SS:[SP+1] e o registrador SP incrementado de 2. Flags Afetados Todos Comentrios e Exemplos Esta instruo normalmente utilizada para restaurar o contedo dos flags, salvos atravs da instruo PUSHF. Notar que somente as instrues POPF e IRET so capazes de alterar o flag de "passo a passo" ("single step"). Cabe lembrar que SP aponta sempre para o ltimo dado colocado na pilha e que o segmento utilizado sempre SS. Exemplo:
POPF
3.3
INSTRUES ARITMTIC AS
Estas instrues permitem efetuar operaes aritmticas envolvendo registradores, variveis e constantes. Nenhuma delas permite o acesso a registradores de segmento, sendo necessrio utilizar registradores ou variveis, movendo valores de/para os registradores de segmento. A maioria delas afeta os Flags da maneira esperada, isto , posicionando-os de acordo com suas definies. ADD - Adio Codificao:
ADD ADD ADD ADD ADD reg,reg mem,reg reg,mem reg,imed mem,imed
Pgina 26
Programao Assembler no PC-IBM e Compatveis Operao: A instruo ADD soma os dois operandos, colocando o resultado no primeiro deles. Flags Afetados AF, CF, OF, PF, SF e ZF Exemplos
ADD ADD ADD ADD ADD CX,DX MATRIZ[BX],BP SP,VARIAVEL SI,50 VARIAVEL,3
Operao: A operao ADC soma os dois operandos e mais um se o flag de "vem um" (CF) estiver ativo. O resultado colocado no primeiro operando. Flags Afetados AF, CF, OF, PF, SF e ZF Comentrios e Exemplos A instruo ADC normalmente utilizada para "propagar" o "vai um" quando se soma nmeros com mais de 2 bytes, por exemplo:
ADD ADC BX,DX AX,CX
soma dois nmeros de 32 bits, um em CX (word menos significativo) e DX (word mais significativo) e o outro em BX e AX, colocando o resultado em AXBX. Notar que a primeira soma do menos significativo e feita por "ADD", pois no temos "vem um" de somas anteriores. Pode-se utilizar "ADC", desde que antes o flag de "vai um" seja desligado, por exemplo:
CLC ADC ADC
BX,DX AX,CX
Pgina 27
Operao: A instruo INC soma um ao operando. Flags Afetados AF, OF, PF, SF e ZF Comentrios e Exemplos A instruo INC permite incrementar um registrador ou varivel de forma mais curta e rpida que "ADD ,1" e sem alterar o flag CF. Exemplos:
INC INC SP [BX+DI+1]
Operao: A instruo SUB subtrai o segundo operando do primeiro, colocando o resultado no primeiro. Flags Afetados AF, CF, OF, PF, SF e ZF Exemplos
SUB SUB SUB SUB SUB CX,DX MATRIZ[BX],BP SP,VARIAVEL SI,50 VARIAVEL,3
Pgina 28
Operao: A operao SBB subtrai o segundo operando do primeiro e mais um se o flag de "vem um" (CF) estiver ativo. O resultado colocado no primeiro operando. Flags Afetados AF, CF, OF, PF, SF e ZF Comentrios e Exemplos A instruo SBB normalmente utilizada para "propagar" o "vem um" quando se subtrai nmeros com mais de 2 bytes, por exemplo:
SUB SBB BX,DX AX,CX
subtrai o nmero de 32 bits em CX (word menos significativo) e DX (word mais significativo) de outro em BX e AX, colocando o resultado em AXBX. Notar que a primeira subtrao do menos significativo e feita por "SUB", pois no temos "vem um" de somas anteriores. Pode-se utilizar "SBB", desde que antes o flag de "vai um" seja desligado, por exemplo:
CLC SBB SBB
BX,DX AX,CX
Operao: A instruo DEC subtrai um do operando. Flags Afetados AF, OF, PF, SF e ZF Comentrios e Exemplos A instruo DEC permite decrementar um registrador ou varivel de forma mais curta e rpida que "SUB ,1" e sem alterar o flag CF. Exemplos:
DEC DEC SP [BX+DI+1]
Pgina 29
Operao: A instruo CMP posiciona os flags de forma equivalente a uma subtrao sem alterar os operandos. Flags Afetados AF, OF, PF, SF e ZF Exemplos:
CMP CMP CMP CMP CMP CX,DX MATRIZ[BX],BP SP,VARIAVEL SI,50 VARIAVEL,3
Operao: A instruo MUL efetua a multiplicao, sem sinal, do acumulador pelo operando especificado: Tipo do Operando Byte Word Flags Afetados CF e OF - ativados se a parte mais significativa do produto (AH ou DX, conforme o caso) for diferente de zero. AF, PF SF e ZF - indefinidos Comentrios e Exemplos A instruo MUL fornece sempre um resultado de tamanho (em bits) do dobro dos fatores (que tem o mesmo tamanho), o que garante que o resultado sempre caiba no destino. Multiplicando AL AX Produto + significativo - significativo AH AL DX AX
Pgina 30
Programao Assembler no PC-IBM e Compatveis Os registradores utilizados para o multiplicando e produto so fixos; notar que no existe a multiplicao por um valor imediato. No que diz respeito aos flags, apenas CF e OF so posicionados coerentemente com o resultado; os demais (em particular ZF) tm seu valor INDEFINIDO aps a multiplicao. Finalmente, a instruo MUL relativamente lenta; no caso de multiplicao por potncias de dois prefervel a utilizao de deslocamentos (ver instruo SHL). Exemplos:
MUL MUL AH VAR_WORD ; AX = AH * AL ; DXAX = AX * VAR_WORD
Operao: A instruo IMUL efetua a multiplicao, com sinal, do acumulador pelo operando especificado: Tipo do Operando Byte Word Flags Afetados CF e OF - ativados se a parte mais significativa do produto (AH ou DX, conforme o caso) no for uma extenso do sinal da parte menos significativa. AF, PF SF e ZF - indefinidos Comentrios e Exemplos A instruo IMUL multiplica nmeros com sinal (na notao de complemento de 2), fornecendo sempre um resultado de tamanho (em bits) do dobro dos fatores (que tem o mesmo tamanho), o que garante que o resultado sempre caiba nos destino. Os registradores utilizados para o multiplicando e produto so fixos; notar que no existe a multiplicao por um valor imediato. No que diz respeito aos flags, apenas CF e OF so posicionados coerentemente com o resultado; os demais (em particular ZF) tem seu valor INDEFINIDO aps a multiplicao. Finalmente, a instruo IMUL relativamente lenta; no caso de multiplicao por potncias de dois prefervel a utilizao de deslocamentos, veja a instruo SAL. Multiplicando AL AX Produto + significativo - significativo AH AL DX AX
Pgina 31
Operao: A instruo DIV efetua a diviso, sem sinal, do acumulador pelo operando especificado: Tipo do Operando Byte Word Dividendo + significativo - significativo AH AL DX AX Quociente AL AX Resto AH DX
Se o quociente no couber no registrador destino, uma interrupo de tipo 0 (erro em diviso) gerada, com os registradores destino contendo valores indefinidos. Flags Afetados AF, CF, OF, PF, SF e ZF - indefinidos Comentrios e Exemplos A instruo DIV divide sempre um dividendo de tamanho (em bits) do dobro do divisor e do resto (que tem o mesmo tamanho). Desta forma possvel que o resultado no caiba no registrador destino, mesmo que o divisor no seja zero. Os registradores utilizados para o dividendo, quociente e resto so fixos; notar que no existe a diviso por um valor imediato. Um erro comum se esquecer de zerar a parte mais significativa do dividendo quando se deseja a diviso de um byte por outro ou de um word por outro. Finalmente, a instruo DIV relativamente lenta; no caso de diviso por potncias de dois prefervel a utilizao de deslocamentos para obter o quociente (ver instruo SHR) e de mascaramento para obter o resto (veja a instruo AND). Exemplos:
DIV DIV BL VAR_WORD ; ; ; ; divide AX por BL AL=quociente e AH=resto divide DXAX por VAR_WORD AX=quociente, DX=resto
Pgina 32
Operao: A instruo IDIV efetua a diviso, com sinal, do acumulador pelo operando especificado: Tipo do Operando Byte Word Dividendo + significativo - significativo AH AL DX AX Quociente AL AX Resto AH DX
Se o quociente no couber no registrador destino, uma interrupo de tipo 0 (erro em diviso) gerada, com os registradores destino contendo valores indefinidos. Flags Afetados AF, CF, OF, PF, SF e ZF - indefinidos Comentrios e Exemplos A instruo IDIV divide sempre um dividendo de tamanho (em bits) do dobro do divisor e do resto (que tem o mesmo tamanho). Desta forma possivel que o resultado no caiba no registrador destino, mesmo que o divisor no seja zero. O resto tem sempre o mesmo sinal que o dividendo. Os registradores utilizados para o dividendo, quociente e resto so fixos; notar que no existe a diviso por um valor imediato. Um erro comum se esquecer de zerar a parte mais significativa do dividendo quando se deseja a diviso de um byte por outro ou de um word por outro. Finalmente, a instruo IDIV relativamente lenta; no caso de diviso por potncias de dois prefervel a utilizao de deslocamentos para obter o quociente (veja a instruo SAR) e de mascaramento para obter o resto (veja a instruo AND). Exemplos:
IDIV IDIV BL VAR_WORD ; ; ; ; divide AX por BL AL=quociente e AH=resto divide DXAX por VAR_WORD AX=quociente, DX=resto
Pgina 33
Operao: A instruo NEG calcula o complemento de dois do operando, subtraindo o operando de 0FFH (se byte) ou de 0FFFFH (se word) e somando um ao resultado. Flags Afetados AF, CF, OF, PF, SF e ZF Comentrios e Exemplos A instruo NEG utilizada para mudar o sinal do seu operando (na notao complemento de dois). No deve ser confundida com a instruo NOT, que efetua a negao LGICA (ou de complemento de um). Exemplos:
NEG NEG AX VAR[BX]
Operao: A instruo CBW efetua a expanso do sinal de AL em AH: Se AL < 80H ento AH 0 seno AH 0FFH Flags Afetados Nenhum Comentrios A instruo CBW converte um byte em word, MANTENDO o SINAL. A converso sem sinal pode ser obtida zerando-se o byte mais significativo. Notar que esta instruo opera SEMPRE sobre AL e AH.
Pgina 34
Operao: A instruo CWD efetua a expanso do sinal de AX em DX: Se AX < 8000H ento DX 0 seno DX 0FFFFH Flags Afetados Nenhum Comentrios A instruo CWD converte um word em doubleword, MANTENDO o SINAL. A converso sem sinal pode ser obtida zerando-se o word mais significativo. Notar que esta instruo opera SEMPRE sobre AX e DX AAA - Ajuste para Adio ASCII Codificao:
AAA
Operao: A instruo AAA ajusta o resultado (em AL) de uma soma de dois valores decimais (0 a 9) de forma a se obter (em AL) um novo dgito decimal (0 a 9) e passar-se (em AH e CF) o "vai um" correto para o dgito seguinte: Se os 4 bits - signif. de AL > 9 ou AF ativo ento Soma 6 em AL Soma 1 em AH Zera os 4 bits + signif. de AL Ativa AF e CF seno Desativa AF e CF Flags Afetados AF e CF OF, PF, SF e ZF Comentrios O exemplo abaixo mostra a soma de dois nmeros decimais no compactados de dez dgitos: ativados se "vai um" decimal indefinidos
Pgina 35
Notar que as instrues DEC, MOV e LOOP no alteram CF, o que simplifica a passagem do "vai um". importante destacar que esta instruo atua somente em AL e AH. Os quatro bits menos significativos de AL so zerados, sendo indiferente o seu contedo original. Isto permite a soma de nmeros em representao ASCII (na qual 0=30H, 1=31H, ...), embora o resultado no saia com a representao correta. AAS - Ajuste para Subtrao ASCII Codificao:
AAS
Operao: A instruo AAS ajusta o resultado (em AL) de uma subtrao de dois valores decimais (0 a 9) de forma a se obter um novo dgito decimal (0 a 9, em AL) e o "vem um" correto (em AH e CF) para o dgito seguinte: Se os 4 bits - signif. de AL > 9 ou AF ativo ento Subtrai 6 de AL Subtrai 1 de AH Zera os 4 bits + signif. de AL Ativa AF e CF seno Desativa AF e CF Flags Afetados AF e CF OF, PF, SF e ZF Comentrios O exemplo abaixo mostra a subtrao de dois nmeros decimais no compactados de dez dgitos:
MOV MOV CLC SI,OFFSET NUMERO_1 + 9 DI,OFFSET NUMERO_2 + 9 ;ltimo digito ;ltimo digito ;vai um inicial = 0
Pgina 36
Notar que as instrues DEC, MOV e LOOP no alteram CF, o que simplifica a passagem do "vai um". importante destacar que esta instruo atua somente em AL e AH. Os quatro bits menos significativos de AL so zerados, sendo indiferente o seu contedo original. Isto permite a soma de nmeros em representao ASCII (na qual 0=30H, 1=31H, ...), embora o resultado no saia com a representao correta. DAA - Ajuste para Adio de Decimal Compactado Codificao:
DAA
Operao: A instruo DAA ajusta o resultado (em AL) de uma soma de dois valores decimais compactados (00H a 99H) de forma a se obter um novo valor decimal compactado (em AL) e o "vai um" correto (em CF): Se os 4 bits - signif. de AL > 9 ou AF ativo ento Soma 6 em AL Ativa AF Se os 4 bits + signif. de AL > 9 ou CF ativo ento Soma 60H emAL Ativa CF Flags Afetados AF, CF, PF, SF e ZF OF - indefinido Comentrios Esta instruo semelhante AAA, porm aqui estamos armazenando dois dgitos por byte. O exemplo abaixo mostra a soma de dois nmeros decimais compactados de dez dgitos:
MOV MOV CLC MOV SOMA: SI,OFFSET NUMERO_1 + 4 DI,OFFSET NUMERO_2 + 4 CX,5 ;ltimo digito ;ltimo digito ;vai um inicial = 0 ;# de bytes
Pgina 37
Notar que as instrues DEC, MOV e LOOP no alteram CF, o que simplifica a passagem do "vai um". importante destacar que esta instruo atua somente em AL. DAS - Ajuste para Subtrao de Decimal Compactado Codificao:
DAS
Operao: A instruo DAS ajusta o resultado (em AL) da subtrao de dois valores decimais compactados (00H a 99H) de forma a se obter um novo valor decimal compactado (em AL) e o "vem um" correto (em CF): Se os 4 bits - signif. de AL > 9 ou AF ativo ento Subtrai 6 de AL Ativa AF Se os 4 bits + signif. de AL > 9 ou CF ativo ento Subtrai 60H de AL Ativa CF Flags Afetados AF, CF, PF, SF e ZF OF - indefinido Comentrios Esta instruo semelhante AAS porm aqui estamos armazenando dois dgitos por byte. O exemplo abaixo mostra a subtrao de dois nmeros decimais compactados de dez dgitos:
MOV MOV CLC MOV SUBT: MOV SBB DAS MOV DEC DEC AL,[SI] AL,[DI] [DI],AL SI DI ;subtrai ;ajusta resultado ;guarda SI,OFFSET NUMERO_1 + 4 DI,OFFSET NUMERO_2 + 4 CX,5 ;ltimo digito ;ltimo digito ;vai um inicial = 0 ;# de bytes
Pgina 38
Notar que as instrues DEC, MOV e LOOP no alteram CF, o que simplifica a passagem do "vai um". importante destacar que esta instruo atua somente em AL. AAM - Ajuste para Multiplicao ASCII Codificao:
AAM
Operao: A instruo AAM ajusta o resultado (em AL) da multiplicao de dois dgitos decimais no compactados (0 a 9) de forma a se obter (em AH e AL) os DOIS dgitos decimais correspondentes ao produto: AH - quociente da diviso de AL por 10 AL - resto da diviso de AL por 10 Flags Afetados PF, SF e ZF AF, CF e OF - indefinidos Comentrios O exemplo abaixo mostra a multiplicao de um nmero decimal de dez dgitos por um nmero de 0 a 9:
FATOR1 FATOR2 PRODUT DB DB DB MOV MOV MULT: DEC MOV MUL AAM ADD AAA MOV MOV OR JNZ MOV SI AL,FATOR1[SI] FATOR2 AL,DL DL,AH PRODUTO[SI+1],AL SI,SI MULT PRODUTO[SI],DL ;AHAL = produto ;soma vai um anterior ;novo vai um ;dgito do produto ;repete p/ os 10 ;ltimo dgito 10 DUP(?) ? 11 DUP(?) SI,10 DL,0 ;ndice p/ FATOR2 e PRODUTO ;vai um do produto anterior
Pgina 39
Programao Assembler no PC-IBM e Compatveis Esta rotina funciona como a multiplicao feita mo: multiplicam-se dois dgitos e soma-se o "vai um" do produto anterior; o algarismo das unidades colocado no produto e o das dezenas o novo "vai um". Como as demais operaes de ajuste, AAM opera sempre sobre AL e AH. Porm, ao contrrio de AAA e AAS, os bits mais significativos dos fatores TM que conter zero para a obteno do resultado correto. O 8088 NO possui uma instruo voltada para a multiplicao de nmeros decimais compactados. Finalmente, cabe notar que AAM ligeiramente mais rpida que DIV, podendo ser usada como alternativa para a diviso por 10. AAD - Ajuste para Diviso ASCII Codificao:
AAD
Operao: A instruo AAD prepara os contedos de AH e AL, normalmente dois dgitos decimais no compactados, de forma a se obter em AX um nmero que, dividido por um terceiro nmero decimal, fornea quociente e resto corretos. Isto feito somando-se a AL o valor contido em AH multiplicado por 10 e zerando-se AH em seguida. Flags Afetados PF, SF e ZF AF, CF e OF - indefinidos Comentrios Ao contrrio das demais instrues de ajuste, AAD deve ser executada ANTES da operao aritmtica. O 8088 no possui uma instruo para diviso de nmeros decimais compactados. Como a instruo AAD ligeiramente mais rpida que MUL, ela pode ser usada como opo para a multiplicao de AH por 10.
Pgina 40
Operao: A instruo NOT calcula o complemento de 1 do operando, subtraindo-o de 0FFH (se byte) ou 0FFFFH (se word), sem afetar os flags. Flags Afetados Nenhum Comentrios A instruo NOT utilizada para efetuar a negao lgica do operando. No deve ser confundida com a instruo NEG, que efetua a negao aritmtica (complemento de 2). Exemplos:
NOT NOT SI VAR[BX]
Operao: A instruo SHL desloca o primeiro operando para a esquerda, sendo o nmero de posies especificado pelo segundo operando. A cada deslocamento o bit mais significativo colocado no flag de "vai um" e um zero colocado no bit menos significativo:
Flags Afetados CF ltimo bit deslocado para fora 1986, Daniel Quadros Pgina 41
Programao Assembler no PC-IBM e Compatveis PF, SF e ZF AF OF correspondem ao resultado final indefinido se o segundo operando for 1, OF ser ativado se o bit mais significativo do resultado for diferente do "vai um" final (isto , se o sinal foi deslocado para fora do nmero). Se o segundo operando no for 1, OF fica indefinido.
Comentrios e Exemplos Como as demais instrues de deslocamento e rotao, a instruo SHL aceita um segundo operando constante (1) ou varivel (CL); outras combinaes (constantes diferentes de 1 ou outros registradores que no CL) no so permitidas. A instruo SHL idntica instruo SAL; os dois mnemnicos permitem uma maior clareza no programa. Um uso bastante frequente de SHL para efetuar a multiplicao por potncias de dois:
SHL MOV SHL SI,1 CL,4 VARIAVEL,CL ;multiplica por 2 ;multiplica por 16
Operao: A instruo SAL desloca o primeiro operando para a esquerda, sendo o nmero de posies especificado pelo segundo operando. A cada deslocamento o bit mais significativo colocado no flag de "vai um" e um zero colocado no bit menos significativo:
Flags Afetados CF PF, SF e ZF AF ltimo bit deslocado para fora correspondem ao resultado final indefinido
Pgina 42
Programao Assembler no PC-IBM e Compatveis OF se o segundo operando for 1, OF ser ativado se o bit mais significativo do resultado for diferente do "vai um" final (isto , se o sinal foi deslocado para fora do nmero). Se o segundo operando no for 1, OF fica indefinido.
Comentrios e Exemplos Como as demais instrues de deslocamento e rotao, a instruo SAL aceita um segundo operando constante (1) ou varivel (CL); outras combinaes (constantes diferentes de 1 ou outros registradores que no CL) no so permitidas. A instruo SAL idntica instruo SHL; os dois mnemnicos permitem uma maior clareza no programa. Um uso bastante frequente de SHL para efetuar a multiplicao por potncias de dois:
SAL MOV SAL SI,1 CL,4 VARIAVEL,CL ;multiplica por 2 ;multiplica por 16
Operao: A instruo SHR desloca o primeiro operando para a direita, sendo o nmero de posies especificado pelo segundo operando. A cada deslocamento o bit menos significativo colocado no flag de "vai um" e um zero colocado no bit mais significativo:
Flags Afetados CF PF, SF e ZF AF OF ltimo bit deslocado para fora correspondem ao resultado final indefinido se o segundo operando for 1, OF ser ativado se o bit mais significativo do resultado for diferente do original (isto , se o sinal foi deslocado para fora do nmero). Se o segundo operando no for 1, OF fica indefinido. 1986, Daniel Quadros Pgina 43
Programao Assembler no PC-IBM e Compatveis Comentrios e Exemplos Como as demais instrues de deslocamento e rotao, a instruo SHR aceita um segundo operando constante (somente 1) ou varivel (somente CL). importante notar que a instruo SHR DIFERENTE de SAR; a primeira preenche com zero os bits mais significativos e a segunda reproduz o bit mais significativo original. Um uso bastante frequente de SHR para efetuar a diviso de nmeros sem sinal por potncias de dois:
SHR MOV SHR SI,1 CL,4 VARIAVEL,CL ;divide por 2 ;divide por 16
Operao: A instruo SAR desloca o primeiro operando para a direita, sendo o nmero de posies especificado pelo segundo operando. A cada deslocamento o bit menos significativo colocado no flag de "vai um" e o bit mais significativo no alterado:
Flags Afetados CF PF, SF e ZF AF OF Comentrios e Exemplos Como as demais instrues de deslocamento e rotao, a instruo SAR aceita um segundo operando constante (somente 1) ou varivel (somente CL). ltimo bit deslocado para fora correspondem ao resultado final indefinido desativado se o segundo operando for 1, indefinido no caso contrario.
Pgina 44
Programao Assembler no PC-IBM e Compatveis importante notar que a instruo SAR DIFERENTE de SHR; a primeira reproduz o bit mais significativo original e a segunda preenche com zero os bits mais significativos. Um uso bastante frequente de SAR para efetuar a diviso de nmeros com sinal por potncias de dois:
SAR MOV SAR SI,1 CL,4 VARIAVEL,CL ;divide por 2 ;divide por 16
Operao: A instruo ROL roda o primeiro operando para a esquerda, sendo o nmero de posies especificado pelo segundo operando. A cada deslocamento o bit mais significativo colocado no flag de "vai um" e no bit menos significativo:
Flags Afetados CF PF, SF e ZF AF OF ltimo bit rodado do bit mais significativo para o menos. correspondem ao resultado final indefinido se o segundo operando for 1, OF ser ativado se o bit mais significativo do resultado for diferente do original. Se o segundo operando no for 1, OF fica indefinido.
Comentrios e Exemplos Como as demais instrues de deslocamento e rotao, a instruo ROL aceita um segundo operando constante (somente 1) ou varivel (somente CL). No confundir esta instruo com RCL, na qual o flag de "vai um" tambm rodado. Exemplos:
Pgina 45
Operao: A instruo ROR roda o primeiro operando para a direita, sendo o nmero de posies especificado pelo segundo operando. A cada deslocamento o bit menos significativo colocado no flag de "vai um" e no bit mais significativo:
Flags Afetados CF PF, SF e ZF AF OF ltimo bit rodado do bit menos significativo para o mais. correspondem ao resultado final indefinido se o segundo operando for 1, OF ser ativado se o bit mais significativo do resultado for diferente do original. Se o segundo operando no for 1, OF fica indefinido.
Comentrios e Exemplos Como as demais instrues de deslocamento e rotao, a instruo ROR aceita um segundo operando constante (somente 1) ou varivel (somente CL). No confundir esta instruo com RCR, na qual o flag de "vai um" tambm rodado. Exemplos:
ROR ROR AX,1 VARIAVEL,CL
Pgina 46
Programao Assembler no PC-IBM e Compatveis RCL - Rotao atravs do "Carry" para a Esquerda Codificao:
RCL RCL RCL RCL reg,1 reg,CL mem,1 mem,CL
Operao: A instruo RCL roda o primeiro operando para a esquerda, sendo o nmero de posies especificado pelo segundo operando. A cada deslocamento o bit mais significativo colocado no flag de "vai um" e o valor anterior do flag de "vai um" no bit menos significativo:
Flags Afetados CF PF, SF e ZF AF OF ltimo bit rodado do bit mais significativo correspondem ao resultado final indefinido se o segundo operando for 1, OF ser ativado se o bit mais significativo do resultado for diferente do original. Se o segundo operando no for 1, OF fica indefinido.
Comentrios e Exemplos Como as demais instrues de deslocamento e rotao, a instruo RCL aceita um segundo operando constante (somente 1) ou varivel (somente CL). No confundir esta instruo com ROL, na qual o flag de "vai um" no rodado. Exemplos:
RCL RCL AX,1 VARIAVEL,CL
Pgina 47
Operao: A instruo RCR roda o primeiro operando para a direita sendo o nmero de posies especificado pelo segundo operando. A cada deslocamento o bit menos significativo colocado no flag de "vai um" e no bit mais significativo:
Flags Afetados CF PF, SF e ZF AF OF ltimo bit rodado do bit menos significativo correspondem ao resultado final indefinido se o segundo operando for 1, OF ser ativado se o bit mais significativo do resultado for diferente do original. Se o segundo operando no for 1, OF fica indefinido.
Comentrios e Exemplos Como as demais instrues de deslocamento e rotao, a instruo RCR aceita um segundo operando constante (somente 1) ou varivel (somente CL). No confundir esta instruo com ROR, na qual o flag de "vai um" no rodado. Exemplos:
RCR RCR AX,1 VARIAVEL,CL
Operao: A instruo AND efetua o "E" lgico dos dois operandos (bit a bit), colocando o resultado no primeiro deles. 1986, Daniel Quadros Pgina 48
Programao Assembler no PC-IBM e Compatveis Flags Afetados PF, SF e ZF CF e OF AF Comentrios e Exemplos A instruo AND normalmente utilizada para isolar (ou zerar) determinados bits de um nmero, visto que um bit sera "1" no resultado somente se for "1" em ambos os operandos. Por exemplo:
AND BP,1000000000000001B
"isola" os bits mais e menos signficativos de BP, zerando os demais. Um outro uso para obter o resto da diviso de um nmero por uma potncia de dois. Para obter o resto da diviso de um nmero por 2^N fazemos um AND com 2^N-1:
AND VALOR,7
Operao: A instruo TEST efetua o "E" lgico dos dois operandos (bit a bit) e posiciona os flags de acordo com o resultado, sem alterar os operandos. Flags Afetados PF, SF e ZF CF e OF AF correspondem ao resultado desativados indefinido
Pgina 49
Programao Assembler no PC-IBM e Compatveis Comentrios e Exemplos A instruo TEST normalmente utilizada para testar um ou mais bits de um valor. No se deve confundir TEST com CMP; na TEST verifica-se se todos os bits que so "1" no segundo operando so "0" no primeiro; na CMP verifica-se se todos os bits dos dois operandos so iguais:
TEST AX,3
deixar ativo o flag Z se os dois bits menos significativos de AX forem "0", independente dos demais bits;
CMP AX,3
deixar ativo o flag Z se os dois bits menos significativos de AX forem "1" e os demais "0". Outros exemplos:
TEST TEST TEST CX,DX MATRIX[BX],SP SI,VARIAVEL
Operao: A instruo OR efetua o "OU" lgico dos dois operandos (bit a bit), colocando o resultado no primeiro deles. Flags Afetados PF, SF e ZF CF e OF AF Comentrios e Exemplos A instruo OR normalmente utilizada para ativar determinados bits de um nmero, visto que um bit ser "1" no resultado se for "1" em pelo menos um dos operandos. Por exemplo:
OR BP,1000000000000001B
Pgina 50
Programao Assembler no PC-IBM e Compatveis Uma vez que o "OU" de um nmero com ele mesmo no o altera, comum fazer OR de um registrador com ele mesmo para posicionar os flags PF, SF e ZF de acordo com o seu contedo (o mesmo resultado pode ser obtido atravs da operao AND, o que menos comum). Outros exemplos:
OR OR OR CX,DX MATRIX[BX],SP SI,VARIAVEL
Operao: A instruo XOR efetua o "OU Exclusivo" dos dois operandos (bit a bit), colocando o resultado no primeiro deles. Flags Afetados PF, SF e ZF CF e OF AF Comentrios e Exemplos A instruo XOR normalmente utilizada para inverter determinados bits de um nmero, visto que um bit ser "1" no resultado somente se for "1" em apenas um dos operandos. Por exemplo:
XOR BP,1000000000000001B
inverte os bits mais e menos significativos de BP, sem afetar os demais. Uma vez que o "OU exlusivo" de um nmero com ele mesmo resulta em zero, comum fazer XOR de um registrador com ele mesmo para zer-lo (o mesmo resultado pode ser obtido atravs da operao SUB, o que menos comum). Outros exemplos:
XOR XOR XOR CX,DX MATRIX[BX],SP SI,VARIAVEL
Pgina 51
Operao: A instruo IN l um byte ou word de um dispositivo, colocando-o no acumulador (AL ou AX). Flags Afetados Nenhum Comentrios e Exemplos Em primeiro lugar, deve-se notar que a instruo IN capaz de ler um byte ou um word, o que determinado pelo primeiro operando (AL ou AX). O uso de outros registradores no permitido. Em segundo lugar, o endereo do dispositivo ("port") pode ser constante (0 a 255) ou varivel (em DX, 0 a 65535). Exemplos:
IN IN IN IN AL,30H AL,DX AX,30H AX,DX
Operao: A instruo OUT escreve um byte (contido em AL) ou word (contido em AX) em um dispositivo. Flags Afetados Nenhum Comentrios e Exemplos
Pgina 52
Programao Assembler no PC-IBM e Compatveis Em primeiro lugar, deve-se notar que a instruo OUT capaz de escrever um byte ou um word, o que determinado pelo segundo operando (AL ou AX). O uso de outros registradores no permitido. Em segundo lugar, o endereo do dispositivo ("port") pode ser constante (0 a 255) ou varivel (em DX, 0 a 65535). Exemplos:
OUT OUT OUT OUT AL,30H AL,DX AX,30H AX,DX
3.6
As instrues de manipulao de cadeias (strings) podem ser divididas em dois grupos: PRIMITIVAS, que operam sobre uma posio da cadeia e avanam (ou recuam) o ponteiro para a posio seguinte (ou anterior). PREFIXOS de REPETIO, que permitem repetir uma primitiva enquanto o flag Z mantm um certo estado e CX diferente de zero. A seleo de avano ou recuo de ponteiros pelas primitivas feito atravs do flag DF (ver instrues CLD e STD). O erro mais comum no uso das instrues de manipulao de cadeias o posicionamento errado deste flag quando da execuo da instruo. Os prefixos de repetio so semelhantes aos prefixos de alterao de segmento ("segment override"). Cuidado deve ser tomado quando do uso conjunto dos dois prefixos; em caso da ocorrncia de uma interrupo um dos dois prefixos ser "esquecido" pelo processador, causando funcionamento incorreto da instruo. REP - Repete Primitiva enquanto CX <> 0 Codificao:
REP primitiva
Operao: Enquanto CX for diferente de zero a primitiva executada e CX decrementado. Flags Afetados Os flags no so afetados pelo prefixo REP, mas sim pela primitiva sendo repetida. Comentrios Se CX for igual a zero a primitiva no ser executada. O prefixo REP utilizado em conjunto com as primitivas MOVS, STOS e LODS; com as primitivas SCAS e CMPS utilizam-se os prefixos REPZ, REPNZ, REPE e REPNE. 1986, Daniel Quadros Pgina 53
Programao Assembler no PC-IBM e Compatveis REPZ / REPE - Repete Primitiva enquanto Igual Codificao:
REPZ REPE primitiva primitiva
Operao: Enquanto CX for diferente de zero CX decrementado e a primitiva executada. Caso o flag Z fique inativo (Z=0) aps a execuo da primitiva, a repetio interrompida. Flags Afetados Os flags no so afetados pelos prefixos REPE e REPZ, mas sim pela primitiva sendo repetida. Comentrios e Exemplos Se CX for igual a zero a primitiva no ser executada; caso contrrio ela ser executada pelo menos uma vez. Os mnemnicos REPZ e REPE correspondem ao mesmo prefixo, sendo utilizados com as primitivas SCAS e CMPS. Uma vez que CX decrementado antes do teste do flag Z e as primitivas SCAS e CMPS avanam (ou recuam) os ponteiros aps a execuo da comparao, ao final da repetio teremos: Se Z = 1: no foi encontrado elemento na cadeia que resultasse em Z=0; CX contm zero e os ponteiros apontam para a posio seguinte ao final das cadeias. Se Z = 0: foi encontrado elemento na cadeia que resultou em Z=0; CX e os ponteiros correspondem posio seguinte a este elemento. Exemplo:
MOV REPE JZ AL,0 SCASB TUDO_ZERO
Operao: Enquanto CX for diferente de zero CX decrementado e a primitiva executada. Caso o flag Z fique ativo (Z=1) aps a execuo da primitiva, a repetio interrompida. Flags Afetados Os flags no so afetados pelos prefixos REPNE e REPNZ, mas sim pela primitiva sendo repetida. 1986, Daniel Quadros Pgina 54
Programao Assembler no PC-IBM e Compatveis Comentrios e Exemplos Se CX for igual a zero a primitiva no ser executada; caso contrrio ela ser executada pelo menos uma vez. Os mnemnicos REPNZ e REPNE correspondem ao mesmo prefixo, sendo utilizados com as primitivas SCAS e CMPS. Uma vez que CX decrementado antes do teste do flag Z e as primitivas SCAS e CMPS avanam (ou recuam) os ponteiros aps a execuo da comparao, ao final da repetio teremos: Se Z = 0: no foi encontrado elemento na cadeia que resultasse em Z=1; CX contem zero e os ponteiros apontam para a posio seguinte ao final das cadeias. Se Z = 1: foi encontrado elemento na cadeia que resultou em Z=1; CX e os ponteiros correspondem posio seguinte a este elemento. Exemplo:
MOV REPNE JZ AL,0 SCASB ACHOU_ZERO
Operao: Se operando for BYTE carrega em AL o byte apontado por SI se DF = 0 soma 1 a SI se DF = 1 subtrai 1 de SI Se operando for WORD carrega em AX o word apontado por SI se DF = 0 soma 2 a SI se DF = 1 subtrai 2 de SI Flags Afetados Nenhum
Pgina 55
Programao Assembler no PC-IBM e Compatveis Comentrios e Exemplos O operando da instruo utilizado pelo Assembler para determinar o tipo (byte ou word) e verificar se ele acessvel com os contedos indicados para os registradores de segmentos (via ASSUME). As formas LODSB e LODSW permitem especificar explicitamente o tipo do operando, que considerado acessvel. Notar que sempre so utilizados os registradores AL (ou AX) e SI. O registrador de segmento utilizado DS, sendo permitida a sua alterao via "segment override". STOS / STOSB / STOSW - Coloca Elemento em Cadeia Codificao:
STOS mem STOSB STOSW
Operao: Se operando for BYTE coloca o contedo de AL no byte apontado por ES:DI se DF = 0 soma 1 a DI se DF = 1 subtrai 1 de DI Se operando for WORD coloca o conteudo de AX No word apontado por ES:DI se DF = 0 soma 2 a DI se DF = 1 subtrai 2 de DI Flags Afetados Nenhum Comentrios e Exemplos O operando da instruo utilizado pelo Assembler para determinar o tipo (byte ou word) e verificar se ele acessvel com os contedos indicados para ES (via ASSUME). As formas STOSB e STOSW permitem especificar explicitamente o tipo do operando, que considerado acessvel. Notar que sempre so utilizados os registradores AL (ou AX) ,SI e ES. No permitido o uso de "segment override". Por exemplo, a rotina abaixo causa o preenchimento de 80 words, a partir do endereo 50H:50H com o valor 0050H (isto , primeiro byte com 50H e segundo com 0).
Pgina 56
Operao: Se operando for BYTE copia o byte apontado por SI para ES:DI se DF = 0 soma 1 a DI se DF = 1 subtrai 1 de DI Se operando for WORD copia o word apontado por SI para ES:DI se DF = 0 soma 2 a DI se DF = 1 subtrai 2 de DI Flags Afetados Nenhum Comentrios e Exemplos O operando da instruo utilizado pelo Assembler para determinar o tipo (byte ou word) e verificar se ele acessvel com os contedos indicados para os registradores de segmentos (via ASSUME). As formas MOVSB e MOVSW permitem especificar explicitamente o tipo do operando, que considerado acessvel. Notar que sempre so utilizados os registradores SI, DI e ES. O registrador de segmento utilizado para a origem DS, sendo permitida a sua alterao via "segment override"; para o destino, sempre utilizado ES. Por exemplo, podemos mover 20 bytes de AREA1 para AREA2 da seguinte forma (supondo DS e ES corretos):
CLD MOV MOV MOV REP ;seleciona incremento ;deslocamento origem ;deslocamento destino ;nmero de bytes ;copia
Pgina 57
Programao Assembler no PC-IBM e Compatveis SCAS / SCASB / SCASW - Percorre Cadeia Codificao:
SCAS SCASB SCASW mem
Operao: Se operando for BYTE posiciona os flags para resultado da subtrao AL - (byte apontado por ES:DI) se DF = 0 soma 1 a DI se DF = 1 subtrai 1 de DI Se operando for WORD posiciona os flags para resultado da subtrao AX - (word apontado por ES:DI) se DF = 0 soma 2 a DI se DF = 1 subtrai 2 de DI Flags Afetados AF, CF, OF, PF, SF e ZF Comentrios e Exemplos O operando da instruo utilizado pelo Assembler para determinar o tipo (byte ou word) e verificar se ele acessvel com os contedos indicados para ES (via ASSUME). As formas SCASB e SCASW permitem especificar explicitamente o tipo do operando. Notar que sempre so utilizados os registradores AL (ou AX), DI e ES. No permitido o "segment override". Lembrar que ao final o flag Z (e no CX) quem indica se foi encontrada a condio desejada (que o contrrio da codificada no REP); e se sim ES:DI aponta para o elemento SEGUINTE:
CLD REPE SCASB
avana DI enquanto ES:DI apontar para um byte com contedo igual ao de AL e CX for diferente de zero;
CLD REPNE
SCASB
avana DI enquanto ES:DI apontar para um byte com contedo diferente ao de AL e CX for diferente de zero.
Pgina 58
Programao Assembler no PC-IBM e Compatveis CMPS / CMPSB / CMPSW - Compara Cadeias Codificao:
CMPS CMPSB CMPSW mem,mem
Operao: Se operando for BYTE posiciona os flags para resultado da subtrao (byte apontado por SI) - (byte apontado por ES:DI) se DF = 0 soma 1 a DI se DF = 1 subtrai 1 de DI Se operando for WORD posiciona os flags para resultado da subtrao (word apontado por SI) - (word apontado por ES:DI) se DF = 0 soma 2 a DI se DF = 1 subtrai 2 de DI Flags Afetados AF, CF, OF, PF, SF e ZF Comentrios e Exemplos O operando da instruo utilizado pelo Assembler para determinar o tipo (byte ou word) e verificar se ele acessvel. As formas CMPSB e CMPSW permitem especificar explicitamente o tipo do operando. Notar que sempre so utilizados os registradores SI, DI e ES. permitido o "segment override" para alterar o segmento da cadeia apontada por SI. Lembrar que ao final o flag Z (e no CX) quem indica se foi encontrada a condio desejada (que o contrrio da codificada no REP); e se sim ES:DI e SI apontam para os elementos SEGUINTES:
CLD CMPSB
REPE
avana SI e DI enquanto DS:SI ES:DI apontarem para bytes com contedos iguais e CX for diferente de zero;
REPNE CLD CMPSB
avana SI e DI enquanto DS:SI e ES:DI apontarem para bytes com contedos diferentes e CX no for zero. 1986, Daniel Quadros Pgina 59
As instrues de desvio podem ser agrupadas da seguinte forma: A) Desvio incondicional (JMP) ou condicional (JE/JZ, etc.), B) Chamada a sub-rotina (CALL), sempre incondicional, C) Chamada a interrupo de software, incondicional (INT) ou condicional (INTO) e D) Retorno de sub-rotina (RET) ou de interrupo (IRET) No grupo "C" o endereo destino obtido do vetor de interrupo; no grupo "D" da pilha. J nos grupos "A" e "B", podemos ter: 1) Desvios diretos, em que o endereo destino est na prpria instruo, ocupando a) Um byte - desvio CURTO ("short") - armazenando a distncia (-128 a +127) entre o byte seguinte ao desvio e o endereo destino, ou b) Dois bytes - desvio INTRASEGMENTO ("near") - armazenando a distncia entre o byte seguinte ao desvio e o endereo destino, ou ainda c) Quatro bytes - desvio INTERSEGMENTO ("far") - armazenando o deslocamento e o segmento do endereo destino. 2) Desvios indiretos, em que o endereo destino obtido de a) Um registrador - desvio intrasegmento, ou b) Uma varivel do tipo word - tambm desvio intrasegmento, ou c) Uma varivel do tipo dword - desvio intersegmento. O desvio incondicional permite todas estas combinaes; o desvio condicional somente o desvio curto ("short", sempre direto) e o desvio para sub-rotina todas exceto o desvio curto. importante notar a falta de instrues condicionais de chamada e retorno. JMP - desvio incondicional Codificao:
JMP JMP JMP rtulo reg mem
Operao: Antes do desvio propriamente dito, IP atualizado para a instruo seguinte (da as distncias mencionadas abaixo serem em relao ao byte seguinte ao JMP). O desvio se processa da seguinte forma: 1 - desvio direto Pgina 60
Programao Assembler no PC-IBM e Compatveis a) curto - a distncia somada a IP b) intrasegmento - a distncia somada a IP c) intersegmento - CS e IP recebem os valores contidos na instruo 2 - desvio indireto a) intrasegmento - IP recebe o valor contido no operando b) intersegmento - CS e IP recebem os valores contidos no operando Flags Afetados Nenhum Comentrios e Exemplos O tipo de desvio determinado pelo tipo do operando: Operando Registrador varivel Word varivel dword rtulo "near" rtulo "far" desvio indireto intrasegmento indireto intrasegmento indireto intersegmento direto intrasegmento/curto * direto intersegmento
A seleo entre desvio direto intrasegmento e desvio direto curto (*) controlada pelo programador (atravs do atributo SHORT) e pelo Assembler: se o desvio feito para um rtulo anterior instruo de desvio, o Assembler determina automaticamente se possvel utilizar um desvio curto; se o desvio feito para um rtulo frente, o Assembler reserva espao para um desvio intrasegmento (3 bytes). Se posteriormente verificar que era possvel o uso de desvio curto, a posio extra preenchida com uma instruo "NOP". Vejamos alguns exemplos:
END_NEAR DW END_FAR DD ROT_NEAR LABEL ROT_FAR LABEL XIS: JMP JMP JMP JMP JMP MOV JMP MOV ? ? NEAR FAR ROT_NEAR ROT_FAR END_NEAR END_FAR XIS ;varivel tipo WORD ;varivel tipo DWORD ;rtulo NEAR ;rtulo FAR ;direto, intrasegmento ;direto, intersegmento ;indireto, intrasegmento ;indireto, intersegmento ;curto, pois XIS est a menos de 128 bytes
Pgina 61
Operao: Se ZF = 1, soma a IP a distncia (-128 a +127, contida na instruo) entre o operando e a instruo seguinte. Flags Afetados Nenhum Comentrios O mnemnico JE corresponde a "desvio se igual" e normalmente utilizado aps uma instruo CMP; JZ significa "desvio se zero" e normalmente utilizado aps uma instruo aritmtica ou lgica. Os dois mnemnicos correspondem mesma instruo. JNE/JNZ - Desvia se no Zero Codificao:
JNE JNZ rtulo rtulo
Operao: Se ZF = 0, soma a IP a distncia (-128 a +127, contida na instruo) entre o operando e a instruo seguinte. Flags Afetados Nenhum Comentrios O mnemnico JNE corresponde a "desvio se diferente" e normalmente utilizado aps uma instruo CMP; JNZ significa "desvio se no zero" e normalmente utilizado aps uma instruo aritmtica ou lgica. Os dois mnemnicos correspondem mesma instruo. JB/JNAE - Desvia se Abaixo Codificao:
JB JNAE rtulo rtulo
Pgina 62
Programao Assembler no PC-IBM e Compatveis Operao: Se CF = 1, soma a IP a distncia (-128 a +127, contida na instruo) entre o operando e a instruo seguinte. Flags Afetados Nenhum Comentrios Os mnemnicos JB ("desvio se abaixo") e JNAE ("desvio se no acima ou igual") correspondem mesma instruo, sendo normalmente utilizados aps uma comparao entre nmeros SEM sinal. JNB/JAE - Desvia se no Abaixo Codificao:
JNB JAE rtulo rtulo
Operao: Se CF = 0, soma a IP a distncia (-128 a +127, contida na instruo) entre o operando e a instruo seguinte. Flags Afetados Nenhum Comentrios Os mnemnicos JNB ("desvio se no abaixo") e JAE ("desvio se acima ou igual") correspondem mesma instruo, sendo normalmente utilizados aps uma comparao entre nmeros SEM sinal. JA/JNBE - Desvia se Acima Codificao:
J JNBE rtulo rtulo
Operao: Se ZF=0 e CF=0, soma a IP a distncia (-128 a +127, contida na instruo) entre o operando e a instruo seguinte. Flags Afetados Nenhum Comentrios Os mnemnicos JA ("desvio se acima") e JNBE ("desvio se no abaixo ou igual") correspondem mesma instruo, sendo normalmente utilizados aps uma comparao entre nmeros SEM sinal. 1986, Daniel Quadros Pgina 63
Operao: Se ZF=1 ou CF=1, soma a IP a distncia (-128 a +127, contida na instruo) entre o operando e a instruo seguinte. Flags Afetados Nenhum Comentrios Os mnemnicos JNA ("desvio se no acima") e JBE ("desvio se abaixo ou igual") correspondem mesma instruo, sendo normalmente utilizados aps uma comparao entre nmeros SEM sinal. JL/JNGE - Desvia se Menor Codificao:
JL JNGE rtulo rtulo
Operao: Se SF<>OF, soma a IP a distncia (-128 a +127, contida na instruo) entre o operando e a instruo seguinte. Flags Afetados Nenhum Comentrios Os mnemnicos JL ("desvio se menor") e JNGE ("desvio se no maior ou igual") correspondem mesma instruo, sendo normalmente utilizados aps uma comparao entre nmeros COM sinal. JNL/JGE - Desvia se no Menor Codificao:
JNL JGE rtulo rtulo
Operao: Se SF=OF, soma a IP a distncia (-128 a +127, contida na instruo) entre o operando e a instruo seguinte. Flags Afetados 1986, Daniel Quadros Pgina 64
Programao Assembler no PC-IBM e Compatveis Nenhum Comentrios Os mnemnicos JNL ("desvio se no menor") e JGE ("desvio se maior ou igual") correspondem mesma instruo, sendo normalmente utilizados aps uma comparao entre nmeros COM sinal. JG/JNLE - Desvia se Maior Codificao:
JG JNLE rtulo rtulo
Operao: Se ZF=0 e SF=OF, soma a IP a distncia (-128 a +127, contida na instruo) entre o operando e a instruo seguinte. Flags Afetados Nenhum Comentrios Os mnemnicos JG ("desvio se maior") e JNLE ("desvio se no menor ou igual") correspondem mesma instruo, sendo normalmente utilizados aps uma comparao entre nmeros COM sinal. JNG/JLE - Desvia se no Maior Codificao:
JNG JLE rtulo rtulo
Operao: Se ZF=1 ou SF<>OF, soma a IP a distncia (-128 a +127, contida na instruo) entre o operando e a instruo seguinte. Flags Afetados Nenhum Comentrios Os mnemnicos JNG ("desvio se no maior") e JLE ("desvio se menor ou igual") correspondem mesma instruo, sendo normalmente utilizados aps uma comparao entre nmeros COM sinal.
Pgina 65
Operao: Se PF = 1, soma a IP a distncia (-128 a +127, contida na instruo) entre o operando e a instruo seguinte. Flags Afetados Nenhum Comentrios Os mnemnicos JP e JPE correspondem mesma instruo, sendo normalmente utilizados para testar se o resultado da ltima operao tem paridade PAR. JNP/JPO - Desvia se Paridade Impar Codificao:
JNP JPO rtulo rtulo
Operao: Se PF = 0, soma a IP a distncia (-128 a +127, contida na instruo) entre o operando e a instruo seguinte. Flags Afetados Nenhum Comentrios Os mnemnicos JNP e JPO correspondem mesma instruo sendo normalmente utilizados para testar se o resultado da ltima operao tem paridade IMPAR. JS - Desvia se Negativo Codificao:
JS rtulo
Operao: Se SF = 1, soma a IP a distncia (-128 a +127, contida na instruo) entre o operando e a instruo seguinte. Flags Afetados
Pgina 66
Programao Assembler no PC-IBM e Compatveis Nenhum Comentrios A instruo JS normalmente utilizada para verificar se a ltima operao teve um resultado NEGATIVO. JNS - Desvia se Positivo Codificao:
JNS rtulo
Operao: Se SF = 0, soma a IP a distncia (-128 a +127, contida na instruo) entre o operando e a instruo seguinte. Flags Afetados Nenhum Comentrios A instruo JNS normalmente usada para testar se o resultado da ltima operao POSITIVO. JO - Desvia se "Overflow" Codificao:
JO rtulo
Operao: Se OF = 1, soma a IP a distncia (-128 a +127, contida na instruo) entre o operando e a instruo seguinte. Flags Afetados Nenhum Comentrios A instruo JO normalmente utilizada para testar se a ltima operao resultou em "estouro" (overflow). JNO - Desvia se no "Overflow" Codificao:
JNO rtulo
Operao:
Pgina 67
Programao Assembler no PC-IBM e Compatveis Se OF = 0, soma a IP a distncia (-128 a +127, contida na instruo) entre o operando e a instruo seguinte. Flags Afetados Nenhum Comentrios A instruo JNO normalmente utilizada para verificar se a ltima operao no resultou em "estouro" (overflow). JCXZ - Desvia se CX = 0 Codificao:
JCXZ rtulo
Operao: Se CX=0, soma a IP a distncia (-128 a +127, contida na instruo) entre o operando e a instruo seguinte. Flags Afetados Nenhum Comentrios e Exemplos A instruo JCXZ permite testar CX diretamente, sem a necessidade de uma operao aritmtica ou lgica. frequentemente utilizada para evitar a entrada em um lao ou repetio com contagem zero:
MOV JCXZ LACO: ; ... LOOP LACO ; se CX fosse zero repetiria 65536 vezes ! CX,CONTAGEM CONT_ZERO
Operao: CX decrementado; se o novo valor no for zero, a distncia (-128 a +127, na prpria instruo) entre a instruo seguinte e o rtulo destino somada a IP. Flags Afetados Nenhum
Pgina 68
Programao Assembler no PC-IBM e Compatveis Comentrios e Exemplos A instruo LOOP decrementa CX e efetua um desvio curto se CX no chegou a zero. normalmente utilizada para repetir um trecho um certo nmero de vezes:
MOV LACO: ; trecho a ser repetido LOOP LACO CX,N_REPETICOES
Notar que a instruo LOOP no afeta os flags, apesar de envolver um decremento. Se CX contem inicialmente zero, o trecho repetido 65536 vezes. LOOPZ/LOOPE - Repete at CX=0 ou Z=0 Codificao:
LOOPZ LOOPE rtulo rtulo
Operao: CX decrementado; se o novo valor no for zero e o flag Z estiver ativo, a distncia (-128 a +127, na prpria instruo) entre a instruo seguinte e o rtulo destino somada a IP. Flags Afetados Nenhum Comentrios e Exemplos A instruo LOOPZ (ou LOOPE) decrementa CX e efetua um desvio curto se CX no chegou a zero e o flag Z est ativo. normalmente utilizada para repetir um trecho, no mximo um certo nmero de vezes, enquanto uma condio atendida:
MOV LACO: ; trecho a ser repetido CMP AL,1 ; teste da condio LOOPE LACO ; repete enquanto CX>0 e AL=1 ; neste ponto AL <> 1 ou CX = 0 CX,N_MAXIMO
Notar que a instruo LOOPZ/LOOPE no afeta os flags, apesar de envolver um decremento. Se CX contem inicialmente zero, o trecho repetido at 65536 vezes. LOOPNZ/LOOPNE - Repete at CX=0 ou Z=1 Codificao:
LOOPNZ rtulo LOOPNE rtulo
Pgina 69
Programao Assembler no PC-IBM e Compatveis Operao: CX decrementado; se o novo valor no for zero e o flag Z estiver inativo, a distncia (-128 a +127, na prpria instruo) entre a instruo seguinte e o rtulo destino somada a IP. Flags Afetados Nenhum Comentrios e Exemplos A instruo LOOPNZ (ou LOOPNE) decrementa CX e efetua um desvio curto se CX no chegou a zero e o flag Z est inativo. normalmente utilizada para repetir um trecho, no mximo um certo nmero de vezes, enquanto uma condio atendida:
MOV LACO: ; trecho a ser repetido CMP AL,1 ; teste da condio LOOPNE LACO ; repete enquanto CX>0 e AL<>1 ; neste ponto AL = 1 ou CX = 0 CX,N_MAXIMO
Notar que a instruo LOOPNZ/LOOPNE no afeta os flags, apesar de envolver um decremento. Se CX contem inicialmente zero, o trecho repetido at 65536 vezes. CALL - Chamada a Subrotina Codificao:
CALL CALL CALL rtulo reg mem
Operao: Antes da execuo da chamada propriamente dita, IP atualizado para apontar para a instruo seguinte. As aes seguintes dependem do tipo de chamada: Chamada direta intrasegmento subtrai 2 de SP coloca o contedo de IP em SS:SP soma a IP a distncia (contida na prpria instruo) entre o destino e a instruo seguinte subtrai 2 de SP coloca o contedo de CS em SS:SP subtrai 2 de SP coloca o contedo de IP em SS:SP carrega CS e IP com o endereo destino (contido na instruo) 1986, Daniel Quadros Pgina 70
intersegmento
Programao Assembler no PC-IBM e Compatveis Chamada indireta intrasegmento Flags Afetados Nenhum Comentrios e Exemplos O tipo de chamada determinado pelo operando: operando rtulo near rotlo far registrador varivel word varivel dword Alguns exemplos:
END_NEAR DW END_FAR DD ROT_NEAR LABEL ROT_FAR LABEL CALL CALL CALL CALL MOV CALL MOV MOV CALL ? ? NEAR FAR ROT_NEAR ROT_FAR END_NEAR END_FAR ;varivel tipo WORD ;varivel tipo DWORD ;rotina NEAR ;rotina FAR ;direta, intrasegmento ;direta, intersegmento ;indireta, intrasegmento ;indireta, intersegmento
subtrai 2 de SP coloca o contedo de IP em SS:SP carrega IP com o contedo do operando subtrai 2 de SP coloca o contedo de CS em SS:SP subtrai 2 de SP coloca o contedo de IP em SS:SP carrega CS e IP com o contedo do operando
intersegmento
Chamada direta intrasegmento direta intersegmento indireta intrasegmento indireta intrasegmento indireta intersegmento
AX,OFFSET ROT_NEAR AX ;indireta, intrasegmento, chama ROT_NEAR END_NEAR,OFFSET ROT_NEAR BX,OFFSET END_NEAR [BX] ;"duplamente" indireta, intrasegmento, ; chama ROT_NEAR
Pgina 71
imed
Operao: Retorna de uma subrotina, atravs dos seguintes passos: 1. Carrega IP com SS:SP, soma 2 a SP 2. Se retorno intersegmento, carrega CS com SS:SP, soma 2 a SP 3. Se foi especificado valor imediato, soma-o a SP Flags Afetados Nenhum Comentrios e Exemplos O tipo de retorno (intra ou intersegmento) determinado pelo par mais interno de diretivas PROC/ENDP que cercam a instruo RET. Se o RET estiver fora de um par PROC/ENDP ele ser um RET intrasegmento. Notar que vital o "casamento" do tipo do CALL com o tipo do RET para a correta restaurao de CS, IP e SP. A possibilidade de incluir um valor a ser somado a SP permite retirar da pilha parmetros colocados por quem chamou a rotina:
; Programa Principal PUSH PAR_1 PUSH PAR_2 CALL ROTINA ; Subrotina PROC NEAR MOV BP,SP MOV AX,[BP+2] MOV BX,[BP+4] ; ... RET 4 ENDP
ROTINA
ROTINA
Operao: Gera uma interrupo de software, atravs dos seguintes passos: Pgina 72
Programao Assembler no PC-IBM e Compatveis 1. Avana IP para a prxima instruo 2. Subtrai 2 de SP e coloca os flags em SS:SP 3. Desativa os flags IF e TF 4. Subtrai 2 de SP e coloca CS em SS:SP 5. Subtrai 2 de SP e coloca IP em SS:SP 6. Executa um desvio indireto intersegmento, obtendo o endereo destino do doubleword de endereo "fsico" 4 * nmero da interrupo. Flags Afetados IF e TF Comentrios e Exemplos A instruo INT um tipo especial de desvio indireto intersegmento, sendo normalmente utilizado para passar o controle entre mdulos (por exemplo, para um programa aplicativo requisitar um servio ao sistema operacional). Ao se escrever rotinas que sero chamadas atravs de INT, no se deve esquecer que a interrupo inibida e os flags originais so colocados na pilha. Por estes motivos, normalmente estas rotinas so iniciadas por uma instruo STI (habilita interrupes) e finalizadas por uma instruo IRET (retorna restaurando os flags). Finalmente, lembrar que existem 256 interrupes possveis, de 0 a 0FFH. INTO - Gera Interrupo se Overflow Codificao:
INTO
Operao: Se OF estiver ativo, gera uma interrupo de software, atravs dos seguintes passos: 1. Avana IP para a prxima instruo 2. Subtrai 2 de SP e coloca os flags em SS:SP 3. Desativa os flags IF e TF 4. Subtrai 2 de SP e coloca CS em SS:SP 5. Subtrai 2 de SP e coloca IP em SS:SP 6. Executa um desvio indireto intersegmento, obtendo o endereo destino do doubleword de endereo "fsico" 00010H Flags Afetados IF e TF
Pgina 73
Programao Assembler no PC-IBM e Compatveis Comentrios e Exemplos A instruo INTO se destina a facilitar a deteco de erros aritmticos em programas, sendo normalmente executada apos uma operao sobre nmeros com sinal. Caso o resultado no caiba no destino, OF ser ativado e, consequentemente, chamada uma rotina. Esta rotina pode, por exemplo, fornecer o endereo de programa em que ocorreu o erro, o contedo dos registradores, etc. Ao se escrever uma rotina que ser chamada atravs de INTO, no se deve esquecer que a interrupo inibida e os flags originais so colocados na pilha. Por estes motivos, normalmente esta rotina iniciada por uma instruo STI (habilita interrupes) e finalizada por uma instruo IRET (que retorna restaurando os flags). IRET - Retorno de Interrupo Codificao:
IRET
Operao: Retorna de uma interrupo, atravs dos seguintes passos: 1. Carrega IP com SS:SP, soma 2 a SP 2. Carrega CS com SS:SP, soma 2 a SP 3. Carrega Flags com SS:SP, soma 2 a SP Flags Afetados Todos Comentrios e Exemplos A instruo IRET efetua um retorno intersegmento, restaurando da pilha o contedo dos flags. A pilha deve conter, em ordem de endereo crescente, IP CS e flags (que a ordem obtida atravs de interrupes de hardware e software). Notar que IRET e POPF so as nicas instrues capazes de alterar TF.
Pgina 74
Operao: Desativa o flag CF ("vai um"). Flags Afetados CF CMC - Complementa Flag de "Vai Um" Codificao:
CMC
Operao: Complementa o flag CF ("vai um"), isto , ativa-o se estiver desativado e vice-versa. Flags Afetados CF STC - Ativa Flag de "Vai Um" Codificao:
STC
Operao: Ativa o flag CF ("vai um"). Flags Afetados CF CLD - Desativa Flag de Direo Codificao:
CLD
Pgina 75
Programao Assembler no PC-IBM e Compatveis Flags Afetados DF Comentrio A instruo CLD seleciona o INCREMENTO de ponteiros nas instrues de manipulao de cadeias. STD - Ativa Flag de Direo Codificao:
STD
Operao: Ativa o flag de direo (DF). Flags Afetados DF Comentrio A instruo STD seleciona o DECREMENTO de ponteiros nas instrues de manipulao de cadeias. CLI - Desabilita Interrupes Codificao:
CLI
Operao: Desativa o flag de interrupo (IF). Flags Afetados IF Comentrio A instruo CLI desabilita a ocorrncia de interrupes de hardware, exceto a interrupo no mascarvel. No afeta as interrupes de software. STI - Habilita Interrupes Codificao:
STI
Operao: Ativa o flag de interrupo (IF). Flags Afetados 1986, Daniel Quadros Pgina 76
Programao Assembler no PC-IBM e Compatveis IF Comentrio A instruo STI habilita o tratamento de interrupes de hardware. HLT - Para o processador Codificao:
HLT
Operao: O processador fica parado at que ocorra uma interrupo de hardware, ou seja reiniciado (atravs de "reset"). No caso da ocorrncia de uma interrupo, o processamento prossegue, aps o tratamento da interrupo, com a instruo seguinte ao HLT. Flags Afetados Nenhum Comentrio A instruo HLT raramente usada; caso seja utilizada para aguardar uma interrupo, importante no esquecer antes de habilitar as interrupes via STI. ESC - Envia Instruo para Coprocessador Codificao:
ESC imed,mem
Operao: A instruo ESC faz com que o 8088 coloque na via de endereos o endereo referenciado na instruo, sem efetuar qualquer transferncia de dados. Flags Afetados Nenhum Comentrio A instruo ESC utilizada em sistemas que utilizam um coprocessador (por exemplo, o coprocessador numrico 8087). O valor imediato especificado (de 0 a 63) tratado pelo coprocessador como uma instruo.
Pgina 77
Operao: A instruo WAIT coloca o processador em um estado de espera, at receber um sinal no pino "TEST". Flags Afetados Nenhum Comentrio A instruo WAIT utilizada para sincronizar o 8088 com um hardware externo (por exemplo, o coprocessador numrico 8087). Durante a espera, o processador continua atendendo as interrupes. LOCK - Prefixo de Exclusividade da Via Codificao:
LOCK
Operao: O prefixo LOCK faz com que o 8088 indique que a via de dados e endereos no pode ser compartilhada durante a execuo da instruo. Flags Afetados Nenhum Comentrio O prefixo LOCK utilizado para garantir exclusividade de acesso em mquinas onde vrios processadores tem que compartilhar recursos de hardware (por exemplo memria). Um problema tpico surge quando existe uma varivel que indica se um determinado dispositivo est em uso (este tipo de varivel normalmente denominado SEMAFORO). Vamos supor que esta varivel seja 1 quando o dispositivo est em uso e zero quando est livre. Admitamos tambm que um pedido de uso pode ocorrer tanto no processamento normal como durante o tratamento de uma interrupo. Consideremos primeiro o caso de um ambiente com um nico processador. As instrues abaixo NO so adequadas:
CMP JE MOV SEMAFORO,1 OCUPADO SEMAFORO,1 ; (A) ; (B)
Pgina 78
Programao Assembler no PC-IBM e Compatveis pois entre a instruo (A) e a instruo (B) pode ter havido uma interrupo que alterou o contedo do semforo. A instruo XCHG permite ler e escrever em uma varivel de forma no interrompvel:
MOV XCHG CMP JE AL,1 SEMAFORO,AL AL,1 OCUPADO
Em um ambiente com mais de um processador, possvel que um processador assuma o controle da memria entre a leitura e escrita comandadas pela instruo XCHG que est sendo executada em outro. Desta forma necessrio o prefixo LOCK:
MOV LOCK CMP JE AL,1 XCHG SEMAFORO,AL AL,1 OCUPADO ;desvia se continha 1 ; livre, passou a conter 1
O prefixo LOCK pode ser usado em conjunto com o "segment override"; por outro lado, s deve ser utilizado em conjunto com os prefixos de repetio se as interrupes estiverem inibidas.
Pgina 79
TPICOS AVANADOS
4.1 MDULOS
Um programa assembly no precisa ser composto de um nico fonte. possvel codific-lo em vrias partes (MDULOS) e depois "ligar" todos os objetos para obter o programa. Esta tarefa de "ligar" os mdulos normalmente feita por um programa LIGADOR de MODULOS ("linker"). Neste item veremos algumas diretivas relacionadas ao uso de mdulos. 4.1.1 DIRETIVA NAME A diretiva NAME permite especificar um nome para o mdulo sendo assemblado:
NAME nome
O nome do mdulo utilizado pelo programa LIGADOR. 4.1.2 DIRETIVA PUBLIC A diretiva PUBLIC utilizada para indicar quais smbolos de um mdulo podem ser referenciados em outros:
PUBLIC lista de smbolos
Por exemplo, suponhamos que em um mdulo A sejam definidas as variveis VAR1 e VAR2 e os rtulos ROT1 e ROT2. Para que estes smbolos possam ser mencionados em um outro mdulo preciso colocar no mdulo A a diretiva
PUBLIC VAR1, VAR2, ROT1, ROT2
A diretiva PUBLIC pode ser colocada em qualquer lugar do programa fonte. 4.1.3 DIRETIVA EXTRN A diretiva EXTRN utilizada para indicar que sero utilizados smbolos definidos em outros mdulos e quais os seus tipos:
EXTRN nome:tipo, nome:tipo, ...
Os tipos podem ser BYTE, WORD, DWORD, NEAR, FAR e ABS. Este ltimo tipo se refere a uma constante e no a um smbolo propriamente dito. Retomando o exemplo anterior, para que um mdulo B use as variveis VAR1 (byte) e VAR2 (word) e as rotinas ROT1 (near) e ROT2 (far) definidas no mdulo A, temos que incluir a diretiva
EXTRN EXTRN VAR1:BYTE, VAR2:WORD ROT1:NEAR, ROT2:FAR
O posicionamento da diretiva EXTRN importante: as variveis e rotinas "near" que ela menciona sero consideradas como definidas no segmento onde a diretiva utilizada:
Pgina 80
faz com que a varivel X seja considerada como definida no segmento A e o rtulo Y no segmento B. 4.1.4 DIRETIVA END Conforme j dito, a diretiva END marca o fim do programa fonte e permite a indicao do endereo da primeira instruo a ser executada. Quando um programa consiste de vrios mdulos, somente um deles (o "programa principal") deve especificar o endereo inicial de execuo. 4.2 4.2.1 MAIS DETALHES SOBRE SEGMENTOS DIRETIVA SEGMENT
Na explicao anterior da diretiva SEGMENT, algumas opes foram propositalmente omitidas. O formato completo :
Nome SEGMENT [alinhamento] [combinao] ['classe']
onde os colchetes indicam que os trs parmetros so opcionais. O ALINHAMENTO utilizado para indicar onde um segmento deve ser posicionado pelo ligador, e pode ser: BYTE WORD PARA PAGE INPAGE o segmento pode comear em qualquer endereo o segmento deve comear em um endereo par o segmento deve comear em um endereo mltiplo de 16 o segmento deve comear em um endereo mltiplo de 256 o segmento tem que ficar todo contido em uma pgina, isto , entre dois mltiplos consecutivos de 256
Se no for especificado alinhamento, o assembler assume PARA. A COMBINAO indica como o segmento dever ser combinado com segmentos de outros mdulos: PUBLIC o segmento ser agrupado com outros segmentos de mesmo nome, tambm pblicos
COMMON o segmento compartilhar as mesmas posies que todos os outros segmentos COMMON de mesmo nome. Ou seja, todos os segmentos COMMON de mesmo nome descrevem a mesma rea de memria AT expr o segmento ser localizado no endereo 16*expr. Por exemplo, "AT 12H" significa que o segmento comea no endereo "fsico" 120H 1986, Daniel Quadros Pgina 81
STACK
os segmentos STACK de mesmo nome so combinados de forma que o tamanho final do segmento seja o do maior deles e o offset do ltimo item de todos eles seja igual. Por exemplo:
PILHA FIM_1 PILHA PILHA FIM_2 PILHA SEGMENT DW LABEL ENDS SEGMENT DW LABEL ENDS STACK 20H DUP (?) WORD ;mdulo 1
;mdulo 2
O segmento PILHA final ter 30H words e FIM_1 e FIM_2 tero offset 60H. MEMORY semelhante a COMMON, porm este segmento colocado ao final de todos os outros (em endereo mais alto). Caso no seja especificada a combinao, o segmento no ser agrupado a outros (mesmo que de mesmo nome). Finalmente, CLASSE um nome qualquer. Os segmentos de mesma classe so colocados juntos na memria. 4.2.2 DIRETIVA ORG Ao se declarar pela primeira vez um segmento, as variveis e instrues comeam a ser alocadas a partir do deslocamento 0. Caso o segmento seja fechado (via ENDS) e posteriormente reaberto, a alocao continua do ltimo deslocamento anterior. A diretiva ORG utilizada para especificar o deslocamento em que sero alocados os smbolos seguintes. O uso conjunto de AT e ORG permite declarar variveis e rotinas em endereos absolutos. Por exemplo:
X A SEGMENT AT 12H LABEL ORG LABEL ENDS BYTE 34H BYTE ;fica em 12H:0H
B X
;fica em 12H:34H
4.2.3 DIRETIVA GROUP At o momento sempre acessamos smbolos atravs de registradores de segmento contendo o segmento em que o smbolo foi definido.
Pgina 82
Programao Assembler no PC-IBM e Compatveis Existem ocasies em que, apesar de definirmos vrios segmentos, desejamos acessar smbolos definidos neles atravs de um nico valor nos registradores de segmento. Isto feito informando ao assembler que estes segmentos constituem um GRUPO, atravs da diretiva GROUP:
nome GROUP seg1, seg2, ...
Para que isto seja possvel, todos os segmentos devem ficar em um mesmo bloco de 64K bytes, o que verificado pelo ligador de mdulos. Se, em um ASSUME, dizemos que um registrador contm um grupo, o assembler passa a informar ao ligador que os deslocamentos tem de ser ajustados em funo da posio do segmento no grupo. O operador OFFSET normalmente fornece o deslocamento em relao ao segmento em que o smbolo foi definido; para obter o deslocamento de um smbolo em um grupo utiliza-se a forma
OFFSET grupo:smbolo
DADOS
;contm o deslocamento de VARIAVEL ; no grupo DADOS BX,OFFSET VARIAVEL ; ERRO ! AL,[BX] ; DS contm DADOS mas a instruo ; contem deslocamento no segmento VAR
4.3
muito comum armazenar-se mais de uma informao em um nico byte ou word, associando-se a cada uma delas um certo nmero de bits. Cada um destes grupos de bits ser um CAMPO. A diretiva RECORD permite definir a organizao de um byte ou word neste tipo de aplicao, associando nomes aos campos:
Nome RECORD campo:largura [= expr] [,campo:largura ...]
onde nome campo o nome do "record", que ser usado para alocar uma rea com a organizao descrita. o nome de um campo. Este nome pode ser usado como uma constante que indica quantos bits devem ser deslocados para encostar o campo direita. 1986, Daniel Quadros Pgina 83
Programao Assembler no PC-IBM e Compatveis largura expr o nmero de bits (1 a 16) ocupados pelo campo. o valor padro a ser utilizado na alocao de reas atravs do nome do "record". Sua presena no obrigatria.
A definio de um record no aloca memria; apenas define como a estrutura de campos. Uma vez definido um "record" pode-se alocar uma rea com o seu formato de modo semelhante ao usado para definir bytes e words:
[nome] nome do record < [iniciao] >
O primeiro nome (opcional) corresponde ao smbolo que ser utilizado para acessar a rea. A "iniciao" uma lista de expresses separadas por vrgulas, que correspondem aos valores a serem colocados nos campos. Caso o nmero total de bits seja menor ou igual a 8, alocado um byte; caso contrrio, alocado um word. Os bits so sempre alocados de forma a que o ltimo bit do ltimo campo seja o bit menos significativo da rea alocada. O operador MASK permite obter um valor que isola um campo (atravs de um AND); o operador WIDTH fornece o nmero de bits em um campo. O exemplo abaixo resume o que foi dito:
DESCRITOR RECORD LIVRE:1=0, USO:3, TAMANHO:4 ; define uma rea com 3 campos: ; LIVRE com 1 bit e valor padro 0 ; USO com 3 bits ; TAMANHO com 4 bits ; total = 8 bits -> ocupa um byte DESCR_1 DESCR_2 DESCRITOR <> DESCRITOR <1,2,3> MOV AND MOV SHR AL,MASK USO AL,DESCR_1 CL,USO AL,CL ; LIVRE contm 0, demais campos indefinidos ; LIVRE = 1, USO = 2 e CONTEUDO = 3 ; AL = 01110000B ; CL = 4 ; AL = campo de USO, encostado direita
4.4
DIRETIVA STRUC
A diretiva STRUC permite definir uma ESTRUTURA, composta por vrios campos de tipo byte, word ou doubleword. O formato da definio de uma estrutura :
nome da estrutura [nome de campo] STRUC DB/DW/DD . . ENDS iniciao
nome da estrutura
Pgina 84
Programao Assembler no PC-IBM e Compatveis onde DB/DW/DD indica que uma destas trs diretivas deve ser usada. Como a diretiva RECORD, STRUC no aloca memria; apenas define como a organizao da estrutura. Os nomes de campos so utilizados para acessar o campo. Isto feito colocando-se no final de uma referncia memria (que deve apontar para o primeiro campo da estrutura) a terminao ".nome do campo". Os valores iniciais fornecidos nas diretivas DB, DW e DD sero os valores padro quando do uso do nome da estrutura para alocao de memria. Esta alocao feita de forma semelhante usada com "records":
[nome] nome da estrutura <iniciao>
Na iniciao s permitido alterar o valor padro de campos que possuem um nico valor. O exemplo abaixo ilustra o uso de estruturas:
REGISTRO STRUC NOME SALARIO DEPTO REGISTRO REG_1 DB DB DW ENDS REGISTRO <"JOAO",,> MOV MOV MOV MOV ; 1o campo alterado "ABCD" 10 DUP (?) 1 ; 4 bytes, valor padro pode ser alterado ; 10 bytes, valor padro no pode ser alterado ; 1 word, valor padro pode ser alterado
AX,REG_1.DEPTO ; AX contm o campo DEPTO de REG_1 BX,OFFSET REG_1 AX,[BX].DEPTO ; idem BX,OFFSET REG_1.NOME ; BX contm o offset do inicio ; do campo NOME de REG_1
Pgina 85
PROGRAMA EXEMPLO
Neste captulo vamos ver um programa completo, como um exemplo de uso das principais instrues. O programa uma pequena "calculadora" hexadecimal e decimal, que aceita comandos na seguinte forma:
nmero operador nmero
Entre os nmeros e o operador no permitido qualquer caractere. Os operadores permitidos so: + soma - subtrao * multiplicao / diviso % resto & "e" lgico | "ou" lgico Os nmeros podem ser fornecidos em hexadecimal ou em decimal; neste ltimo caso, deve ser precedido do sinal "#". Os nmeros podem ainda ser precedidos de um sinal positivo ("+") ou negativo ("-"), sendo armazenados em 16 bits. So impostos os seguintes limites: +FFFF <= numero hexa <= -FFFF +#32767 <= numero decimal <= -#32767 O resultado da operao apresentado em hexadecimal (sem sinal) e em decimal (com sinal). Abaixo temos alguns exemplos:
>100+1 0101 +00257 >-100+1 FF01 -00255 >-#100/#33 FFFD -00003 >-#100%#33 FFFF -00001
O sinal ">" colocado pelo programa para indicar que est pronto para receber um comando. Nas pginas seguintes apresentada a listagem completa e comentada deste programa exemplo. Procurou-se dar mais nfase ao aspecto didtico do programa que eficincia; sugere-se ao leitor procurar outras solues para o problema, exercitando assim o conhecimento adquirido no restante do livro.
Pgina 86
Pgina 87
Pgina 88
Pgina 89
Pgina 90
Pgina 91
Pgina 92
Pgina 93
Pgina 94
Pgina 95
Pgina 96
Pgina 97
O segundo byte da instruo, se existir, segue sempre o seguinte formato: mod xxx r/m onde mod indica de onde obtido o operando: 00 01 10 11 memria, deslocamento zero (*) memria, deslocamento armazenado em um byte, estendido com sinal para 16 bits memria, deslocamento armazenado em um word registrador (r/m = reg)
r/m seleciona o modo de endereamento ou o registrador: se memria 000 001 010 011 100 101 110 111 BX + SI + deslocamento BX + DI + deslocamento BP + SI + deslocamento BP + DI + deslocamento SI + deslocamento DI + deslocamento BP + deslocamento (*) BX + deslocamento
se registrador 16 bits 000 AX 001 CX 010 DX 011 BX 000 SP 001 BP 010 SI 010 DI 8 bits 000 AL 001 CL 010 DL 011 BL 000 AH 001 CH 010 DH 010 BH segmento 00 ES 01 CS 10 SS 11 DS
Programao Assembler no PC-IBM e Compatveis Na descrio so tambm utilizados os seguintes smbolos: w 0 operao de 8 bits 1 operao de 16 bits S se w = 1 0 dois bytes de operando imediato 1 um byte de operando imediato, estendido com sinal para 16 bits se w = 0 Alguns exemplos: MOV reg,reg MOV AX,BX 1000100w 1000100111 mod reg r/m 011 000 no importa
mod 000 r/m 11 000 011 11 000 011 00000001 00000000 00000001
mod reg r/m 00 000 110 00 000 111 01 000 111 00000101 00000101 00000000
---------------------------------------------------------------
ADD
AND
reg,reg mem,reg reg,mem reg,imed mem,imed AL,imed AX,imed reg,reg mem,reg reg,mem reg,imed mem,imed AL,imed AX,imed reg,reg mem,reg reg,mem
00110111 11010101 11010100 00111111 000100dw 0001000w 0001001w 100000sw 100000sw 00010100 00010101 000000dw 0000000w 0000001w 100000sw 100000sw 00000100 00000101 001000dw 0010000w 0010001w
00001010 00001010 11 mod mod 11 mod reg reg reg 010 010 reg r/m r/m reg r/m
Programao Assembler no PC-IBM e Compatveis reg,imed 100000sw 11 100 reg mem,imed 100000sw mod 100 r/m AL,imed 00100100 AX,imed 00100101 ---------------------------------------------------------------
11101000 10011010 11111111 11 010 reg 11111111 mod 010 r/m 11111111 mod 011 r/m CBW 10011000 CLC 11111000 CLD 11111100 CLI 11111010 CMC 11110101 CMP reg,reg 001110dw 11 reg reg mem,reg 0011100w mod reg r/m reg,mem 0011101w mod reg r/m reg,imed 100000sw 11 111 reg mem,imed 100000sw mod 111 r/m AL,imed 00111100 AX,imed 00111101 CMPS 1010011w CWD 10011001 ---------------------------------------------------------------
CALL
DIV
11 001 reg mod 001 r/m 11 110 reg mod 110 r/m
---------------------------------------------------------------
H I
HLT 11110100 --------------------------------------------------------------IDIV IMUL IN reg mem reg mem AL,imed AX,imed AL,DX AX,DX reg mem 1111011w 1111011w 1111011w 1111011w 11100100 11100101 11101100 11101101 1111111w 1111111w 11 mod 11 mod 111 111 101 101 reg r/m reg r/m
INC
Programao Assembler no PC-IBM e Compatveis 01000reg INT 11001100 11001101 INTO 11001110 IRET 11001111 --------------------------------------------------------------regword 3 imed
rtulo short rtulo near rtulo far reg mem word mem dword
JNA JNAE JNB JNBE JNE JNG JNGE JNL JNLE JNO JNP JNS JNZ
01110111 01110011 01110010 01110110 11100011 01110100 01111111 01111101 01111100 01111110 11101011 11101001 11101010 11111111 11111111 11111111 01110110 01110010 01110011 01110111 01110101 01111110 01111100 01111101 01111111 01110001 01111011 01111001 01110101
Pgina 101
Programao Assembler no PC-IBM e Compatveis LOOP 11100010 LOOPE 11100001 LOOPNE 11100000 LOOPNZ 11100000 LOOPZ 11100001 ---------------------------------------------------------------
100010dw 11 reg reg 1000101w mod reg r/m 1000100w mod reg r/m 1100011w 11 000 reg 1100011w mod 000 r/m 1011wreg 10100000 (endereco direto) 10100001 (endereco direto) 10001110 11 0rg reg 10001110 mod 0rg r/m 10001100 11 0rg reg 10001100 mod 0rg r/m MOVS 1010010w MUL reg 1111011w 11 100 reg mem 1111011w mod 100 r/m ---------------------------------------------------------------
MOV
reg,reg reg,mem mem,reg reg,imed mem,imed reg,imed AL,mem AX,mem segreg,reg segreg,mem reg,segreg mem,segreg
1111011w 11 011 reg 1111011w mod 011 r/m NOP 10010000 NOT reg 1111011w 11 010 reg mem 1111011w mod 010 r/m --------------------------------------------------------------OR reg,reg mem,reg reg,mem reg,imed mem,imed AL,imed AX,imed imed,AL imed,AX DX,AL DX,AX 000010dw 0000100w 0000101w 100000sw 100000sw 00001100 00001101 11100110 11100111 11101110 11101111 11 mod mod 11 mod reg reg reg 001 001 reg r/m r/m reg r/m
NEG
reg mem
OUT
---------------------------------------------------------------
POP
POPF PUSH
Programao Assembler no PC-IBM e Compatveis 01010reg 000rg110 PUSHF 10011100 --------------------------------------------------------------regword segreg
1101000w 11 010 reg 1101000w mod 010 r/m 1101001w 11 010 reg 1101001w mod 010 r/m RCR 1101000w 11 011 reg 1101000w mod 011 r/m 1101001w 11 011 reg 1101001w mod 011 r/m REP 11110011 REPE 11110011 REPNE 11110010 REPNZ 11110010 REPZ 11110011 RET near 11000011 imed near 11000010 far 11001011 imed far 11001010 ROL reg,1 1101000w 11 000 reg mem,1 1101000w mod 000 r/m reg,CL 1101001w 11 000 reg mem,CL 1101001w mod 000 r/m ROR reg,1 1101000w 11 001 reg mem,1 1101000w mod 001 r/m reg,CL 1101001w 11 001 reg mem,CL 1101001w mod 001 r/m ---------------------------------------------------------------
RCL
SAHF SAL
SAR
SBB
reg,1 mem,1 reg,CL mem,CL reg,1 mem,1 reg,CL mem,CL reg,reg mem,reg reg,mem reg,imed mem,imed AL,imed AX,imed
10011110 1101000w 1101000w 1101001w 1101001w 1101000w 1101000w 1101001w 1101001w 000110dw 0001100w 0001101w 100000sw 100000sw 00011100 00011101 1010111w 1101000w
100 100 100 100 111 111 111 111 reg reg reg 011 011
reg r/m reg r/m reg r/m reg r/m reg r/m r/m reg r/m
SCAS SHL
reg,1
Programao Assembler no PC-IBM e Compatveis 1101000w mod 100 r/m 1101001w 11 100 reg 1101001w mod 100 r/m SHR 1101000w 11 101 reg 1101000w mod 101 r/m 1101001w 11 101 reg 1101001w mod 101 r/m STC 11111001 STD 11111101 STI 11111011 STOS 1010101w SUB reg,reg 001010dw 11 reg reg mem,reg 0010100w mod reg r/m reg,mem 0010101w mod reg r/m reg,imed 100000sw 11 101 reg mem,imed 100000sw mod 101 r/m AL,imed 00101100 AX,imed 00101101 --------------------------------------------------------------mem,1 reg,CL mem,CL reg,1 mem,1 reg,CL mem,CL
reg,reg 1000010w 11 reg reg mem,reg 1000010w mod reg r/m reg,mem 1000010w mod reg r/m reg,imed 1111011w 11 000 reg mem,imed 1111011w mod 000 r/m AL,imed 10101000 AX,imed 10101001 ---------------------------------------------------------------
TEST
W X
WAIT 10011011 --------------------------------------------------------------XCHG reg,reg reg,mem mem,reg AX,reg reg,reg mem,reg reg,mem reg,imed mem,imed AL,imed AX,imed 1000011w 1000011w 1000011w 100010rg 11010111 001100dw 0011000w 0011001w 100000sw 100000sw 00110100 00110101 11 reg reg mod reg r/m mod reg r/m
XLAT XOR
Pgina 104