Vous êtes sur la page 1sur 104

Programao Assembler no PC-IBM e Compatveis

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

PROGRAMA EXEMPLO .............................................................................................................................. 86

APNDICE - INSTRUES X CDIGOS ................................................................................................................. 98

1986, Daniel Quadros

Pgina 2

Programao Assembler no PC-IBM e Compatveis

PREFCIO DA EDIO ELETRNICA


Em 1983, quando eu era um engenheiro eletrnico recm formado, comprei o meu primeiro microcomputador pessoal. Era um TK-82C, uma cpia nacional do ZX-81 da Sinclair. Naquele tempo, muito anterior internet, a principal fonte de informaes eram as revistas. Aps algum tempo comecei a colaborar, de forma no sistemtica, com revistas como a Micro Sistemas e MicroBits e a participar de encontros de usurios. Foi em um deles que conheci o Nelson Santos. Nelson tinha escrito um livro sobre o TK-82, estava trabalhando como editor para a Editora Campos e, como os cilnios, tinha um plano. O plano era um livro com vrios programas comentados (Jogos em Linguagem de Mquina para a Linha Sinclair), cada programa escrito por um autor. Este plano acabou no indo em frente e o Nelson perguntou se eu no tinha alguma idia para um livro. A nica coisa que veio na cabea foi escrever algo sobre aquilo que eu estava trabalhando no dia-a-dia: o PC-IBM. Estvamos no tempo da reserva de mercado e eu trabalhava em uma empresa idealista, que decidiu fazer o seu prprio BIOS e sistema operacional (compatvel com o PC-DOS). O PC ainda estava na sua infncia e muita coisa era escrita na linguagem Assembly (se bem que o sistema operacional foi escrito na sua maior parte em Pascal e posteriormente re-escrito em C). O Nelson gostou da idia e assim nasceu o que viria a ser o primeiro volume do PC Assembler. O livro foi escrito em um Unitron (clone do Apple ][) e os originais foram enviados impressos para serem re-digitados e compostos na editora. O livro foi um relativo sucesso: foram impressos 6253 livros e vendidos 6066 exemplares, em quatro edies, do segundo semestre de 86 at o primeiro semestre de 93, quando a Editora Campus decidiu no mais reeditar a obra e me devolveu os direitos de publicao. No final de 2007, resolvi disponibilizar o texto no meu blog (http://dqsoft.blogspot.com). Aps uma pequena odissia (descrita no blog) consegui recuperar o texto do disco original, mas em formato txt e sem o programa exemplo. Quase dois anos e meio depois, um dos freqentadores do meu blog (Cacio Gazola) me repassou o texto em um formato mais adequado para edio. Nesta edio eletrnica (cujo preparo se arrastou por vrios meses) fiz uma pequena reviso no texto, formatei todo o contedo e acrescentei capa, ndice e o programa exemplo. Espero que seja til para algum.

Daniel Quadros
Junho/2010

1986, Daniel Quadros

Pgina 3

Programao Assembler no PC-IBM e Compatveis

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:

1986, Daniel Quadros

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.

1986, Daniel Quadros

Pgina 5

Programao Assembler no PC-IBM e Compatveis

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:

1986, Daniel Quadros

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.

1986, Daniel Quadros

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:

1986, Daniel Quadros

Pgina 8

Programao Assembler no PC-IBM e Compatveis

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)

1986, Daniel Quadros

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

Todos os nmeros devem ser representveis em 16 bits (mais um bit de sinal):


-1111111111111111B -177777O -65535 -0FFFFH <= <= <= <= cte cte cte cte binria octal decimal hexa <= 1111111111111111B <= 177777O <= 65535 <= 0FFFFH

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

FORMATO DE UM PROGRAMA EM LINGUAGEM ASSEMBLY

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

1986, Daniel Quadros

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

Um segmento iniciado pela diretiva SEGMENT:


nome SEGMENT

