Você está na página 1de 75

Apostila das instrues assembler do 8088

Departamento de Eletroeletrnica Disciplina: Microprocessadores II, Arquitetura de Sistemas Digitais

Professores: Cludio Leo, Orlando Rocha, Srgio Campos

ndice
ndice...................................................................................................................................3 .............................................................................................................................................4 1 - Modos de endereamento do 8086.................................................................................5 1.1 - Modos de endereamento de programa.......................................................................5 1.2 - Modos de endereamento de dados.............................................................................6 2 - Tipos de Dados (8086)....................................................................................................8 3 - Instrues Assembly ....................................................................................................11 3.1 - Instrues de movimentao de dados......................................................................11 3.1.1 - Instrues de movimentao de uso geral..............................................................11 3.1.2 - Instrues para manipulao de stack....................................................................15 3.1.3 - Instrues de converso de tipo..............................................................................17 3.2 - Instrues aritmticas binrias...................................................................................18 3.2.1 - Instrues de adio e subtrao............................................................................19 3.2.2 - Instrues de comparao e mudana de sinal.......................................................25 3.2.3 - Instrues de multiplicao e diviso.....................................................................26 3.3 - Instrues de aritmtica decimal...............................................................................30 3.3.1 - Instrues de alterao para BCD compactado......................................................30 3.3.2 - Instrues de alterao para BCD no compactado...............................................32 3.4 - Instrues Lgicas.....................................................................................................36 3.4.1 - Instrues para operaes booleanas......................................................................36 3.4.2 - Instruo de teste de bit..........................................................................................39

3.4.3 - Instrues de rotao e deslocamento....................................................................40 3.5 - Instrues de transferncia de controle.....................................................................47 3.5.1 - Instrues de transferncia de controle incondicional............................................48 3.5.2 - Instrues de transferncia de controle condicional...............................................56 3.5.3 - Instrues de LOOP................................................................................................57 3.6 - Operaes com string................................................................................................59 3.6.1 - Prefixos de repetio..............................................................................................65 3.7 - Instrues de controle de flag....................................................................................67 3.7.1 - Instrues de controle do flag de direo, flag carry e de interrupo...................67 3.7.2 - Instrues de transferncia de flags........................................................................69 3.8 - Instrues de acesso a portas de entrada e sada.......................................................71 3.9 - Instrues de uso geral..............................................................................................73

1 - Modos de endereamento do 8086


Os modos de endereamento do 8086 podem ser divididos em dois tipos distintos: 1. Modos de endereamento de programa 2. Modos de endereamento de dados

1.1 - Modos de endereamento de programa


Quando deseja-se que a CPU realize uma busca de instruo, o endereo da localizao de memria da qual a instruo obtida calculado como a soma de um offset armazenado no ponteiro de instruo IP, com o contedo do registrador CS. Normalmente, o contedo do IP incrementado medida que as instrues so executadas. Entretanto, as instrues de desvio no fluxo de execuo de um programa podem modific-lo de uma das trs maneiras abaixo: 1. Endereamento relativo a programa: Um deslocamento de 8 ou 16 bits fornecido pela instruo na forma de uma dado somado ao IP como um nmero binrio sinalizado. Essa operao no altera o contedo de CS, sendo uma operao intra-segmento (dentro do prprio segmento corrente).

2. Endereamento direto: Um endereo de 16 bits obtido da prpria instruo na forma de um dado colocado no IP, nesse caso trata-se de uma operao intra-segmento. Se o endereo especificado for de 32 bits, os primeiros dois bytes carregaro o IP e os dois seguintes o CS, nesse caso ocorre uma operao inter-segmento (fora do segmento de cdigo corrente). 3. Endereamento indireto: Um dos modos de endereamento de dados (que sero descritos a seguir) podem ser utilizados para ler um dado da memria. Entretanto, esse dado interpretado como um endereo de memria pelas instrues de desvio ou chamada de subrotina. Se o dado de 16 bits acessado, este ser carregado no registrador IP (operao intra-segmento). Se no entanto, dois dados de 16 bits so acessados, o primeiro ser carregado em IP e o segundo em CS, realizando assim uma operao inter-segmento.

1.2 - Modos de endereamento de dados


Seis opes esto disponveis para o endereamento de dados * Modo Imediato Neste tipo de endereamento, um dos operandos est presente no byte seguinte ao cdigo da instruo (op-code). Se bytes de endereamento seguem o op-code, ento o dado a ser transferido de maneira imediata vir logo aps os bytes de endereamento. Exemplo: ADD AX,1000h : Soma 1000h ao contedo do

registrador AX

* Modo Direto O modo de endereamento direto feito somando-se os dois bytes seguintes ao op-code, ao CS, para compor um novo endereo linear. Exemplo: suponha que o registrador DS contenha B000h. A instruo MOV DX,[8000h], carregar em DX o contedo da posio de memria DS:8000, cujo endereo linear B8000h.

*Modo Direto Indexado Nesse modo de endereamento utiliza-se os registradores SI e DI como indexadores, somando-se um deslocamento de 8 ou 16 bits a um desses registradores de forma a gerar um endereo efetivo (offset). Exemplo: MOV AL,[SI+10h] MOV [DI-1000h],DX

*Modo Implcito O modo implcito uma verso simplificada do modo de endereamento direto indexado. A nica diferena entre eles que, nesse modo, no especificado um deslocamento. Exemplo: MOV AL,[SI] MOV [DI],DX

*Modo Relativo a Dados (utilizando o registrador de segmento DS) Nesse modo o contedo do registrador BX utilizado para formar a base para o endereo linear. Todos os modos de endereamento descritos at aqui, com exceo do modo imediato, podem ser utilizados tambm no modo relativo. Exemplo: Modo relativo direto Modo relativo implcito Modo relativo direto indexado MOV AX,[BX+1000h] MOV DH,[BX+SI] MOV [BX+DI+1000h],DL

*Modo Relativo a Stack Nesse modo o contedo do registrador BP utilizado para formar a base para o endereo linear de acesso a dados gravados na pilha. Exemplo: MOV BP,SP MOV AX,[BP+04h] MOV [BP+DI+10h],BX

2 - Tipos de Dados (8086)

Os principais tipos de dados so os bytes e as words. Um byte so 8 bits, sendo estes numerados de 0 a 7, o bit 0 o menos significativo (LSB - least significant bit). A word uma seqncia de dois bytes que ocupam dois endereos consecutivos quaisquer. Uma word tem, portanto, 16 bits os quais so numerados de 0 a 15. Novamente, o bit 0 o menos significativo (LSB). O byte que contm o bit zero da word chamado de low byte (byte baixo) e o que contm o bit 15 chamado de high byte (byte alto). No 8086 e nos demais microprocessadores da famlia INTEL, o low byte armazenado no endereo mais baixo e seu endereo tambm o endereo da word. O endereo do high byte utilizado somente quando a metade superior da word estiver endereada separadamente da parte baixa. Como o 8086 possui um barramento de 16 bits, as comunicaes entre o microprocessador e a memria ocorrem como transferncias de words alinhadas a endereos pares; o microprocessador converte transferncias entre endereos no alinhados a words, em mltiplas transferncias alinhadas. As operaes desalinhadas reduzem a velocidade do processamento em funo de ciclos extras de barramento. Embora os bytes e words sejam os principais tipos de dados para o 8086, o mesmo tem a possibilidade de interpretar estes operandos de maneiras diversas. Algumas instrues especializadas reconhecem os seguintes tipos de dados: Inteiro: Nmero binrio sinalizado armazenado em uma word ou byte. Todas as operaes assumem a representao em complemento de dois. O bit de sinal o 7 se for um byte ou o 15 se for uma word. Se negativo, este bit ser igual a 1, caso positivo ser

0. Em um byte pode-se ter os valores compreendidos entre -128 a +127; na word pode-se representar de -32768 a +32767. Ordinal: Nmero binrio sem sinal armazenado em um byte ou uma word. Se estiver contido em um byte, estar na faixa de 0 a 255, se numa word, entre 0 a 65535. String: Seqncia contnua de bytes ou words. Uma string pode conter de 0 a (220)-1 bytes. BCD: Representao de um dgito decimal codificado em binrio (Binary Coded Decimal) na faixa de 0 a 9. Um decimal no compactado expresso por um byte sem bit de sinal. Cada dgito armazenado em um byte. A magnitude do nmero o valor binrio do nibble de ordem mais baixa (4 bits menos significativos do byte); os dgitos somente podem assumir valores entre 0 e 9. O nibble de ordem mais alta (4 bits mais significativos do byte), deve estar zerado para as operaes de multiplicao e de diviso, e podem conter qualquer valor nas somas e subtraes. BCD Compactado (packed BCD): Representao de dgitos decimais codificados em binrio, cada um na faixa de 0 a 9. Um dgito armazenado nos 4 bits menos significativos do byte e outro nos 4 bits mais significativos; portanto cada byte comporta dois dgitos.

