Você está na página 1de 20

LINGUAGEM ASSEMBLY PARTE II - 1 _______________________________________________________________________________________________

CONJUNTO DE INSTRUES DE PROCESSADOR 8086 E 8086 (INTEL)

Introduo Essas notas de aula objetivam mostrar de forma sucinta as instrues da linguagem montadora (assembly) do DEBUG, um depurador em nvel de linguagem de mquina que nativo do Sistema Operacional DOS. O interpretador dessa linguagem montadora do DEBUG para processador da linha Intel, modelos 8086 e 8088. Mesmo o atual Sistema Operacional Windows XP apresenta um emulador desse DEBUG (com ainda interpretador para processador Intel 8086 e 8088). O objetivo de se usar esse DEBUG mostrar aos alunos a estrutura interna de um computador (paradigma Von Neumann), o padro IBM-PC, como ele funciona, a representao de informaes na memria (instrues e dados), como o computador distingue instrues de dados, a representao de valores numricos e de caracteres alfanumricos ASCII. Nesses aspectos o aplicativo DEBUG uma boa ferramenta.

ARQUITETURA DE UM MICROPROCESSADOR DA LINHA INTEL (Modelo de arquitetura baseado em Von Neumann).


UE: Unidade de Execuo AH BH CH DH SP BP SI DI AL BL CL DL Controle do Programa CS DS SS ES Unidade de Controle do Barramento 1 ULA : Unidade Lgica e Aritmtica 2 3 UCP : Unidade Central de Processamento Registrador de Flags 4 . . . n Fila de Instrues

Barramento

Ponteiro de Instruo

LINGUAGEM ASSEMBLY PARTE II - 2 _______________________________________________________________________________________________

AX

Registrador Acumulador

AH AL

Byte mais significativo de AX Byte menos significativo de AX Byte mais significativo de BX Byte menos significativo de BX Byte mais significativo de CX Byte menos significativo de CX Byte mais significativo de DX Byte menos significativo de DX

BX

Registrador Base

BH BL

CX

Registrador Contador

CH CL

DX

Registrador de Dados

DH DL

SP BP SI DI CS DS SS ES IP F

Registrador Apontador de Pilha Registrador Apontador de Base da Pilha Registrador de ndice Fonte Registrador de ndice Destino Registrador de Segmento de Cdigo Registrador de Segmento de Dados Registrador de Segmento de Pilha Registrador de Segmento Extra Registrador Apontador da Prxima Instruo Registrador de Flags

LINGUAGEM ASSEMBLY PARTE II - 3 _______________________________________________________________________________________________

INSTRUO MOV Instruo: MOV Propsito: Mover dado Sintaxe: MOV destino, fonte Esta instruo transfere dado entre registradores ou entre registrador e memria, transferncia imediata de dado para registrador. O dado referenciado define o nmero de bytes a ser movido (1, 2 ou 4); os operandos devem estar de acordo em tamanho. Flags afetados: nenhum Destino Registrador* Memria Registrador Registrador** Fonte Registrador Registrador Memria Valor

Se registrador destino for registrador de segmento, ento o registrador fonte no pode ser registrador de segmento

No pode ser registrador de segmento

INSTRUES DEC e INC Instruo: DEC Propsito: Decrementar de 1 o contedo de um registrador Sintaxe: DEC registrador Esta instruo decrementa de 1 o contedo de registrador. Flags afetados: OF, SF e ZF Instruo: INC Propsito: Incrementar de 1 o contedo de um registrador Sintaxe: INC registrador Esta instruo incrementa de 1 o contedo de registrador. Flags afetados: OF, SF e ZF

LINGUAGEM ASSEMBLY PARTE II - 4 _______________________________________________________________________________________________

INSTRUES DE ADIO E SUBTRAO Instruo ADD Propsito: Efetuar a soma de dois operandos Sintaxe: ADD destino, fonte Essa instruo soma o destino e fonte, colocando o resultado em destino. Flags afetados: AF, CF, OF, PF, e ZF Destino Registrador Memria Registrador Registrador Fonte registrador registrador memria valor