e terminado pela diretiva ENDS:


nome ENDS

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

Programao Assembler no PC-IBM e Compatveis


MOV MOV MOV AX,VAR AX,[BX] AX,[BP] utiliza DS utiliza DS utiliza SS

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 a varivel XIS, do tipo byte, com valor inicial 0;


YPS DW ?

define a varivel YPS, do tipo word, com valor inicial indeterminado;


ZE DB 1,2,3

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)

define dez words, todos com valor inicial 0 e


ZEROS_E_UNS DB 5 DUP (0,1)

define cinco bytes, com os valores 0, 1, 0, 1 e 0. 1986, Daniel Quadros Pgina 12

Programao Assembler no PC-IBM e Compatveis 2.8 DEFININDO RTULOS

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

codigo da rotina ENDP

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

PROC NEAR RET ; 2 ENDP RET ; 3

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

1986, Daniel Quadros

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

Comanda a gerao de um desvio curto

2.11 MODOS DE ENDEREAMENTO 1986, Daniel Quadros Pgina 14

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]

; (o deslocamento final ; a soma de BX com o ; deslocamento do smbolo ; TABELA)

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]

; (deslocamento = ; offset TABELA ; - 300 + BP + DI

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.

1986, Daniel Quadros

Pgina 16

Programao Assembler no PC-IBM e Compatveis

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

1986, Daniel Quadros

Pgina 17

Programao Assembler no PC-IBM e Compatveis 3.2 INSTRUES DE MOVIMENTAO

MOV - Movimenta dados Codificao:


MOV MOV MOV MOV MOV MOV MOV MOV MOV reg,reg mem,reg reg,mem reg,imed mem,imed reg,segreg segreg*,reg segreg*,mem mem,segreg

* 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

1986, Daniel Quadros

Pgina 18

Programao Assembler no PC-IBM e Compatveis PUSH - Coloca Word na Pilha Codificao:


PUSH PUSH PUSH regword mem segreg

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

1986, Daniel Quadros

Pgina 19

Programao Assembler no PC-IBM e Compatveis POP - Retira Word da Pilha Codificao:


POP POP POP regword mem segreg*

( * 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]

1986, Daniel Quadros

Pgina 20

Programao Assembler no PC-IBM e Compatveis XCHG - Troca Codificao:


XCHG XCHG XCGH reg,reg reg,mem mem,reg

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

XLAT - Converte AL Codificao:


XLAT var

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

1986, Daniel Quadros

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

LEA - Carrega Endereo Efetivo Codificao:


LEA regword,mem

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]

1986, Daniel Quadros

Pgina 22

Programao Assembler no PC-IBM e Compatveis LDS - Carrega Ponteiro p/ DS Codificao:


LDS regword,mem

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

LES - Carrega Ponteiro p/ ES Codificao:


LES regword,mem

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

Programao Assembler no PC-IBM e Compatveis Exemplos:


LES LES SI,PONTEIRO_ORIGEM AX,ENDERECO

LAHF - Carrega AH com Flags Codificao:


LAHF

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

1986, Daniel Quadros

Pgina 24

Programao Assembler no PC-IBM e Compatveis SAHF - Carrega Flags com AH Codificao:


SAHF

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

PUSHF - Coloca Flags na Pilha Codificao:


PUSHF

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.

1986, Daniel Quadros

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

POPF - Retira Flags da Pilha Codificao:


POPF

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

1986, Daniel Quadros

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

ADC - Adio com "vai um" Codificao:


ADC ADC ADC ADC ADC reg,reg mem,reg reg,mem reg,imed mem,imed

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

1986, Daniel Quadros

Pgina 27

Programao Assembler no PC-IBM e Compatveis INC - Incremento Codificao:


INC INC reg mem

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]

SUB - Subtrao Codificao:


SUB SUB SUB SUB SUB reg,reg mem,reg reg,mem reg,imed mem,imed

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