3 - Instrues Assembly
Neste captulo sero apresentadas as instrues assembly do 8086, que se aplicam a qualquer microprocessador da famlia 80XXX da Intel

3.1 - Instrues de movimentao de dados


Neste grupo de instrues esto aquelas que permitem manipular dados do tipo byte, word, doubleword entre memria e registradores do microprocessador. So de trs tipos: Instrues de movimentao de uso geral Instrues para manipulao de stack Instrues de converso de tipo

3.1.1 - Instrues de movimentao de uso geral


a) MOV - Move Propsito: Copiar o contedo do operando-fonte para o operandodestino. O contedo do fonte no afetado Formato: MOV destino,fonte Flags: Nenhum afetado Exemplos: H 7 tipos de instrues MOV:

1 - Do acumulador para a memria MOV [SI], AL MOV [BX+DI],AX MOV [400], AL 2 - Da memria para o acumulador MOV AL,[BX+2] MOV AX,[SI] MOV AL,[400] 3 - Da memria ou registrador para registrador de segmento MOV ES,BX MOV DS,[SI] MOV SS,[BX] Obs: O registrador CS no pode ser usado como destino. 4 - Do registrador de segmento para a memria ou registrador MOV AX,CS MOV CX,SS MOV [500],DS 5 - De registrador para registrador / da memria ou registrador para registrador / de registrador para a memria

MOV CL,DH MOV AL,AH MOV SI,BX MOV DI,DX MOV CL,[SI] MOV DX,[SI+1000] MOV [BX+DI],DH MOV TABELA[BX+3],CL 6 - Dado imediato para registrador MOV AX,99H MOV BL,99H MOV CX,0FFFFH MOV DI,61CH

7 - Dado imediato para a memria MOV BYTE PTR[SI],0FH MOV WORD PTR[BX+1234],1157H

b) LDS - Carrega registrador de segmento Propsito: Transferir quatro bytes consecutivos de um operando fonte para um par de registradores de 16 bits. O operando-fonte precisa estar na memria. Um dos registradores aquele especificado na instruo, o outro o DS. Formato: LDS destino, fonte Flags: Nenhum afetado

Exemplo: Considere que o registrador SI contenha o valor 5334H, BX contenha 0FFFFH e que as posies de memria a partir da indicada por SI, dentro do segmento de dados, contenha os seguintes bytes 21h, 12h, DFh e 2Ch. Aps a instruo LDS BX, dword ptr[SI] valor 2CDFH. o registrador DS conter o valor 1221H e o registrador BX conter o

c) LES - Carrega registrador de segmento extra Propsito: Transferir quatro bytes consecutivos de um operando fonte para um par de registradores de 16 bits. O operando-fonte precisa estar na memria. Um dos registradores aquele especificado na instruo, o outro o ES. Formato: LES destino, fonte

Flags: Nenhum afetado

Exemplo: Considere que o registrador BX contenha o valor 5334H, DI contenha 0FEF3H e que as posies de memria a partir da indicada por BX, dentro do segmento de dados, contenha os seguintes bytes E3h, 2Dh, 24h e ACh. Aps a instruo LES DI, dword ptr[BX] valor AC24H. o registrador ES conter o valor 2DE3H e o registrador DI conter o

3.1.2 - Instrues para manipulao de stack


d) PUSH - Grava word na pilha Propsito: Colocar, na rea de memria usada como pilha, o contedo de um registrador ou posio de memria. Modo de operao: 1 - Decrementa o SP 2 - Move o byte mais alto do registrador ou posio de memria para a locao indicada por SS:SP 3 - Decrementa o SP 4 - Move o byte mais baixo do operando para a locao indicada por SS:SP Formato: PUSH fonte Flags: Nenhum afetado

Exemplo:

PUSH SI PUSH ES

; Grava na pilha a word armazenada em SI ; Grava na pilha a word armazenada em ES

PUSH [BX+SI]; Grava na pilha a word armazenada na posio de memria apontada por (BX+SI)

e) POP - Copia word da pilha para registrador ou memria Propsito: Retirar uma palavra armazenada no topo da pilha, colocando-a no registrador ou posio de memria especificada. Modo de operao: 1 - Retira o byte no endereo de memria determinado por SS:SP, movendo-o para o byte de mais baixa ordem do operando destino. 2 - Incrementa o SP em 1 3 - Retira o byte da posio indicada por SS:SP e o move para o byte de alta ordem do operando destino. 4 - Incrementa o SP em 1 Formato: POP destino Flags: Nenhum afetado

Exemplo:

POP

AX

; Grava em AL a word no topo da pilha

POP POP DI a word no topo

DS [DI]

; Grava em DS a word no topo da pilha ; Grava na posio de memria apontada por da pilha

3.1.3 - Instrues de converso de tipo


f) CBW - Converte byte para word Propsito: Propagar o bit de sinal do valor presente no registrador AL (bit mais significativo) para o registrador AH. Assim, se o valor em AL for positivo, a instruo armazena 00H em AH e, em caso contrrio, 0FFH. Formato: CBW Flags: Nenhum

g) CWD - Converte word em doubleword Propsito: Propagar o bit de sinal do valor presente no registrador AX (bit mais significativo) para o registrador DX. Assim, se o valor em AX for positivo, a instruo armazena 0000H em DX e, em caso contrrio, 0FFFFH. Essa instruo utilizada antes da execuo de uma diviso sinalizada do contedo de AX por outro operando de 16 bits, de modo a preencher o DX com o valor do sinal em AX. Formato: CWD Flags: Nenhum

3.2 - Instrues aritmticas binrias


As instrues aritmticas binrias dos processadores da famlia 8086/286/386/486/586... operam com dados codificados em binrio. As operaes incluem adio, subtrao, multiplicao, diviso, incremento, decremento, comparao e mudana de sinal. So suportados tanto nmeros inteiros sinalizados como os no sinalizados. Os operandos fontes podem ser valores imediatos, registradores ou memria. Operandos destino podem ser registradores ou memria (exceto quando o operando fonte estiver na memria). As instrues aritmticas alteram os flags ZF, CF, SF e OF para reportar o tipo de resultado produzido pela execuo da mesma. O tipo de instruo a ser utilizada para o teste do flag depender do dado estar sendo interpretado como valor sinalizado ou no. O flag CF contm informaes importantes para inteiros sinalizados. O flag ZF relevante para ambos, e ser setado sempre que um resultado for 00H As instrues aritmticas operam dados de 8, 16 ou 32 bits. Os flags so utilizados para refletir o tamanho da operao. Por exemplo, se o resultado de uma operao de ADD com dados de 8 bits for maior do que 255 (decimal), o flag CF ser igual a 1. Se o nmero inteiro sem sinal, o flag CF pode ser testado aps uma instruo aritmtica binria para determinar se a operao requer carry ou borrow que ser propagado para o prximo estgio da operao. As instrues de incremento e decremento no alteram o indicador CF, isto permite o uso destas instrues para a atualizao de contadores no controle de loops sem alterao dos reportes referentes aos resultados da aritmtica.

Os flags SF e OF reportam a aritmtica sinalizada. O flag SF possui o mesmo valor do bit de sinal de um resultado. O flag OF ser igual a 1 em qualquer destes casos: Um carry foi gerado do MSB para o bit de sinal mais o bit de sinal no gerou um carry para o CF, ou seja, o resultado foi maior do que o maior nmero positivo que pode ser representado no formato complemento de dois. Um carry foi gerado do bit de sinal para o MSB mas nenhum carry foi gerado para o bit de sinal, ou seja, o resultado foi menor do que o menor valor negativo que pode ser representado no formato complemento de dois. Estes flags de status podem ser testados por qualquer tipo de instruo condicional.

3.2.1 - Instrues de adio e subtrao