Instruo ADC Propsito: Efetuar a soma de dois operando e CF Sintaxe: ADC destino, fonte Essa instruo soma destino, fonte e CF, colocando o resultado em destino. Flags afetados: AF, CF, OF, PF, SF, e ZF

Destino registrador memria registrador registrador

Fonte registrador registrador memria valor

LINGUAGEM ASSEMBLY PARTE II - 5 _______________________________________________________________________________________________

Instruo SUB Propsito: Efetuar a subtrao de um operando de um outro. Sintaxe: SUB destino, fonte Essa instruo subtrai de destino o fonte, colocando o resultado em destino. Flags afetados: AF, CF, OF, PF, SF, e ZF Destino registrador memria registrador registrador Fonte registrador registrador memria valor

Instruo SBB Propsito: Efetuar a subtrao de um operando de um outro, levando-se em considerao o empresta um da operao anterior. Sintaxe: SBB destino, fonte Essa instruo subtrai de destino o fonte, levando-se em considerao o empresta um da operao anterior, colocando o resultado em destino. Flags afetados: AF, CF, OF, PF, SF, e ZF Destino registrador memria registrador registrador Fonte registrador registrador memria valor

LINGUAGEM ASSEMBLY PARTE II - 6 _______________________________________________________________________________________________

INSTRUES MUL e IMUL Instruo MUL Propsito: Multiplicao sem sinal Sintaxe: MUL fonte Esta instruo realiza uma multiplicao no sinalizada entre o contedo do acumulador AL ou AX pelo operando fonte. Se o fonte for de apenas 8 bits, a multiplicao feito entre AL e fonte, devolvendo o resultado em AX. Se o fonte de 16 bits, a multiplicao feita entre AX e fonte, devolvendo o resultado em DX:AX (em DX a parte mais significativa e em AX a parte menos significativa). Flags afetados: CF e OF Fonte: registrador

Instruo IMUL Propsito: Multiplicao com sinal Sintaxe: IMUL fonte Esta instruo realiza uma multiplicao da mesma forma que MUL, porm, levando-se em considerao o sinal. Flags afetados: CF e OF Fonte: registrador

LINGUAGEM ASSEMBLY PARTE II - 7 _______________________________________________________________________________________________

INSTRUES DIV e IDIV Instruo DIV Propsito: Dividir um dividendo sem sinal por um divisor sem sinal. Ela trata o bit mais a esquerda como um bit de dado, e no como bit de sinal. A diviso por zero, provoca a interrupo diviso por zero. Sintaxe: DIV divisor O dividendo sempre considerado o registrador(es): AX DX:AX EDX:EAX se de 16 bits se de 32 bits se de 64 bits

Flags afetados: AF, CF, OF, PF, SF, e ZF (todos indefinidos) Dividendo AX DX:AX (16bits) (32 bits) Divisor Registrador de 8 bits Registrador de 16 bits Registrador de 32 bits Quociente AL AX EAX Resto AH DX EDX

EDX:EAX (64 bits)

Instruo IDIV Propsito: Dividir um dividendo com sinal por um divisor com sinal. Ela trata o bit mais a esquerda como um bit de sinal. A diviso por zero, provoca a interrupo diviso por zero. Sintaxe: IDIV dividendo, divisor O dividendo sempre considerado o registrador(es): AX DX:AX EDX:EAX se de 16 bits se de 32 bits se de 64 bits

Flags afetados: AF, CF, OF, PF, SF, e ZF Dividendo 16 bits AX 32 bits - DX:AX 64 bits EDX:EAX Divisor Registrador de 8 bits Registrador de 16 bits Registrador de 32 bits Quociente AL AX EAX Resto AH DX EDX

LINGUAGEM ASSEMBLY PARTE II - 8 _______________________________________________________________________________________________

