Escolar Documentos
Profissional Documentos
Cultura Documentos
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
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.
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
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
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
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
Exemplo:
PUSH SI PUSH 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
DS [DI]
; Grava em DS a word no topo da pilha ; Grava na posio de memria apontada por da pilha
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
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.
Exemplos: AL
ADD
AL,04H
byte ptr[300],05H ; Adiciona 05H ao contedo da memria DS:0300 AX,SI ; Adiciona o contedo de SI ao
DL,[300]
[SI+BX+2],AL
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
AL e ento soma
ADC
ADC contedo de AX
AX,SI
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
; Subtrai o contedo de
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
e ento subtrai contedo do flag carry SBB posio de subtrai do resultado o flag carry SBB AX,CX byte ptr[DI],05H
em DS:SI do contedo ento subtrai do resultado o contedo do flag carry SBB contedo da [BX+2],DL
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
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
CMP
AL,57H
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
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
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
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
DH
word ptr[BX+100]
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
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.
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
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
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
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.
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
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).
Formato:
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.
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
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
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.
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 DX,1
SAL BH,CL BH, o nmero de CL, SAL byte ptr[BX],1 de memria DS:BX, esquerda.
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:
Exemplos:
SAR AL,CL
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:
Exemplos:
SHR AL,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.
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: -----------
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,
dword ptr[BX]
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
; Direta, inter-segmento
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.
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.
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.
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
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)
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
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:
; 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.
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
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
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.
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
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
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
Exemplo:
IN AL, 38H
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
Exemplo: em AL.
OUT DX,AL
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:
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.