SBB - Subtrao com "vem um" Codificao:


SBB SBB SBB reg,reg mem,reg reg,mem

1986, Daniel Quadros

Pgina 28

Programao Assembler no PC-IBM e Compatveis


SBB SBB reg,imed mem,imed

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

DEC - Decremento Codificao:


DEC DEC reg mem

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]

1986, Daniel Quadros

Pgina 29

Programao Assembler no PC-IBM e Compatveis CMP - Comparao Codificao:


CMP CMP CMP CMP CMP reg,reg mem,reg reg,mem reg,imed mem,imed

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

MUL - Multiplicao Codificao:


MUL MUL reg mem

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

1986, Daniel Quadros

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

IMUL - Multiplicao com sinal Codificao:


IMUL IMUL reg mem

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

1986, Daniel Quadros

Pgina 31

Programao Assembler no PC-IBM e Compatveis Exemplos:


IMUL IMUL AH VAR_WORD ; AX = AH * AL ; DXAX = AX * VAR_WORD

DIV - Diviso Codificao:


DIV DIV reg mem

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

1986, Daniel Quadros

Pgina 32

Programao Assembler no PC-IBM e Compatveis IDIV - Diviso com sinal Codificao:


IDIV IDIV reg mem

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

1986, Daniel Quadros

Pgina 33

Programao Assembler no PC-IBM e Compatveis NEG - Negao Aritmtica Codificao:


NEG NEG reg mem

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]

CBW - Converte Byte em Word Codificao:


CBW

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.

1986, Daniel Quadros

Pgina 34

Programao Assembler no PC-IBM e Compatveis CWD - Converte Word em DoubleWord Codificao:


CWD

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

1986, Daniel Quadros

Pgina 35

Programao Assembler no PC-IBM e Compatveis


MOV MOV CLC MOV SOMA: MOV ADC AAA MOV DEC DEC LOOP AL,[SI] AL,[DI] [DI],AL SI DI SOMA ;soma ;ajusta soma ;guarda dgito SI,OFFSET NUMERO_1 + 9 DI,OFFSET NUMERO_2 + 9 CX,10 ;ltimo digito ;ltimo digito ;vai um inicial = 0 ;# de dgitos

;repete p/ todos os dgitos

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

ativados se "vem um" decimal indefinidos

1986, Daniel Quadros

Pgina 36

Programao Assembler no PC-IBM e Compatveis


MOV SUBT: MOV SBB AAS MOV DEC DEC LOOP AL,[SI] AL,[DI] [DI],AL SI DI SUBT ;subtrai ;ajusta resultado ;guarda dgito CX,10 ;# de dgitos

;repete p/ todos os dgitos

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

1986, Daniel Quadros

Pgina 37

Programao Assembler no PC-IBM e Compatveis


MOV ADC DAA MOV DEC DEC LOOP AL,[SI] AL,[DI] [DI],AL SI DI SOMA

;soma ;ajusta soma ;guarda

;repete p/ todos os dgitos

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

1986, Daniel Quadros

Pgina 38

Programao Assembler no PC-IBM e Compatveis


LOOP SUBT ;repete p/ todos os dgitos

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

1986, Daniel Quadros

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.

1986, Daniel Quadros

Pgina 40

Programao Assembler no PC-IBM e Compatveis 3.4 INSTRUES LGICAS

NOT - Negao Lgica Codificao:


NOT NOT reg mem

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]

SHL - Deslocamento Lgico para a Esquerda Codificao:


SHL SHL SHL SHL reg,1 reg,CL mem,1 mem,CL

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

SAL - Deslocamento Aritmtico para a Esquerda Codificao:


SAL SAL SAL SAL reg,1 reg,CL mem,1 mem,CL

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

1986, Daniel Quadros

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

SHR - Deslocamento Lgico para a Direita Codificao:


SHR SHR SHR SHR reg,1 reg,CL mem,1 mem,CL

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