INSTRUO JMP Propsito: Desviar incondicionalmente o controle de execuo para uma outra parte do programa Sintaxe: JMP rtulo Essa operao faz com que o fluxo de execuo do programa desvie incondicionalmente para rtulo. Flags afetados: nenhum

INSTRUES LOOP, LOOPE e LOOPNE Instruo LOOP Propsito: Gerar um lao no programa Sintaxe: LOOP rtulo Essa instruo automaticamente decrementa o contedo do registrador CX de 1, e transfere a execuo do programa para rtulo se CX diferente de zero; caso contrrio executa a instruo que segue esta instruo (LOOP). Rtulo deve ser um short address (endereo entre 12810 a 12710). Flags afetados: nenhum Instruo LOOPE Propsito: Gerar um lao no programa, considerando o contedo de CX e estado de ZF Sintaxe: LOOPE rtulo Essa instruo decrementa o contedo de CX de 1. Se CX diferente de zero e ZF igual a 1, ento a execuo do programa transferido para rtulo. Rtulo deve ser um short address (endereo entre 12810 a 12710). Flags afetados: nenhum

LINGUAGEM ASSEMBLY PARTE II - 9 _______________________________________________________________________________________________

Instruo LOOPNE Propsito: Gerar um lao no programa, considerando o estado de ZF Sintaxe: LOOPNE rtulo Essa instruo decrementa o contedo de CX de 1. Se CX diferente de zero e ZF igual a zero, ento desvia o controle de execuo do programa para rtulo. Rtulo deve ser um short address (endereo entre 12810 a 12710). Flags afetados: nenhum

REGISTRADOR DE FLAGS

15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 O D I T S Z A P C

N do Bit Flag

CF (Carry Flag): ajustado para 1, se quando execuo de uma operao aritmtica e algumas operaes de deslocamento e rotao, ocorreu um vai 1 do bit mais significativo do resultado. As instrues JC e JNC testam esse flag. PF (Parity Carry): se o resultado de uma operao qualquer, contiver um nmero impar de 1, esse flag conter 0; caso contrrio, conter 1. AF (Auxiliar carry Flag): preocupado com a aritmtica sobre campos ASCII e BCD. ajustado para 1 se a operao aritmtica de 1 byte provocar um vai um do bit 3 de um registrador. ZF (Zero Flag): ajustado para 1 ou zero, refletindo o resultado de uma operao aritmtica ou operao de comparao. Caso o resultado seja zero ou os operandos comparados forem iguais, ZF ajustado para um, caso contrrio para 0. As instrues JE e JZ testam esse flag. SF (Sign Flag): ajustado de acordo com o sinal do resultado de uma operao aritmtica. Se o resultado for positivo, SF ajustado para zero, caso contrrio, ajustado para 1. As instrues JG e JL testam esse flag.

TF (Trap Flag): quando ajustado para 1, faz com que o processador execute o programa passo a passo (trace). O comando t do Debug faz isso.

LINGUAGEM ASSEMBLY PARTE II - 10 _______________________________________________________________________________________________

IF (Interrupt Flag): quando ajustado para zero, a interrupo desabilitada, e quando ajustado para 1, a interrupo habilitada. DF (Direction Flag): usado pelas operaes sobre cadeia de caracteres (strings), para determinar a direo da transferncia dos dados. Quando esse flag est ajustado para zero, a operao sobre string realiza a transferncia de dados da esquerda para a direita; e no sentido inverso, caso esse flag esteja ajustado para 1. OF (Overflow Flag): indica a ocorrncia de um vai um para e do bit mais significativo do resultado de uma operao aritmtica com sinal. Denominao dos flags pelo Debug: NV / OV No Overflow Overflow UP Up (ou right) direction Disable Interrupt Negative Sign Zero EI / DI Enable Interrupt PL / NG Plus Sign Non Zero No Auxiliar Carry Parity Even Carry Parity Odd No Carry NZ / ZR NA PO / PE NC / CY