h) ADD - Adio Propsito: Executar a adio normal entre dois operandos, um fonte e outro destino, devolvendo o resultado no destino. Formato: ADD destino,fonte Flags: Afetados AF, CF, OF, PF, SF, ZF.

Exemplos: AL

ADD

AL,04H

; Adiciona 04H ao contedo de

ADD posio de ADD contedo de AX ADD DS:0300 ao ADD AL ao contedo da

byte ptr[300],05H ; Adiciona 05H ao contedo da memria DS:0300 AX,SI ; Adiciona o contedo de SI ao

DL,[300]

; Adiciona o byte gravado em contedo de DL

[SI+BX+2],AL

; Adiciona o contedo de posio de

memria DS:SI+BX+02 i) ADC - Adio com carry * Propsito: Executar a adio normal entre dois operandos, um fonte e outro destino, mais o valor do flag carry existente antes da operao, devolvendo o resultado no destino. Formato: ADC destino,fonte Flags: Afetados AF, CF, OF, PF, SF, ZF.

Exemplos: carry

ADC

AL,04H

; Adiciona 04H ao contedo de o contedo do flag

AL e ento soma

ADC

byte ptr[300], 05H

; Adiciona 05H ao memria

contedo da posio de DS:0300 e ento soma o contedo do flag carry

ADC contedo de AX

AX,SI

; Adiciona o contedo de SI ao e ento soma o

contedo do flag carry ADC DS:0300 ao soma o contedo do flag ADC AL ao contedo da memria DS:SI+BX+02 e ento soma o contedo do flag carry [SI+BX+2], AL DL,[300] ; Adiciona o byte gravado em contedo de DL e ento carry ; Adiciona o contedo de posio de

(*) O flag carry ser setado, aps a execuo da instruo ADC, caso uma das condies abaixo ocorra: a) H um vai um na etapa da soma dos operandos destino e fonte, ou b) H um vai um na etapa da soma do flag carry (existente antes da operao), com o resultado de (destino + fonte).

j) SUB - Subtrao Propsito: Executar uma subtrao entre dois operandos, um fonte e outro destino, devolvendo o resultado no destino. Formato: SUB destino,fonte Flags: Afetados AF, CF, OF, PF, SF, ZF.

Exemplos:

SUB SUB

BL,04H byte ptr[DI],05H

; Subtrai 04H do contedo de BL ; Subtrai 05H do contedo da memria DS:DI

posio de SUB AX,CX

; Subtrai o contedo de

CX do contedo de AX SUB BX,[SI] ; Subtrai a word gravada de BX ; Subtrai o contedo de DL do posio de

em DS:SI do contedo SUB contedo da memria DS:BX+02 [BX+2],DL

j) SBB - Subtrao com carry Propsito: Executar a subtrao entre dois operandos, um fonte e outro destino, menos o valor do flag carry existente antes da operao, devolvendo o resultado no destino. Formato: SBB destino,fonte Flags: Afetados AF, CF, OF, PF, SF, ZF.

Exemplos:

SBB

BL,04H

; Subtrai 04H do contedo de BL do resultado o

e ento subtrai contedo do flag carry SBB posio de subtrai do resultado o flag carry SBB AX,CX byte ptr[DI],05H

; Subtrai 05H do contedo da memria DS:DI e ento contedo do

; Subtrai o contedo de e ento

CX do contedo de AX subtrai do resultado o contedo do flag carry SBB BX,[SI]

; Subtrai a word gravada de BX e

em DS:SI do contedo ento subtrai do resultado o contedo do flag carry SBB contedo da [BX+2],DL

; Subtrai o contedo de DL do posio de

memria DS:BX+02 e ento subtrai do resultado o contedo do flag carry k) INC - Incrementa destino em 1 Propsito: Soma 1 ao contedo de um operando, que pode ser registrador ou posio de memria. Formato: INC destino Flags: Afetados AF, OF, PF, SF, ZF.

Exemplos:

INC INC

BL

; Soma 1 ao contedo de BL : Soma 1 ao byte gravado na apontada por

byte ptr [SI]

posio de memria DS:SI

Obs: Registradores de segmento no podem ser usados como operando.

l) DEC - Decrementa destino em 1 Propsito: Subtrai 1 do contedo de um operando, que pode ser registrador ou posio de memria. Formato: DEC destino Flags: Afetados AF, OF, PF, SF, ZF.

Exemplos:

DEC DEC

BX

; Subtrai 1 do contedo de BX : Subtrai 1 da word gravada na apontada por

word ptr [0100]

posio de memria DS:0100

Obs: Registradores de segmento no podem ser usados como operando.

3.2.2 - Instrues de comparao e mudana de sinal


m) CMP - Compara dois operandos Propsito: Efetuar uma subtrao entre dois operandos, alterando os flags e descartando o resultado da operao. Formato: CMP destino,fonte Flags: Afetados AF, CF, OF, PF, SF, ZF.

Exemplos: valor 57H

CMP

AL,57H

; Compara o contedo de AL com o

CMP CMP

DI,BX [SI],AX

; Compara os contedos de DI e BX ; Compara uma word gravada na contedo de AX ; Compara o contedo de CH posio de

posio DS:SI, com o CMP CH,[SI+BX+3]

com o byte armazenado na memria DS:SI+BX+3

n) NEG - Calcula o complemento de dois do destino Propsito: Efetuar o complemento de dois de um operando, que pode ser registrador ou posio de memria.. Formato: NEG destino Flags: Afetados AF, CF, OF, PF, SF, ZF.

Exemplo: Considere que o registrador CX contenha o valor 0005 (+5). Aps a execuo da instruo valor FFFB (-5). NEG CX, o registrador conter o

3.2.3 - Instrues de multiplicao e diviso


o) MUL - Multiplicao sem sinal Propsito: Efetuar uma multiplicao no sinalizada entre o contedo do acumulador (AL ou AX) pelo operando fonte, devolvendo o resultado no acumulador AX (caso a operao tenha envolvido AL com um operando de 8 bits), ou em DX e AX (caso a operao tenha envolvido AX e um operando de 16 bits). Formato: MUL fonte Flags: Afetados CF, OF, indefinidos AF, PF, SF, ZF.

Exemplos: MOV AL, 83H

MOV CL, 44H MUL resultado em AX CL ; realiza o produto entre AL e CL,

MOV AX,1234H MOV BX,6000H MUL e BX, resultado AX(parte baixa) BX ; realiza o produto de 16 bits entre AX em DX(parte alta) e

p) IMUL - Multiplicao com sinal Propsito: Efetuar uma multiplicao sinalizada entre o contedo do acumulador (AL ou AX) pelo operando fonte, devolvendo o resultado no acumulador AX (caso a operao tenha envolvido AL com um operando de 8 bits), ou em DX e AX (caso a operao tenha envolvido AX e um operando de 16 bits). Como so sinalizados , os operandos podem ter valores na faixa de -128 a +127 (operao de 8 bits) ou entre -32768 a +32767 (operao de 16 bits). Formato: IMUL fonte Flags: Afetados CF, OF, indefinidos AF, PF, SF, ZF.

Exemplos: MOV AL, 83H MOV CL, 44H IMUL CL resultado em AX ; realiza o produto entre AL e CL,

MOV AX,1234H MOV BX,6000H IMUL BX e BX, resultado AX(parte baixa) ; realiza o produto de 16 bits entre AX em DX(parte alta) e

q) DIV - Diviso sem sinal Propsito: Efetuar uma diviso no sinalizada entre o contedo do acumulador (AL ou AX) pelo operando fonte, devolvendo o resultado no acumulador AX (caso a operao tenha envolvido AX com um operando de 8 bits), ou em DX e AX (caso a operao tenha envolvido DS:AX e um operando de 16 bits). Na operao de 8 bits, o quociente da operao de diviso fica em AL e o resto da diviso em AH. Na operao de 16 bits, o quociente da operao fica em AX e o resto da diviso em DX. Formato: DIV fonte Flags: indefinidos AF, CF, OF, PF, SF, ZF.

Exemplos: DIV

BL

; Dividendo em AX, divisor em BL. O o resto em AH ; Dividendo em DX:AX, divisor em BX. O AX e o resto em DX

quociente estar em AL e DIV BX

quociente estar em

No primeiro exemplo, considere que o contedo do acumulador AX seja 800H e que BL contenha 30H. Aps a execuo da instruo, AL conter 2AH e AH o valor 20H