SAR - Deslocamento Aritmtico para a Direita Codificao:


SAR SAR SAR SAR reg,1 reg,CL mem,1 mem,CL

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.

1986, Daniel Quadros

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

ROL - Rotao para a Esquerda Codificao:


ROL ROL ROL ROL reg,1 reg,CL mem,1 mem,CL

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:

1986, Daniel Quadros

Pgina 45

Programao Assembler no PC-IBM e Compatveis


ROL ROL AX,1 VARIAVEL,CL

ROR - Rotao para a Direita Codificao:


ROR ROR ROR ROR reg,1 reg,CL mem,1 mem,CL

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

1986, Daniel Quadros

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

RCR - Rotao atravs do "Carry" para a Direita Codificao:


RCR RCR RCR reg,1 reg,CL mem,1

1986, Daniel Quadros

Pgina 47

Programao Assembler no PC-IBM e Compatveis


RCR mem,CL

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

AND - Operao Lgica "E" Codificao:


AND AND AND AND AND reg,reg mem,reg reg,mem reg,imed mem,imed

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

correspondem ao resultado desativados indefinido

"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

coloca em VALOR o resto da diviso de VALOR por 8. Outros exemplos:


AND AND AND CX,DX MATRIX[BX],SP SI,VARIAVEL

TEST - Operao Lgica "E" no destrutiva Codificao:


TEST TEST TEST TEST TEST reg,reg mem,reg reg,mem reg,imed mem,imed

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

1986, Daniel Quadros

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

OR - Operao Lgica "OU" Codificao:


OR OR OR OR OR reg,reg mem,reg reg,mem reg,imed mem,imed

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

correspondem ao resultado desativados indefinido

ativa os bits mais e menos signficativos de BP, sem afetar os demais.

1986, Daniel Quadros

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

XOR - Operao Lgica "OU Exclusivo" Codificao:


XOR XOR XOR XOR XOR reg,reg mem,reg reg,mem reg,imed mem,imed

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

correspondem ao resultado desativados indefinido

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

1986, Daniel Quadros

Pgina 51

Programao Assembler no PC-IBM e Compatveis 3.5 INSTRUES DE ENTRADA E SAIDA

IN - Leitura de Dispositivo Codificao:


IN IN IN IN AL,imed AL,DX AX,imed AX,DX

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

OUT - Escrita em Dispositivo Codificao:


OUT OUT OUT OUT imed,AL DX,AL imed,AX DX,AX

Operao: A instruo OUT escreve um byte (contido em AL) ou word (contido em AX) em um dispositivo. Flags Afetados Nenhum Comentrios e Exemplos

1986, Daniel Quadros

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

INSTRUES DE MANIPULAO DE CADEIAS

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

;Z=1 se todos elementos contm 0

REPNZ / REPNE - Repete Primitiva enquanto Diferente Codificao:


REPNZ REPNE primitiva primitiva

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

;Z=1 se achou elemento = 0

LODS / LODSB / LODSW - Carrega Elemento de Cadeia Codificao:


LODS LODSB LODSW mem

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

1986, Daniel Quadros

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

1986, Daniel Quadros

Pgina 56

Programao Assembler no PC-IBM e Compatveis


CLD MOV MOV MOV MOV REP ;seleciona incremento ;valor a colocar na cadeia ;segmento da cadeia ;deslocamento inicial ;nmero de elementos (50H = 80D) ;preenche

AX,50H ES,AX DI,AX CX,AX STOSW

MOVS / MOVSB / MOVSW - Copia Cadeia Codificao:


MOVS MOVSB MOVSW mem,mem

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

SI,OFFSET AREA1 DI,OFFSET AREA2 CX,20 MOVSB

1986, Daniel Quadros

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.

1986, Daniel Quadros

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

Programao Assembler no PC-IBM e Compatveis 3.7 INSTRUES DE DESVIO

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