INSTRUO CMP Propsito: Comparar dois operandos Sintaxe: CMP destino, fonte Essa instruo compara destino com o fonte, se ambos forem iguais, ento o flag ZF ajustado para 1, caso contrrio, ZF ajustado para zero. Essa instruo pode ou no afetar os outros flags. Flags afetados: AF, CF, OF, PF, SF, e ZF Destino registrador memria registrador registrador Fonte registrador registrador memria valor

LINGUAGEM ASSEMBLY PARTE II - 11 _______________________________________________________________________________________________

INSTRUES DE DESVIOS CONDICIONAIS Propsito: Desviar o fluxo de execuo do programa para um outro trecho, se determinadas condies forem satisfeitas. Sintaxe: Jxxx rtulo Onde xxx, o mnemnico que complementa o mnemnico da instruo especfica, que lembra as condies a serem satisfeitas para que ocorra o desvio do fluxo de execuo do programa. Rtulo deve ser um short address, endereo entre -12810 e 12710.

DESVIOS BASEADOS EM DADOS SEM SINAL (LGICO) INSTRUO SIGNIFICADO FLAGS TESTADOS JE/JZ JNE/JNZ JA/JNBE JAE/JNB JB/JNAE JBE/JNA Jump Equal or Jump Zero Jump Not Equal or Jump Not Zero Jump Above or Jump Not Below or Equal Jump Above or Equal or Jump Not Below Jump Below or Jump Not Above or Equal Jump Below or Equal or Jump Not Above ZF ZF CF, ZF CF CF AF, CF

LINGUAGEM ASSEMBLY PARTE II - 12 _______________________________________________________________________________________________

DESVIOS BASEADOS EM DADOS COM SINAL (ARITMTICA) INSTRUO SIGNIFICADO FLAGS TESTADOS JE/JZ JNE/JNZ JG/JNLE JGE/JNL JL/JNGE JLE/JNG Jump Greater or Jump Not Less or Equal Jump Greater or Equal or Jump Not Less Jump Less or Jump Not Greater or Equal Jump Less or Equal or Jump Not Greater ZF ZF OF, SF, ZF OF, SF OF, SF OF, SF, ZF

DESVIOS BASEADOS EM TESTES ARITMTICOS ESPECIAIS INSTRUO SIGNIFICADO FLAGS TESTADOS JC JNC JO JNO JP/JPE JNP/JPO JS JNS Jump Carry (o mesmo que JB) Jump No Carry Jump Overflow Jump No Overflow Jump Parity or Jump Parity Even Jump No Parity or Jump Parity Odd Jump Sign (negativo) Jump No Sign (positivo) CF CF OF OF PF PF SF SF

LINGUAGEM ASSEMBLY PARTE II - 13 _______________________________________________________________________________________________

INSTRUES AND, OR, XOR, TEST e NOT Instruo AND Propsito: Realizar a operao lgica AND sobre bits de dois operandos. Sintaxe: AND destino, fonte Essa instruo executa a operao lgica AND sobre os bits de destino e fonte, deixando o resultado em destino. Flags afetados: CF(0), OF(0), PF, SF, e ZF (AF indefinido) Destino registrador memria registrador registrador Fonte registrador registrador memria valor

Instruo OR Propsito: Realizar a operao lgica OR sobre bits de dois operandos. Sintaxe: OR destino, fonte Essa instruo executa a operao lgica OR sobre os bits de destino e fonte, deixando o resultado em destino. Flags afetados: CF(0), OF(0), PF, SF, e ZF (AF indefinido) Destino registrador memria registrador registrador Fonte registrador registrador memria valor

LINGUAGEM ASSEMBLY PARTE II - 14 _______________________________________________________________________________________________