r) IDIV - Diviso com sinal Propsito: Efetuar uma diviso sinalizada entre o contedo do acumulador (AL ou AX) pelo operando fonte, devolvendo o resultado no acumulador AX (caso a operao tenha envolvido AX com um operando de 8 bits), ou em DX e AX (caso a operao tenha envolvido DS:AX e um operando de 16 bits). Na operao de 8 bits, o quociente da operao de diviso fica em AL e o resto da diviso em AH. Na operao de 16 bits, o quociente da operao fica em AX e o resto da diviso em DX. Se os operandos tiverem sinais diferentes, sendo um positivo e o outro negativo, a diviso ser feita de forma que o resto tenha o mesmo sinal do dividendo. Formato: IDIV fonte

Flags: indefinidos AF, CF, OF, PF, SF, ZF.

Exemplos: IDIV DH. O quociente resto em AH IDIV

DH

; Dividendo em AX, divisor em estar em AL e o

word ptr[BX+100]

; Dividendo em DX:AX, memria

divisor na posio de apontada por (BX+100). O quociente estar em AX e o resto em DX

3.3 - Instrues de aritmtica decimal


A aritmtica decimal realizada combinando-se as instrues da aritmtica binria com as da aritmtica decimal. As instrues da aritmtica decimal so utilizadas em uma das seguintes formas: Para ajustar os resultados de uma instruo da aritmtica binria, realizada anteriormente, a fim de se produzir um valor decimal vlido, compactado ou no. Para ajustar as entradas de um a operao binria subsequente para que a mesma produza um resultado decimal, compactado ou no. estas instrues operam somente nos registradores AL ou AH, associados ao flag AF.

3.3.1 - Instrues de alterao para BCD compactado


s) DAA - Ajuste decimal aps adio

Propsito: Corrigir o resultado presente no acumulador AL, aps uma soma entre dois valores BCD compactados (um dgito em cada nibble), para obter um par de dgitos BCD compactados. O procedimento dessa instruo : 1. Se os quatro bits menos significativos de AL esto entre A e F, ou se o flag AF est ligado, somar 06H ao acumulador AL e ligar o flag AF. 2. Se os quatro bits mais significativos de AL esto entre A e F, ento somar 60H ao acumulador AL e ligar o flag CF. Formato: DAA Flags: Afetados AF, CF, PF, SF, ZF, indefinido OF.

Exemplo: Suponha que AL contenha o valor 39H e AH o valor 53H. Aps a seqncia ADD DAA o acumulador AL conter o valor 92H, e no 8CH. AL,AH

t) DAS - Ajuste decimal aps subtrao Propsito: Corrigir o resultado presente no acumulador AL, aps uma subtrao entre dois valores BCD compactados (um dgito em cada nibble), para obter um par de dgitos BCD compactados.

O procedimento dessa instruo : 1. Se os quatro bits menos significativos de AL esto entre A e F, ou se o flag AF est ligado, subtrair 06H do contedo do acumulador AL e ligar o flag AF. 2. Se os quatro bits mais significativos de AL esto entre A e F, ou se o flag CF est ligado, ento subtrair 60H do contedo do acumulador AL e ligar o flag CF. Formato: DAS Flags: Afetados AF, CF, PF, SF, ZF.

Exemplo: Suponha que AL contenha o valor 84H e DL o valor 16H. Aps a seqncia SUB DAS o acumulador AL conter o valor 68H, e no 6EH. AL,DL

3.3.2 - Instrues de alterao para BCD no compactado


u) AAA - Ajuste ASCII aps adio Propsito: Corrigir o resultado presente no acumulador AL, aps uma soma de dois dgitos ASCII. O procedimento dessa instruo :

1. Se os quatro bits menos significativos de AL esto entre A e F e o flag AF=0, ento execute o passo 3. 2. Se os quatro bits menos significativos de AL esto entre A e F, ou se o flag AF=1, ento somar 06H ao acumulador AL, somar 01H ao contedo de AH e ligar o flag AF. 3. Apaga os quatro bits mais significativos do registrador AL. Formato: AAA Flags: Afetados AF, CF; indefinidos, PF, SF, ZF, OF.

Exemplo: Suponha que o acumulador AX contenha o valor 0437H e que CL contenha o valor 34H. Aps a seqncia ADD AAA o acumulador AX conter o valor 0501H. AL,CL

v) AAS - Ajuste ASCII aps subtrao Propsito: Corrigir o resultado presente no acumulador AL, aps uma subtrao entre dois dgitos ASCII. O procedimento dessa instruo :

1. Se os quatro bits menos significativos de AL esto entre A e F e o flag AF=0, ento execute o passo 3. 2. Se os quatro bits menos significativos de AL esto entre A e F, ou se o flag AF=1, ento subtraia 06H do contedo do acumulador AL, subtraia 01H do contedo de AH e ligue o flag AF. 3. Apaga os quatro bits mais significativos do registrador AL. 4. Sinaliza o flag CF com o mesmo valor do AF. Formato: AAS Flags: Afetados AF, CF; indefinidos, PF, SF, ZF, OF.

Exemplo: Considera que o acumulador AX contenha o valor 0935H. Aps a seqncia SUB AAS o acumulador AX conter o valor 0809H. AL,36H

x) AAM - Ajuste ASCII aps multiplicao Propsito: Corrigir o resultado da multiplicao de dois nmeros decimais no compactados. A instruo deve seguir-se a multiplicao de dois operandos decimais no compactados para produzir um

resultado decimal vlido. A instruo far o seguinte: divide o valor em AL por 10, armazenando o resultado em AH e o resto em AL. Formato: AAM Flags: Afetados PF, SF, ZF; indefinidos, AF, CF, OF. (os flags so afetados de acordo com o resultado em AL.)

Exemplo: Suponha que o acumulador AL contenha o valor 09 e que BL contenha o valor 08. Aps a seqncia MUL AAM o acumulador AX conter o valor 0702H. Observe que se a esse valor somarmos 3030H, teremos em AX dois dgitos numricos em ASCII. BL

w) AAD - Ajuste ASCII antes de uma diviso Propsito: Modifica o numerador nos registradores AH ou AL a fim de prepar-lo para a diviso de dois operandos decimais no compactados, o que resultar num nmero decimal no compactado vlido. O registrador AH deve conter o dgito superior e o AL o dgito inferior o resultado desta instruo armazenado no registrador AL. O registrador AH zerado. Procedimento executado pela instruo: 1. Multiplica o valor de AH por 10.

2. Soma o contedo de AH a AL. 3. Zera o registrador AH. Formato: AAD Flags: Afetados PF, SF, ZF; indefinidos, AF, CF, OF. (os flags so afetados de acordo com o resultado em AL.)

Exemplo: Suponha que o acumulador AX contenha o valor 0902. Aps a instruo AAD o acumulador AX conter o valor 005CH.

3.4 - Instrues Lgicas


As instrues lgicas possuem dois operandos. Os operandos fontes podem ser valores imediatos, registradores gerais, ou memria. Os operandos destino podem ser registradores gerais ou memria (exceto quando o operando fonte tambm for memria). As instrues lgicas modificam o estado dos flags. Esto organizadas em: Instrues para operaes booleanas. Instrues de teste de bit. Instrues de deslocamentos e rotaes.

3.4.1 - Instrues para operaes booleanas

As operaes lgicas so realizadas pelas instrues AND, OR, XOR e NOT y) NOT - Operao lgica NOT Propsito: Efetuar o complemento de 1 do operando, que pode ser registrador ou memria. Todos os bits do operando so complementados. Formato: NOT destino Flags: Nenhum afetado

Exemplo:

NOT NOT

word ptr[SI] CL

suponha que no ltimo caso o valor inicial de CL seja 1FH. Aps a instruo, CL assumiu o valor E0H.

z) AND - Operao lgica AND Propsito: Executar a funo lgica AND (E) entre cada bit de um operando-fonte e seu correspondente em um operando-destino, colocando o resultado no operando-destino. Formato: AND destino,fonte

Flags: Afetados: CF, OF, PF, SF, ZF; indefinido: AF

Exemplo:

AND AL,08H

; Realiza a operao lgica entre o valor 08H, bit-a-bit. ; Realiza a operao lgica entre de memria

contedo de AL e o AND byte ptr[BX],06H o contedo da posio apontada por BX e o valor 06H, bit-a-bit. AND AX,CX contedo de AX e

; Realiza a operao lgica entre o CX, bit-a-bit.