1986, Daniel Quadros

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

AX,OFFSET ROT_NEAR AX ;indireto, intrasegmento, desvia p/ ROT_NEAR END_NEAR,OFFSET ROT_NEAR

1986, Daniel Quadros

Pgina 61

Programao Assembler no PC-IBM e Compatveis


MOV JMP BX,OFFSET END_NEAR [BX] ;"duplamente" indireto, intrasegmento, ;desvia p/ ROT_NEAR

JE/JZ - Desvia se Zero Codificao:


JE JZ rtulo rtulo

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

1986, Daniel Quadros

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

Programao Assembler no PC-IBM e Compatveis JNA/JBE - Desvia se no Acima Codificao:


JNA JBE rtulo rtulo

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.

1986, Daniel Quadros

Pgina 65

Programao Assembler no PC-IBM e Compatveis JP/JPE - Desvia se Paridade Par Codificao:


JP JPE rtulo rtulo

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

1986, Daniel Quadros

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:

1986, Daniel Quadros

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

LOOP - Repete at CX=0 Codificao:


LOOP rtulo

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

1986, Daniel Quadros

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

1986, Daniel Quadros

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

1986, Daniel Quadros

Pgina 71

Programao Assembler no PC-IBM e Compatveis RET - Retorno de Subrotina Codificao:


RET RET

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

;coloca na pilha 1o parmetro ;coloca na pilha 2o parmetro ;chama subrotina

ROTINA

;BP aponta p/ IP,PAR_2,PAR_1 ;PAR_2 ;PAR_1 ;retira PAR_1 e PAR_2 da pilha

ROTINA

INT - Interrupo de Software Codificao:


INT imed

Operao: Gera uma interrupo de software, atravs dos seguintes passos: Pgina 72

1986, Daniel Quadros

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

1986, Daniel Quadros

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.

1986, Daniel Quadros

Pgina 74

Programao Assembler no PC-IBM e Compatveis 3.8 INSTRUES DE CONTROLE DO PROCESSADOR

CLC - Desativa Flag de "Vai Um" Codificao:


CLC

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

Operao: Desativa o flag de direo (DF).

1986, Daniel Quadros

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.

1986, Daniel Quadros

Pgina 77

Programao Assembler no PC-IBM e Compatveis WAIT - Espera Codificao:


WAIT

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)

1986, Daniel Quadros

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

;desvia se continha 1 ; livre, passou a conter 1

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.

1986, Daniel Quadros

Pgina 79

Programao Assembler no PC-IBM e Compatveis

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:

1986, Daniel Quadros

Pgina 80

Programao Assembler no PC-IBM e Compatveis


A A B B SEGMENT EXTRN X:BYTE ENDS SEGMENT EXTRN Y:NEAR SEGMENT

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

Programao Assembler no PC-IBM e Compatveis

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

STACK 10H DUP (?) WORD

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

1986, Daniel Quadros

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

O exemplo abaixo ilustra o uso de grupos:


CONST UM CONST SEGMENT DB 1 ENDS

VAR SEGMENT VARIAVEL DB ? VAR ENDS ASSUME DS:VAR MOV AL,VARIAVEL

;contm o deslocamento de VARIAVEL ; no segto VAR

DADOS

GROUP CONST, VAR ASSUME DS:DADOS MOV AL,VARIAVEL MOV MOV

;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

DIRETIVA RECORD E OS OPERADORES MASK E WIDTH

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

1986, Daniel Quadros

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

1986, Daniel Quadros

Pgina 85

Programao Assembler no PC-IBM e Compatveis

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.

1986, Daniel Quadros

Pgina 86

Programao Assembler no PC-IBM e Compatveis

1986, Daniel Quadros

Pgina 87

Programao Assembler no PC-IBM e Compatveis

1986, Daniel Quadros

Pgina 88

Programao Assembler no PC-IBM e Compatveis

1986, Daniel Quadros