Instruo XOR Propsito: Realizar a operao lgica OR exclusivo sobre bits de dois operandos. Sintaxe: XOR destino, fonte Essa instruo executa a operao lgica OR exclusivo sobre os bits de destino e fonte, deixando o resultado em destino. Flags afetados: CF(0), OF(0), PF, SF, e ZF (AF indefinido) Destino registrador memria registrador registrador Fonte registrador Registrador Memria Valor

Instruo NOT Propsito: Realizar a operao lgica NOT sobre bits de seu operando. Sintaxe: NOT destino Essa instruo executa a operao lgica NOT sobre os bits de destino deixando o resultado em destino. Flags afetados: CF(0), OF(0), PF, SF, e ZF (AF indefinido) Destino: registrador

LINGUAGEM ASSEMBLY PARTE II - 15 _______________________________________________________________________________________________

Instruo TEST Propsito: Verificar se configurao de uma palavra segue um determinado padro Sintaxe: TEST operando, padro Essa instruo usa o operador lgico AND para testar se um campo de operando, segue o padro especificado por padro. Depois dessa operao nenhum dos operandos (operando e padro), so afetados, mas, sim, apenas os flags. Dessa forma, aps essa operao pode se usar as instrues JE ou JNE para testar os flags. Flags afetados: CF(0), OF(0), PF, SF, e ZF (AF indefinido) Operando registrador memria registrador registrador Padro registrador Registrador Memria Valor

INSTRUES DE DESLOCAMENTOS E ROTAES Instruo SHR Propsito: Deslocamento lgico dos bits de um registrador para a direita Sintaxe: SHR registrador, desloc
CF

0
Como esta instruo altera CF, pode-se usar as instrues de JC e JNC para testar esse flag. desloc: valor ou o registrador CL Nos processadores 8088/8086, valor deve ser igual a 1. Assim, para executar uma deslocamento de mais do que um bit, pode-se usar o registrador CL para definir o valor de deslocamento. Para os processadores mais modernos, valor pode ser maior do que 1.

LINGUAGEM ASSEMBLY PARTE II - 16 _______________________________________________________________________________________________

Instruo SAR Propsito: Deslocamento aritmtico dos bits de um registrador para a direita Sintaxe: SHR registrador, desloc

Sinal

CF

Como esta instruo altera CF, pode-se usar as instrues de JC e JNC para testar esse flag. desloc: valor ou o registrador CL Nos processadores 8088/8086, valor deve ser igual a 1. Assim, para executar uma deslocamento de mais do que um bit, pode-se usar o registrador CL para definir o valor de deslocamento. Para os processadores mais modernos, valor pode ser maior do que 1.

Instrues SHL Propsito: Deslocamento lgico dos bits de um registrador para a esquerda. Sintaxe: SHL registrador, desloc
CF

0
Como esta instruo altera CF, pode-se usar as instrues de JC e JNC para testar esse flag. desloc: valor ou o registrador CL. Nos processadores 8088/8086, valor deve ser igual a 1. Assim, para executar uma deslocamento de mais do que um bit, pode-se usar o registrador CL para definir o

LINGUAGEM ASSEMBLY PARTE II - 17 _______________________________________________________________________________________________

valor de deslocamento. Para os processadores mais modernos, valor pode ser maior do que 1. Instruo SAL Propsito: Deslocamento aritmtico dos bits de um registrador para a esquerda. Sintaxe: SAL registrador, desloc Tem o mesmo efeito que SHL. Instruo ROR Propsito: provocar um deslocamento lgico cclico dos bits de um registrador para a direita. Sintaxe: ROR registrador, desloc
CF

Rotaciona os bits de registrador no sentido horrio. A cada giro de 1 bit, o bit menos significativo de registrador copiado em CF. desloc: valor ou registrador CL Nos processadores 8088/8086, valor deve ser igual a 1. Assim, para executar uma deslocamento de mais do que um bit, pode-se usar o registrador CL para definir o valor de deslocamento. Para os processadores mais modernos, valor pode ser maior do que 1.