a1) OR - Operao lgica OR Propsito: Executar a funo lgica OR (OU) entre cada bit de um operando-fonte e seu correspondente em um operando-destino, colocando o resultado no operando-destino. Formato: OR destino,fonte Flags: Afetados: CF, OF, PF, SF, ZF; indefinido: AF

Exemplo:

OR BX,0801H

; Realiza a operao lgica entre valor 0801H, bit-a-bit. ; Realiza a operao lgica entre o de memria

o contedo de BX e o OR [BX],DL contedo da posio

apontada por BX e o contedo do registrador DL. OR BL,AL contedo de BL e ; Realiza a operao lgica entre o AL, bit-a-bit.

b1) XOR - Operao lgica XOR Propsito: Executar a funo lgica XOR (OU EXCLUSIVO) entre cada bit de um operando-fonte e seu correspondente em um operando-destino, colocando o resultado no operando-destino. Formato: XOR destino,fonte Flags: Afetados: CF, OF, PF, SF, ZF; indefinido: AF

Exemplo:

XOR AL,AH

; Realiza a operao lgica entre o contedo de AH. ; Realiza a operao lgica contedo da

contedo de AL e o XOR DL,[BX] entre o contedo de DL e o posio de memria apontada por BX. XOR CX,1234H contedo de CX e 1234H.

; Realiza a operao lgica entre o o dado imediato

3.4.2 - Instruo de teste de bit


c1) TEST - Comparao lgica

Propsito: Efetuar o teste de determinados bits de um operando, para determinar se os mesmos esto ligados ou desligados, mas sem afeta-los. Formato: TEST destino,fonte Flags: Afetados: CF, OF, PF, SF, ZF; indefinido: AF

Exemplo:

TEST AL,AH

; Verifica que bits no registrador AL acordo com a mscara

esto ativos, de gravada em AH. TEST DL,[BX] registrador DL esto ativos, de

; Verifica que bits no acordo

com a mscara gravada na posio de memria apontada por BX. TEST CX,1234H esto ativos, de especificada na instruo ; Verifica que bits no registrador CX acordo com a mscara (1234H).

3.4.3 - Instrues de rotao e deslocamento


d1) RCL - Rotacione para a esquerda atravs do carry Propsito: Rotacionar o contedo da locao de memria ou registrador especificado, para a esquerda, atravs do flag carry. O nmero de vezes a rotacionar 1, ou aquele contido no registrador CL. O contedo de CL no afetado pela instruo, quando usado como contador.

Formato:

RCL destino,1 ou RCL destino, CL

Flags: Afetados: CF, OF

Exemplos:

RCL CL,1

; Rotaciona o contedo do registrador para a esquerda. ; Rotaciona o contedo do registrador vezes especificado

CL, uma posio RCL AX,CL AX, o nmero de em CL, RCL byte ptr[SI],CL posio de memria apontada o nmero de vezes especificado em CL.

; Rotaciona o contedo da por SI,

e1) RCR - Rotacione para a direita atravs do carry Propsito: Rotacionar o contedo da locao de memria ou registrador especificado, para a direita, atravs do flag carry. O nmero de vezes a rotacionar 1, ou aquele contido no registrador CL. O contedo de CL no afetado pela instruo, quando usado como contador. Formato: RCR destino,1 ou

RCR destino, CL Flags: Afetados: CF, OF

Exemplos:

RCR AL,1

; Rotaciona o contedo do registrador para a direita. ; Rotaciona o contedo do registrador vezes especificado

AL, uma posio RCR BH,CL BH, o nmero de em CL, RCR byte ptr[300],CL posio de memria DS:0300, nmero de vezes especificado em CL.

; Rotaciona o contedo da o

f1) ROL - Rotacione para a esquerda Propsito: Rotacionar o contedo da locao de memria ou registrador especificado, para a esquerda. O nmero de vezes a rotacionar 1, ou aquele contido no registrador CL. O contedo de CL no afetado pela instruo, quando usado como contador. Formato: ROL destino,1 ou ROL destino, CL

Flags: Afetados: CF, OF

Exemplos:

ROL DX,1

; Rotaciona o contedo do registrador para a esquerda. ; Rotaciona o contedo do registrador vezes especificado

DX, uma posio ROL BH,CL BH, o nmero de em CL, ROL byte ptr[BX],1 posio de memria DS:BX, para a esquerda.

; Rotaciona o contedo da uma posio

g1) ROR - Rotacione para a direita Propsito: Rotacionar o contedo da locao de memria ou registrador especificado, para a direita. O nmero de vezes a rotacionar 1, ou aquele contido no registrador CL. O contedo de CL no afetado pela instruo, quando usado como contador. Formato: ROR destino,1 ou ROR destino, CL Flags: Afetados: CF, OF

Exemplos:

ROR AL,CL

; Rotaciona o contedo do registrador vezes especificado em CL. ; Rotaciona o contedo do registrador para a direita. ; Rotaciona o contedo da por DI,

AL, o nmero de ROR BH,1 BH, uma posio ROR byte ptr[DI],1 posio de memria apontada no segmento de dados, uma posio para a direita.

h1) SAL/SHL - Deslocamento aritmtico lgico / Deslocamento lgico Propsito: Deslocar o contedo da locao de memria ou registrador especificado esquerda. Com o deslocamento o bit que estava na posio mais significativa levado para o flag CF, cujo valor anterior perdido, e um bit 0 carregado na posio do bit menos significativo. O nmero de vezes a deslocar 1, ou aquele contido no registrador CL. O contedo de CL no afetado pela instruo, quando usado como contador.

Formato:

SAL destino,1 ou SAL destino, CL

Flags: Afetados: CF, OF, PF, SF, ZF; indefinido AF.

Exemplos: uma posio

SAL DX,1

; Desloca o contedo do registrador DX, para a esquerda.

SAL BH,CL BH, o nmero de CL, SAL byte ptr[BX],1 de memria DS:BX, esquerda.

; Desloca o contedo do registrador vezes especificado em

; Desloca o contedo da posio uma posio para a

h1) SAR - Deslocamento aritmtico direita Propsito: Deslocar o contedo da locao de memria ou registrador especificado direita. Com o deslocamento o bit que estava na posio mais significativa mantido, e o bit 0 carregado no flag CF. O nmero de vezes a deslocar 1, ou aquele contido no registrador CL. O contedo de CL no afetado pela instruo, quando usado como contador.

Formato:

SAR destino,1 ou SAR destino, CL

Flags: Afetados: CF, OF, PF, SF, ZF; indefinido AF.

Exemplos:

SAR AL,CL

; Desloca o contedo do registrador AL, vezes especificado em CL.

o nmero de SAR BH,1 BH, uma posio

; Desloca o contedo do registrador para a direita.

SAR byte ptr[DI],1 ; Desloca o contedo da posio de memria apontada dados, uma posio para a por DI, no segmento de direita.

i1) SHR - Deslocamento lgico direita Propsito: Deslocar o contedo da locao de memria ou registrador especificado direita, inserindo um bit 0 na posio do bit mais significativo do operando e levando o bit 0 (menos significativo)para o flag CF, cujo valor inicial perdido. O nmero de vezes a deslocar 1, ou aquele contido no registrador CL. O contedo de CL no afetado pela instruo, quando usado como contador.

Formato:

SHR destino,1 ou SHR destino, CL

Flags: Afetados: CF, OF, PF, SF, ZF; indefinido AF.

Exemplos:

SHR AL,CL

; Desloca o contedo do registrador AL, vezes especificado em CL.

o nmero de SHR BH,1 BH, uma posio SHR byte ptr[DI],1 posio de memria apontada segmento de dados, uma posio para a direita.

; Desloca o contedo do registrador para a direita. ; Desloca o contedo da por DI, no

3.5 - Instrues de transferncia de controle


Os microprocessadores 80XXX permitem que o controle do fluxo de execuo seja transferido de forma condicional ou incondicional. O modo condicional de transferncia feito a partir do estado ou de combinao de estados dos flags. As transferncias incondicionais so sempre executadas.

3.5.1 - Instrues de transferncia de controle incondicional


As instrues que realizam a transferncia incondicional para um endereo destino em um segmento de cdigo so: JMP, CALL, RET, INT e IRET. O endereo destino pode estar no mesmo segmento de cdigos (transferncia near - prxima) ou em um segmento de cdigos diferente (transferncia far - distante).