Pgina 89

Programao Assembler no PC-IBM e Compatveis

1986, Daniel Quadros

Pgina 90

Programao Assembler no PC-IBM e Compatveis

1986, Daniel Quadros

Pgina 91

Programao Assembler no PC-IBM e Compatveis

1986, Daniel Quadros

Pgina 92

Programao Assembler no PC-IBM e Compatveis

1986, Daniel Quadros

Pgina 93

Programao Assembler no PC-IBM e Compatveis

1986, Daniel Quadros

Pgina 94

Programao Assembler no PC-IBM e Compatveis

1986, Daniel Quadros

Pgina 95

Programao Assembler no PC-IBM e Compatveis

1986, Daniel Quadros

Pgina 96

Programao Assembler no PC-IBM e Compatveis

1986, Daniel Quadros

Pgina 97

Programao Assembler no PC-IBM e Compatveis

APNDICE - INSTRUES X CDIGOS


As instrues do 8088 correspondem a um, dois, trs, quatro, cinco ou at seis bytes, organizados da seguinte forma: Instruo Dados Endereo 1 ou 2 bytes 1 ou 2 bytes 1, 2 ou 4 bytes

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 mod=00 e r/m=110 ento o deslocamento do operando o contido na instruo, em 2 bytes.

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

xxx varia conforme a instruo 1986, Daniel Quadros Pgina 98

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

MOV reg,imed MOV BX,1 MOV BX,256

100000sw 10000011 10000001

mod 000 r/m 11 000 011 11 000 011 00000001 00000000 00000001

MOV reg,mem MOV AL,[5] MOV AL,[BX] MOV AL,[BX+5]

1000101w 10001010 10001010 10001010

mod reg r/m 00 000 110 00 000 111 01 000 111 00000101 00000101 00000000

---------------------------------------------------------------

AAA AAD AAM AAS ADC

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

11 mod mod 11 mod

reg reg reg 000 000

reg r/m r/m reg r/m

11 reg reg mod reg r/m mod reg r/m Pgina 99

1986, Daniel Quadros

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

rtulo near rtulo far reg mem word mem dword

DAA DAS DEC

DIV

reg mem regword reg mem

00100111 00111111 1111111w 1111111w 01001reg 1111011w 1111011w

11 001 reg mod 001 r/m 11 110 reg mod 110 r/m

---------------------------------------------------------------

ESC imed 11011iii mod iii 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

11 000 reg mod 000 r/m Pgina 100

1986, Daniel Quadros

Programao Assembler no PC-IBM e Compatveis 01000reg INT 11001100 11001101 INTO 11001110 IRET 11001111 --------------------------------------------------------------regword 3 imed

JA JAE JB JBE JCXZ JE JG JGE JL JLE JMP

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

11 100 reg mod 100 r/m mod 101 r/m

JO 01110000 JP 01111010 JPE 01111010 JPO 01111011 JS 01111000 JZ 01110100 ---------------------------------------------------------------

LAHF LDS LEA LES LOCK LODS

reg,mem reg,mem reg,mem

10011111 11000101 10001101 11000100 11110000 1010110w

mod reg r/m mod reg r/m

1986, Daniel Quadros

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

reg mem regword segreg reg mem

POPF PUSH

10001111 10001111 01011reg 000rg111 10011101 11111111 11111111

11 000 reg mod 000 r/m

11 110 reg mod 110 r/m Pgina 102

1986, Daniel Quadros

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

reg,1 mem,1 reg,CL mem,CL reg,1 mem,1 reg,CL mem,CL

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

11 mod 11 mod 11 mod 11 mod 11 mod mod 11 mod

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

11 100 reg Pgina 103

1986, Daniel Quadros

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

11 mod mod 11 mod

reg reg reg 110 110

reg r/m r/m reg r/m

1986, Daniel Quadros

Pgina 104

Vous aimerez peut-être aussi