LINGUAGEM ASSEMBLY PARTE II - 18 _______________________________________________________________________________________________

Instruo RCR Propsito: provocar um deslocamento aritmtico cclico dos bits de um registrador para a direita. Sintaxe: RCR registrador, desloc

CF

Rotaciona os bits de registrador juntamente com o CF (como se CF fizesse parte de registrador), no sentido horrio. desloc: valor ou registrador CL Nos processadores 8088/8086, valor deve ser igual a 1. Assim, para executar uma deslocamento de mais do que um bit, pode-se usar o registrador CL para definir o valor de deslocamento. Para os processadores mais modernos, valor pode ser maior do que 1.

Instruo ROL Propsito: provocar um deslocamento lgico cclico dos bits de um registrador para a esquerda. Sintaxe: ROL registrador, desloc

CF

Rotaciona os bits de registrador no sentido anti horrio. A cada giro de 1 bit, o bit mais significativo de registrador copiado em CF. desloc: valor ou registrador CL Nos processadores 8088/8086, valor deve ser igual a 1. Assim, para executar uma deslocamento de mais do que um bit, pode-se usar o registrador CL para definir o valor de deslocamento. Para os processadores mais modernos, valor pode ser maior do que 1.

LINGUAGEM ASSEMBLY PARTE II - 19 _______________________________________________________________________________________________

Instruo RCL Propsito: provocar um deslocamento aritmtico cclico dos bits de um registrador para a esquerda. Sintaxe: RCL registrador, desloc
CF

Rotaciona os bits de registrador juntamente com o CF (como se CF fizesse parte de registrador), no sentido anti horrio. desloc: valor ou registrador CL Nos processadores 8088/8086, valor deve ser igual a 1. Assim, para executar uma deslocamento de mais do que um bit, pode-se usar o registrador CL para definir o valor de deslocamento. Para os processadores mais modernos, valor pode ser maior do que 1.

INSTRUES SOBRE FLAGS Instruo Propsito

CLC CLD CLI

Zerar o CF (Carry Flag) Zerar o DF (Direction Flag) Zerar o IF (Interrupt Flag: desabilita as interrupes mascarveis externas)

CMC STC STD STI

Complementar o CF: se CF = 0, torna CF = 1, e vice versa. Faz CF = 1 Faz DF = 1 Faz IF = 1 (habilita as interrupes mascarveis externas)

LINGUAGEM ASSEMBLY PARTE II - 20 _______________________________________________________________________________________________

INSTRUES PARA MOVIMENTOS DE STRINGS: MOVSB, MOVSW e MOVSD Essas instrues servem para movimentar (copiar para ser exato) dados entre locaes de memria. Normalmente essas instrues so prefixadas com a instruo REP (REPeat repetir). Quando precedido com REP, usado o registrador CX como contador de repetio. Essas instrues utilizam como operandos os seguintes registradores e flag:

DS:SI ES:DI DF

Endereo de locao fonte de memria onde se encontra a string a ser copiada Endereo de locao destino de memria para onde ser copiada a string Flag de direo. Se DF = 0 a copia da string ser feita da esquerda para a direita Se DF = 1 a cpia ser da direita para a esquerda.

CX

Contador de vezes que a operao de cpia dever ser executada

Instruo MOVSB Propsito: mover (copiar) o byte apontados por DS:SI para a posio apontada por ES:DI. Sintaxe: MOVSB

Instruo REP MOVSB Propsito: mover (copiar) a cadeia de bytes (string de bytes) apontada por DS:SI para a posio apontada por ES:SI. Sintaxe: REP MOVSB OBSERVAES: Se o flag de direo (DF) est igual a 0, os bytes da string sero copiados da esquerda para a direita, caso contrrio, da direita para a esquerda. O nmero de bytes a ser copiado determinado pelo registrador CX.

Instruo MOVSW: move uma palavra (dois bytes) Instruo MOVSD: move dupla palavra (quatro bytes)