j1) JMP - Desviar Propsito: Provocar um desvio incondicional no fluxo de processamento, transferindo a execuo para o operando alvo. O desvio pode ser feito dentro ou fora do atual segmento de cdigo. No caso de desvios dentro do prprio segmento, denominados desvios intra-segmento, apenas o registrador IP afetado pela instruo, sendo alterado para o valor endereo-alvo. Quando a distncia entre o valor atual e o endereo-alvo, para onde se d o desvio incondicional est entre -128 a +127 bytes, pode-se especificar um desvio-curto (JMP SHORT), tambm chamado desvio incondicional relativo curto, com a vantagem de o deslocamento para o desvio ser expresso por um nico byte, contendo um valor sinalizado que, ao ser somado ao valor de IP gerar o endereo-alvo. Se a distncia relativa para onde se dar o desvio for maior que +127 ou -128, ento o endereo relativo gerado ser um valor sinalizado de 16 bits, o que possibilita desvios por todo o segmento corrente. Exemplo: label1: -----------

----------atual: JMP label1

A outra forma de desvio incondicional o desvio inter-segmento. Neste caso os valores do CS e IP precisam ser alterados para que ocorra a migrao de um segmento para outro. O cdigo que identifica um desvio incondicional para outro segmento deve ser seguido por 4 bytes: os dois primeiros contendo o novo valor do IP e os dois seguintes o novo valor do CS. Exemplo: ----------atual: JMP novo_longe atual --------------> Segmento de cdigo

----------novo_longe: cdigo novo ----------As formas de especificar um desvio incondicional, vistas at aqui, so ditas diretas, pois o endereo da posio-alvo que deseja-se atingir explicitamente especificado na instruo, quer com um valor numrico, quer por um label. A outra forma de executar-se um MOV AX,10H ----> Segmento de

desvio incondicional a indireta, onde o valor do endereo-alvo est armazenado em registrador(es) ou em posio(es) de memria, o qual ser movido para o registrador IP, no caso de desvio intrasegmento ou para os registradores IP e CS, no caso de desvio intersegmento. Formato: JMP alvo Flags: Nenhum afetado

Exemplos: relativo.

JMP

desvio_curto

; Direto, intra-segmento,

JMP JMP JMP endereo-alvo est CX. JMP endereo-alvo est

desvio_intra ; Direto, intra-segmento. desvio_inter ; Direto, inter-segmento. CX ; Indireto, intra-segmento, o armazenado em

dword ptr[BX]

; Indireto, inter-segmento, o armazenado nas

4 posies de memria a partir de DS:BX.

k1) CALL - Chama uma procedure

Propsito: Chamar uma subrotina, alterando o fluxo normal de execuo, processar uma sub-rotina e ao fim da mesma, permitir que a execuo retorne ao ponto do programa imediatamente posterior instruo de chamada da sub-rotina. A sub-rotina chamada pode residir no mesmo segmento de cdigo corrente ou no. Tem-se assim as chamadas de subrotinas intra-segmento e inter-segmento, respectivamente. A sub-rotina pode ser chamada por via direta ou indireta. Chamadas diretas podem ser realizadas a labels(nomes associados a endereos de memria) dentro de segmentos de cdigo, enquanto que, por via indireta, usa-se registradores que contm em si, ou nas posies de memrias apontadas por eles, o valor do endereo onde se inicia a sub-rotina. Para guardar o endereo da instruo a ser executada ao retornar da sub-rotina, o processador salva na pilha o contedo do IP, no caso de chamadas a subrotinas no mesmo segmento de cdigo. Nas chamadas de sub-rotinas inter-segmento, alm do valor de IP, tambm necessrio salvar o contedo do CS, pois ele ser alterado para provocar o desvio para outro segmento. O processador primeiro salva o IP e s ento o CS. Formato: CALL alvo Flags: Nenhum afetado

Exemplos:

CALL sub_proxima

; Direta, intra-segmento

CALL sub_distante CALL BX

; Direta, inter-segmento

; Indireta, intra-segmento ; Indireta, inter-segmento

CALL dword ptr [SI]

l1) RET - Retorno de uma procedure Propsito: Encerrar uma sub-rotina, transferindo o fluxo do processamento para a instruo seguinte chamada da subrotina. O endereo desta instruo, para onde deve ser dado o retorno, foi colocado na pilha pela instruo CALL. Portanto, para encerrar uma sub-rotina near, que reside no mesmo segmento, a instruo RET dever apenas retirar uma palavra do topo da pilha e mov-la para o registrador IP. Para enderear uma procedurre far, que reside em um outro segmento de cdigo, a instruo RET dever retirar as duas palavras que foram armazenadas na pilha pela instruo CALL intersegmento, restaurando os antigos valores de CS e IP. Operao da instruo Retirar uma palavra do topo da pilha e move-la para o IP. Incrementar o SP em 2.

Se a rotina do tipo inter-segmento, ento: Retirar outra palavra do topo da pilha e move-la para o CS. Incrementar o SP em 2.

Formato: RET Flags: Nenhum afetado

m1) INT - Interrupo Propsito: Alterar o fluxo normal de execuo do programa, desviando-se para uma rotina de interrupo, cujo vetor (endereo formado por CS:IP) est presente numa tabela nos primeiros 1024 bytes da memria. A tabela de vetores de interrupo tem 256 entradas, cada qual com 4 bytes (os dois primeiros contendo o valor do IP e os dois seguintes o valor do CS), que indicam o endereo de uma rotina na memria. Procedimento da instruo: Decrementa o SP em 2 e salva o registrador de flags na pilha Apaga os bits IF e TF, desabilitando futuras interrupes de hardware Decrementa o SP em 2, salva o CS na pilha e coloca a palavra de mais alta ordem do vetor selecionado em CS Decrementa o SP em 2, salva o IP na pilha e carrega-o com a palavra de baixa ordem dentro do vetor selecionado. A prxima instruo a ser executada ser ento a primeira dentro da rotina de interrupo.

Formato: INT tipo Flags: Afetados: IF e TF

n1) IRET - Retorno de uma interrupo Propsito: Retornar de uma rotina de tratamento de interrupo. Esta instruo simplesmente recupera da pilha o contedo dos registradores que foram automaticamente salvos, na ocorrncia da interrupo. Operao da instruo Retirar uma palavra do topo da pilha e move-la para o IP. Incrementar o SP em 2. Retirar outra segunda palavra do topo da pilha e move-la para o CS. Incrementar o SP em 2. Retirar outra terceira palavra do topo da pilha e move-la para o registrador de flags. Incrementar o SP em 2.

Formato: IRET Flags: Todos so afetados

3.5.2 - Instrues de transferncia de controle condicional


As instrues de controle condicional so desvios (jumps) que transferem a execuo do programa caso o estado de um flag seja o mesmo que o especificado pela instruo.

o1) J(condio) - Desvio curto se condio satisfeita Propsito: Desviar o fluxo do processamento para o operando-alvo, se uma condio testada for encontrada. A distncia do endereo-alvo, para onde se quer direcionar o desvio, deve estar na faixa de -128 a +127 bytes da prxima instruo. Observao: Above e below referem-se a relao entre dois valores no sinalizados e greater e less, relao entre dois valores sinalizados

Desvios condicionais no sinalizados Mnemnico Estado dos flags Descrio JA/JNBE (CF ou ZF)=0 Acima/No abaixo ou JAE/JNB CF=0 igual Acima ou igual/No abaixo

JB/JNAE JBE/JNA JC JE/JZ JNC JNE/JNZ JNP/JPO

CF=1 (CF ou ZF)=1 CF=1 ZF=1 CF=0 ZF=0 PF=0

Abaixo/No acima ou igual Abaixo ou igual/No acima Carry Igual/Zero No carry No igual/No zero Sem paridade/Paridade mpar

Desvios condicionais sinalizados JG/JNLE ((SF OF) ou ZF)=0 Maior/No menor ou JGE/JNL JL/JNGE JLE/JNG JNO JNS (SF OF)=0 (SF OF)=1 ((SF OF) ou ZF)=1 OF=0 SF=0 igual Maior ou igual/No menor Menor/No maior ou igual Menor ou igual/No maior Sem estouro (overflow) Sem sinal (no negativo)

Formato: J(condio) alvo_curto Flags: Nenhum afetado

3.5.3 - Instrues de LOOP


As instrues de loop so desvios condicionais que se utilizam do registrador CX como contador do nmero de vezes que um bloco de

instrues deve ser executado. Todas as instrues de loop sempre decrementam o contedo do registrador CX quando executadas e terminam se esta operao zerar o mesmo. Em quatro das cinco formas possveis, o flag ZF pode ser utilizado para finalizar o loop mesmo que o contedo do registrador CX no seja zero.

m1) LOOP - Retornar at a contagem ser completada Propsito: Decrementar o contedo do registrador contador CX e provocar um desvio no fluxo do processamento para o endereo-alvo, se o valor em CX ainda no for zero. A distncia para o desvio deve estar na faixa de 128 bytes para trs ou 127 para a frente, em relao ao endereo da instruo que segue o loop. Formato: LOOP alvo Flags: Nenhum afetado

n1) LOOPE/LOOPZ Retornar se igual / zero Propsito: Decrementar o contedo do registrador contador CX e provocar um desvio no fluxo do processamento para o endereo-alvo, se o valor em CX ainda no for zero e se o flag ZF=1. A distncia para

o desvio deve estar na faixa de 128 bytes para trs ou 127 para a frente, em relao ao endereo da instruo que segue o loop. Formato: LOOPE alvo ou LOOPZ alvo Flags: Nenhum afetado

o1) LOOPNE/LOOPNZ Retornar se diferente / no zero Propsito: Decrementar o contedo do registrador contador CX e provocar um desvio no fluxo do processamento para o endereo-alvo, se o valor em CX ainda no for zero e se o flag ZF=0. A distncia para o desvio deve estar na faixa de 128 bytes para trs ou 127 para a frente, em relao ao endereo da instruo que segue o loop. Formato: LOOPNE alvo ou LOOPNZ alvo Flags: Nenhum afetado

3.6 - Operaes com string


As operaes com string manipulam grande quantidade de dados em memria, como por exemplo, uma cadeia de caracteres. As instrues so: MOVS - Move string

CMPS - Compara string SCAS - Scan (busca) string LODS - Load (carrega) string STOS - Store (armazena) string

O processador possui dois registradores especiais para manipulao de strings. So eles: SI - Registrador de ndice de fonte DI - Registrador de ndice de destino Aps a execuo de uma operao string, estes registradores so automaticamente incrementados ou decrementados em acordo com o valor do flag de direo. O incremento ou decremento, ser de acordo com o tamanho do elemento da string, o qual pode ser um byte ou uma word.

p1) MOVS/MOVSB/MOVSW - Move string de bytes ou words Propsito: Mover o byte ou word endereada pelo contedo de SI, dentro do segmento de dados, para a posio de memria indicada pelo contedo de DI, dentro do segmento extra. Aps a operao, ambos os registradores de ndice (SI e DI) so automaticamente incrementados ou decrementados, caso o flag de direo esteja resetado ou setado, respectivamente. O valor do incremento/decremento de 1 ou 2, dependendo se a operao envolve dados do tipo byte ou word, respectivamente.

Diante desta instruo, pode-se utilizar o prefixo REP, que provocar uma repetio contnua, de acordo com o nmero de vezes especificado em CX, permitindo assim a movimentao de blocos de memria. Formato: MOVSB ou MOVSW Flags: Nenhum afetado

Exemplo:

MOV SI,1000H MOV DI,1500H MOV CX,200H CLD REP MOVSW

; Enderea a rea de origem ; Enderea a rea de destino ; Contador em CX ; Reseta o flag de direo ; Move 200H words

q1) CMPS/CMPSB/CMPSW - Compara duas string do tipo byte ou word Propsito: Comparar, efetuando uma subtrao entre o byte ou word endereada por DI dentro do segmento extra e o byte ou word endereada por SI dentro do segmento de dados. Aps a subtrao os flags so alterados de acordo com o resultado mas o mesmo desprezado. A instruo incrementa/decrementa automaticamente os registradores de ndice SI e DI desde que o flag de direo esteja resetado ou setado, respectivamente. O incremento/decremento ser

de 1 ou 2, caso os dados comparados sejam do tipo byte ou word, respectivamente. Formato: CMPSB ou CMPSW Flags: Afetados AF, CF, OF, PF, SF, ZF. Exemplos: Considere que o registrador SI contenha o valor 1255H, DI contenha o valor 0761H, DF=0, a posio apontada por SI dentro do segmento de dados contenha a palavra 9988H e a posio apontada por DI dentro do segmento extra contenha a palavra 9988H. Aps a execuo de CMPSW, o registrador SI conter o valor 1257H, DI ter 0763H e os flags CF e ZF, os mais relevantes de serem avaliados aps a instruo, estaro sinalizando: ZF = 1: os contedos dos operandos so iguais CF = 0: O elemento indicado por DI menor ou igual ao

elemento indicado por SI r1) SCAS/SCASB/SCASW - Busca byte ou word Propsito: Comparar o elemento indicado por DI, dentro do segmento extra, com o contedo do acumulador. A instruo efetua a subtrao do byte ou palavra indicada por DI do contedo do acumulador AL ou AX, afetando porm somente os flags, e no os operandos. Aps a comparao, o registrador DI automaticamente incrementado ou decrementado, dependendo do estado do flag de direo. O valor do incremento ou decremento 1 ou 2, dependendo se a comparao foi realizada entre operandos do tipo byte ou word, respectivamente.

Diante desta instruo, pode-se utilizar o prefixo REP, que provocar uma repetio contnua, de acordo com o nmero de vezes especificado em CX, permitindo assim repetir a comparao em uma seqncia de elementos, at encontrar um que seja igual ou diferente ao contedo do acumulador. Formato: SCASB ou SCASW Flags: Afetados: AF, CF, OF, PF, SF, ZF. Exemplo: MOV CX,100 MOV DI,400 inicial de pesquisa MOV AL,FF comparado CLD incrementado REPNZ SCASB ZF=0 ; Compara e repete enquanto CX 0 e ; Reseta o flag de direo, DI ser ; Grava em AL FFH, o dado a ser ; Grava em CX 0100H ; Grava em DI 0400H, endereo

s1) STOS/STOSB/STOSW - Grava na memria um byte ou word armazenado no acumulador Propsito: Mover o contedo do acumulador para a posio de memria indicada pelo registrador DI, dentro do segmento extra de dados. STOSB move o contedo de AL para a posio indicada por ES:DI e STOSW move o contedo de AX para a posio de memria

indicada por ES:DI. Aps a movimentao dos dados, o registrador DI automaticamente incrementado ou decrementado, dependendo do estado do flag de direo. O valor do incremento ou decremento 1 ou 2, dependendo se foi movido um byte ou uma word, respectivamente. Diante desta instruo, pode-se utilizar o prefixo REP, que provocar uma repetio contnua, de acordo com o nmero de vezes especificado em CX, permitindo assim que um bloco de memria seja preenchido com um dado valor. Formato: STOSB ou STOSW Flags: Nenhum afetado Exemplo: CLD MOV DI,1000H MOV CX, 300H MOV AX, FFFFH partir de ES:DI com FFFFH ; Reseta o flag de direo ; Endereo inicial da rea destino ; Contador em CX ; Valor a preencher as posies a ; Preenche 300H words

REP STOSW

t1) LODS/LODSB/LODSW - Grava no acumulador um byte ou word copiado da memria Propsito: Mover um byte ou word da posio de memria indicada pelo registrador SI, dentro do segmento de dados para o acumulador. LODSB move para AL um byte na posio indicada por DS:SI e LODSW

move para AX uma word na posio de memria indicada por DS:SI. Aps a movimentao dos dados, o registrador SI automaticamente incrementado ou decrementado, dependendo do estado do flag de direo. O valor do incremento ou decremento 1 ou 2, dependendo se foi movido um byte ou uma word, respectivamente. Formato: LODSB ou LODSW Flags: Nenhum afetado

Exemplo: Considere que o registrador SI contenha o valor 1234H, DF=0 e que a posio de memria indicada por SI, dentro do segmento de dados, contenha a palavra 1100H. Aps a instruo LODSW , o registrador AX conter o valor 1100H e o registrador SI conter o valor 1236H, indicando a prxima palavra a ser acessada.

3.6.1 - Prefixos de repetio


Os prefixos de repetio, especificam mais de uma execuo de uma mesma instruo de string. Quando acompanha uma instruo de string, a operao repetida at que uma das condies de trmino, especificada no prefixo, seja satisfeita Para cada repetio, a operao pode ser suspensa por uma interrupo ou exceo. Aps ter sido atendida a exceo ou a interrupo, a operao reinicializa do ponto onde foi suspensa. Desta forma, a resposta do sistema a uma interrupo no fica comprometida pela execuo de uma instruo com string.

u1) REP/REPZ ou REPE/REPNZ ou REPNE - Repita operao de string Propsito: Prefixos usados para repetir a instruo string seguinte pelo nmero de vezes especificado em CX. Diante das instrues MOVS, LODS e STOS, pode-se usar o prefixo REP, que decrementa o registrador CX (sem afetar os flags) e repete a instruo string enquanto CX 0. Diante das instrues CMPS e SCAS, pode-se usar os prefixos REPZ ou REPNZ. REPZ decrementa o registrador CX (sem afetar os flags) e repete a instruo string enquanto CX 0 e ZF =1. O prefixo REPNZ decrementa o contador CX (sem afetar os flags) e provoca a repetio da instruo string enquanto CX 0 e ZF=0. Formato: REP REPZ REPNZ instruo_string instruo_string instruo_string

Flags: Sero aqueles afetados pela instruo_string

Exemplo: Considere que se queira preencher um bloco de memria, com 512 bytes de extenso, com o valor inicial 20H. CLD MOV CX,200 ; Reseta o flag de direo ; Contador em CX

MOV DI,1000 MOV AX,2020 REP (ES:DI) STOSW

; Enderea a rea de memria ; Dados em AH e AL ; Preenche 200 palavras a partir de ES:1000

3.7 - Instrues de controle de flag


3.7.1 - Instrues de controle do flag de direo, flag carry e de interrupo
As instrues de controle de carry so teis em conjunto com as instrues de rotaes com carry com o RCL e RCR. Pode-se a partir delas, inicializar o contedo do flag carry que ser carregado em um operando.

v1) CLC - Reseta o flag carry Propsito: Resetar o bit CF no registrador de flags Formato: CLC Flags: Afetado: CF

x1) CMC - Complementa o flag carry Propsito: Complementar o estado do bit CF no registrador de flags. Se o valor de CF era 1, ele passar a 0, e vice-versa.

Formato: CMC Flags: Afetado: CF

w1) STC - Seta o flag carry Propsito: Setar o bit CF no registrador de flags Formato: STC Flags: Afetado: CF

y1) CLD - Reseta o flag de direo Propsito: Resetar o bit DF no registrador de flags, forando assim, o incremento dos registradores de ndice aps a execuo de uma das instrues string. Formato: CLD Flags: Afetado: DF

z1) STD - Seta o flag de direo Propsito: Setar o bit DF no registrador de flags, forando assim, o decremento dos registradores de ndice aps a execuo de uma das instrues string. Formato: STD

Flags: Afetado: DF

a2) CLI - Reseta o flag de interrupo Propsito: Resetar o bit IF no registrador de flags, desabilitando as interrupes mascarveis externas, que aparecem na linha INTR do processador. Formato: CLI Flags: Afetado: IF

b2) STI - Seta o flag de interrupo Propsito: Setar o bit IF no registrador de flags, habilitando as interrupes mascarveis externas, que aparecem na linha INTR do processador. Formato: STI Flags: Afetado: IF

3.7.2 - Instrues de transferncia de flags


Apenas os flags CF, DF e IF, possuem instrues especificas que permitem a alterao de seus estados diretamente. Para acessar os demais indicadores as instrues de transferncia de flags devem ser utilizadas para movimentar o contedo do registrador de flags (F) para o registrador AH ou a pilha, onde ento, podero ser alterados e em seguida retornados para o registrador de flags (F).

c2) LAHF - Carregar o contedo do registrador de flags em AH Propsito: Mover os bits dos registradores de flags SF, ZF, AF, PF e CF para o registrador AH, mantendo a mesma posio relativa que ocupam na parte baixa no registrador de flags. Os demais bits no so movidos.. Formato: LAHF Flags: Nenhum afetado

d2) SAHF - Armazena contedo de AH no registrador de flags Propsito: Transferir bits especficos do registrador AH, mantendo a mesma posio relativa, para a parte baixa do registrador de flags. Os demais bits no so movidos. (SF)=bit 7 de AH (ZF)=bit 6 de AH (AF)=bit 4 de AH (PF)=bit 2 de AH (CF)=bit 0 de AH Formato: SAHF Flags: Afetados: AF, CF, PF, SF, ZF.

e2) PUSHF - Grava o contedo do registrador de flags na pilha Propsito: Colocar, na rea de memria usada como pilha, o contedo do registrador de flags. Modo de operao: Idntico ao da instruo PUSH Formato: PUSHF Flags: Nenhum afetado

f2) POPF - Copia word da pilha para o registrador de flags. Propsito: Retirar a palavra no topo da pilha e mov-la para o registrador de flags. Sua operao idntica a da instruo POP. Formato: POPF Flags: Todos so afetados

3.8 - Instrues de acesso a portas de entrada e sada


g2) IN - L byte ou word de uma porta de E/S Propsito: Transferir dados (byte ou word) de uma porta de entrada para o acumulador AL ou AX.

A porta identificada com um valor de 8 bits que permite a acesso a portas cujos endereos variam de 0 a 255, ou com o uso de DX que, sendo de 16 bits, permite a especificao de endereos de portas que variam de 0 a 65535. Formato: IN IN acumulador, porta acumulador, DX ou

Flags: Nenhum afetado

Exemplo:

IN AL, 38H

; Transfere para AL, o byte na porta de

entrada 38H. IN AX,DX entrada especificada ; Transfere para AX, a word na porta de pelo registrador DX.

h2) OUT - Escreve byte ou word em uma porta de E/S Propsito: Transferir um byte ou uma word, presente no acumulador AL ou AX, respectivamente, para uma porta de sada. A porta identificada com um valor de 8 bits que permite a acesso a portas cujos endereos variam de 0 a 255, ou com o uso de DX que, sendo de 16 bits, permite a especificao de endereos de portas que variam de 0 a 65535. Formato: OUT OUT porta, acumulador DX, acumulador ou

Flags: Nenhum afetado

Exemplo: em AL.

OUT 61H,AL ; Transfere para a porta de sada 61H, o byte

OUT DX,AL

; Transfere para a porta de sada gravado em AL.

especificada em DX, o byte

3.9 - Instrues de uso geral


Algumas instrues no se encaixam em nenhuma das categorias apresentadas at agora. No entanto, como so importantes, so reunidas nesse bloco de instrues de uso geral. i2) LEA - Carrega endereo efetivo em um registrador Propsito: Carregar o offset de um endereo ou deslocamento de um operando na memria, para um registrador de 16 bits, especificado na prpria instruo. Formato: LEA destino, fonte Flags: Nenhum afetado

Exemplos:

mensagem DB LEA

Curso Assembler $

DX, mensagem

LEA

SI,[BX+DI+5]

No primeiro caso, o registrador DX conter o valor do endereo associado ao label mensagem; no segundo, o registrador SI conter o valor do endereo de memria do operando indicado pela somatria de BX e DI com 5.

j2) XCHG

- Trocar

Propsito: Permutar o contedo de dois operandos, que podem ser dois registradores ou um registrador e uma posio de memria.. Formato: XCHG destino,fonte Flags: Nenhum afetado

Exemplos:

XCHG AL,CH XCHG SI,DI

; Permuta o contedo de AL e CH ; Permuta o contedo de SI e

DI XCHG AL,[BX+2] posio de (BX+2) XCHG [SI],AX apontada por SI com o ; Permuta o contedo da posio contedo de AL ; Permute o contedo de AL com o da memria apontada por

k2) XLAT

- Converter

Propsito: Converter um valor presente em AL acessando uma tabela previamente endereada por BX, com no mximo 256 valores, usando o valor em AL como ndice desta tabela. O Byte assim endereado ento colocado no prprio registrador AL. Formato: XLAT Flags: Nenhum afetado

Exemplo: Considere que no endereo DS:0300 de memria, haja uma tabela com os seguintes valores: 12 14 16 18 20 22 24 26 28 30 32 34...

Aps a seqncia de instrues MOV BX,0300H MOV AL,04H XLAT o registrador AL conter o valor 20. Isto , o valor inicial 04 foi convertido para 20 (elemento de ndice 04). O primeiro elemento da tabela tem ndice 00.

Você também pode gostar