Você está na página 1de 20

LINGUAGEM ASSEMBLY – PARTE II - 1

CONJUNTO DE INSTRUÇÕES DE PROCESSADOR 8086 E 8086 (INTEL)

Introdução

Essas notas de aula objetivam mostrar de forma sucinta as instruções da linguagem montadora (“assembly”) do DEBUG, um depurador em nível de linguagem de máquina 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 padrão IBM-PC, como ele funciona, a representação de informações na memória (instruções e dados), como o computador distingue instruções de dados, a representação de valores numéricos e de caracteres alfanuméricos 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 Execução

AH AL BH BL CH CL Controle do Programa DH DL SP CS BP DS
AH
AL
BH
BL
CH
CL
Controle do Programa
DH
DL
SP
CS
BP
DS
SI
SS
DI
ES
Unidade de
Controle do
Barramento
Barramento
1
ULA : Unidade Lógica e Aritmética
2
Fila de
3
Instruções
UCP : Unidade Central de
Processamento
4
.
Registrador de Flags
.
.
Ponteiro de Instrução
n

LINGUAGEM ASSEMBLY – PARTE II - 2

AX

Registrador Acumulador

AH

Byte mais significativo de AX

AL

Byte menos significativo de AX

BX

Registrador Base

BH

Byte mais significativo de BX

BL

Byte menos significativo de BX

CX

Registrador Contador

CH

Byte mais significativo de CX

CL

Byte menos significativo de CX

DX

Registrador de Dados

DH

Byte mais significativo de DX

DL

Byte menos significativo de DX

SP

Registrador Apontador de Pilha

   

BP

Registrador Apontador de Base da Pilha

   

SI

Registrador de Índice Fonte

   

DI

Registrador de Índice Destino

   

CS

Registrador de Segmento de Código

   

DS

Registrador de Segmento de Dados

   

SS

Registrador de Segmento de Pilha

   

ES

Registrador de Segmento Extra

   

IP

Registrador Apontador da Próxima Instrução

   

F

Registrador de Flags

   

LINGUAGEM ASSEMBLY – PARTE II - 3

INSTRUÇÃO MOV

Instrução: MOV Propósito: Mover dado Sintaxe:

MOV destino, fonte Esta instrução transfere dado entre registradores ou entre registrador e memória, transferência imediata de dado para registrador. O dado referenciado define o número de bytes a ser movido (1, 2 ou 4); os operandos devem estar de acordo em tamanho.

Flags afetados: nenhum

Destino

Fonte

Registrador*

Registrador

Memória

Registrador

Registrador

Memória

Registrador**

Valor

Se registrador destino for registrador de segmento, então o registrador fonte não pode ser registrador de segmento

Não pode ser registrador de segmento

INSTRUÇÕES DEC e INC

Instrução: DEC Propósito: Decrementar de 1 o conteúdo de um registrador Sintaxe:

DEC registrador Esta instrução decrementa de 1 o conteúdo de registrador.

Flags afetados: OF, SF e ZF

Instrução: INC Propósito: Incrementar de 1 o conteúdo de um registrador Sintaxe:

INC registrador Esta instrução incrementa de 1 o conteúdo de registrador.

Flags afetados: OF, SF e ZF

LINGUAGEM ASSEMBLY – PARTE II - 4

INSTRUÇÕES DE ADIÇÃO E SUBTRAÇÃO

Instrução ADD

Propósito: Efetuar a soma de dois operandos Sintaxe:

ADD destino, fonte

Essa instrução soma o destino e fonte, colocando o resultado em destino. Flags afetados: AF, CF, OF, PF, e ZF

Destino

Fonte

Registrador

registrador

Memória

registrador

Registrador

memória

Registrador

valor

Instrução ADC

Propósito: Efetuar a soma de dois operando e CF Sintaxe:

ADC destino, fonte

Essa instrução soma destino, fonte e CF, colocando o resultado em destino. Flags afetados: AF, CF, OF, PF, SF, e ZF

Destino

Fonte

registrador

registrador

memória

registrador

registrador

memória

registrador

valor

LINGUAGEM ASSEMBLY – PARTE II - 5

Instrução SUB

Propósito: Efetuar a subtração de um operando de um outro. Sintaxe:

SUB destino, fonte

Essa instrução subtrai de destino o fonte, colocando o resultado em destino.

Flags afetados: AF, CF, OF, PF, SF, e ZF

Destino

Fonte

registrador

registrador

memória

registrador

registrador

memória

registrador

valor

Instrução SBB

Propósito: Efetuar a subtração de um operando de um outro, levando-se em consideração o empresta um da operação anterior. Sintaxe:

SBB destino, fonte

Essa instrução subtrai de destino o fonte, levando-se em consideração o empresta um da operação anterior, colocando o resultado em destino.

Flags afetados: AF, CF, OF, PF, SF, e ZF

Destino

Fonte

registrador

registrador

memória

registrador

registrador

memória

registrador

valor

LINGUAGEM ASSEMBLY – PARTE II - 6

INSTRUÇÕES MUL e IMUL

Instrução MUL Propósito: Multiplicação sem sinal Sintaxe:

MUL fonte Esta instrução realiza uma multiplicação não sinalizada entre o conteúdo do acumulador AL ou AX pelo operando fonte.

Se o fonte for de apenas 8 bits, a multiplicação é feito entre AL e fonte, devolvendo o

resultado em AX. Se o fonte é de 16 bits, a multiplicação é 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

Instrução IMUL Propósito: Multiplicação com sinal Sintaxe:

IMUL fonte Esta instrução realiza uma multiplicação da mesma forma que MUL, porém, levando-se em consideração o sinal. Flags afetados: CF e OF Fonte: registrador

LINGUAGEM ASSEMBLY – PARTE II - 7

INSTRUÇÕES DIV e IDIV

Instrução DIV Propósito: Dividir um dividendo sem sinal por um divisor sem sinal. Ela trata o bit mais a esquerda como um bit de dado, e não como bit de sinal. A divisão por zero, provoca a interrupção divisão por zero.

Sintaxe:

DIV divisor

O dividendo é sempre considerado o registrador(es):

AX

se de 16 bits

DX:AX

se de 32 bits

EDX:EAX

se de 64 bits

Flags afetados: AF, CF, OF, PF, SF, e ZF (todos indefinidos)

Dividendo

Divisor

Quociente

Resto

AX

(16bits)

Registrador de 8 bits

AL

AH

DX:AX

(32 bits)

Registrador de 16 bits

AX

DX

EDX:EAX (64 bits)

Registrador de 32 bits

EAX

EDX

Instrução IDIV

 

Propósito: Dividir um dividendo com sinal por um divisor com sinal. Ela trata o bit mais a esquerda como um bit de sinal. A divisão por zero, provoca a interrupção divisão por zero.

Sintaxe:

IDIV dividendo, divisor

O dividendo é sempre considerado o registrador(es):

AX

se de 16 bits

DX:AX

se de 32 bits

EDX:EAX

se de 64 bits

Flags afetados: AF, CF, OF, PF, SF, e ZF

Dividendo

Divisor

Quociente

Resto

16

bits – AX

Registrador de 8 bits

AL

AH

32

bits - DX:AX

Registrador de 16 bits

AX

DX

64

bits – EDX:EAX

Registrador de 32 bits

EAX

EDX

LINGUAGEM ASSEMBLY – PARTE II - 8

INSTRUÇÃO JMP

Propósito: Desviar incondicionalmente o controle de execução para uma outra parte do programa

Sintaxe:

JMP rótulo

Essa operação faz com que o fluxo de execução do programa desvie incondicionalmente para rótulo.

Flags afetados: nenhum

INSTRUÇÕES LOOP, LOOPE e LOOPNE

Instrução LOOP Propósito: Gerar um laço no programa Sintaxe:

LOOP rótulo

Essa instrução automaticamente decrementa o conteúdo do registrador CX de 1, e transfere a execução do programa para rótulo se CX é diferente de zero; caso contrário executa a instrução que segue esta instrução (LOOP). Rótulo deve ser um “short address” (endereço entre –128 10 a 127 10 ).

Flags afetados: nenhum

Instrução LOOPE Propósito: Gerar um laço no programa, considerando o conteúdo de CX e estado de ZF Sintaxe:

LOOPE rótulo

Essa instrução decrementa o conteúdo de CX de 1. Se CX é diferente de zero e ZF é igual a 1, então a execução do programa é transferido para rótulo. Rótulo deve ser um “short address” (endereço entre –128 10 a 127 10 ).

Flags afetados: nenhum

LINGUAGEM ASSEMBLY – PARTE II - 9

Instrução LOOPNE Propósito: Gerar um laço no programa, considerando o estado de ZF Sintaxe:

LOOPNE rótulo

Essa instrução decrementa o conteúdo de CX de 1. Se CX é diferente de zero e ZF é igual a zero, então desvia o controle de execução do programa para rótulo. Rótulo deve ser um “short address” (endereço entre –128 10 a 127 10 ).

Flags afetados: nenhum

REGISTRADOR DE FLAGS

15

14

13

12

11

O

10

D

15 14 13 12 11 O 10 D 09 07 T I S 08 06 Z

09 07

T

I S

08

15 14 13 12 11 O 10 D 09 07 T I S 08 06 Z

06

Z

05

15 14 13 12 11 O 10 D 09 07 T I S 08 06 Z

03

02

04 00

P

A C

01

15 14 13 12 11 O 10 D 09 07 T I S 08 06 Z

N o do Bit

Flag

CF (Carry Flag): é ajustado para 1, se quando execução de uma operação aritmética e algumas operações de deslocamento e rotação, ocorreu um vai 1 do bit mais significativo do resultado. As instruções JC e JNC testam esse flag.

PF (Parity Carry): se o resultado de uma operação qualquer, contiver um número impar de 1, esse flag conterá 0; caso contrário, conterá 1.

AF (Auxiliar carry Flag): preocupado com a aritmética sobre campos ASCII e BCD. É ajustado para 1 se a operação aritmética 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 operação aritmética ou operação de comparação. Caso o resultado seja zero ou os operandos comparados forem iguais, ZF é ajustado para um, caso contrário para 0. As instruções JE e JZ testam esse flag.

SF (Sign Flag): é ajustado de acordo com o sinal do resultado de uma operação aritmética. Se o resultado for positivo, SF é ajustado para zero, caso contrário, é ajustado para 1. As instruções 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 interrupção é desabilitada, e quando ajustado para 1, a interrupção é habilitada.

DF (Direction Flag): é usado pelas operações sobre cadeia de caracteres (“strings”), para determinar a direção da transferência dos dados. Quando esse flag está ajustado para zero, a operação sobre string realiza a transferência de dados da esquerda para a direita; e no sentido inverso, caso esse flag esteja ajustado para 1.

OF (Overflow Flag): indica a ocorrência de um vai um para e do bit mais significativo do resultado de uma operação aritmética com sinal.

Denominação dos flags pelo Debug:

NV / OV

UP

EI /

PL /

NZ / ZR

NA

PO / PE

NC / CY

DI

NG

No

Up (ou

Enable

Plus Sign

Non Zero

No

Parity

No Carry

Overflow

right)

Interrupt

Auxiliar

Odd

direction

Carry

Overflow

 

Disable

Negative

Zero

 

Parity

Carry

Interrupt

Sign

Even

INSTRUÇÃO CMP

 

Propósito: Comparar dois operandos

Sintaxe:

CMP destino, fonte

Essa instrução compara destino com o fonte, se ambos forem iguais, então o flag ZF é ajustado para 1, caso contrário, ZF é ajustado para zero. Essa instrução pode ou não afetar os outros flags.

Flags afetados: AF, CF, OF, PF, SF, e ZF

Destino

Fonte

registrador

registrador

memória

registrador

registrador

memória

registrador

valor

LINGUAGEM ASSEMBLY – PARTE II - 11

INSTRUÇÕES DE DESVIOS CONDICIONAIS

Propósito: Desviar o fluxo de execução do programa para um outro trecho, se determinadas condições forem satisfeitas.

Sintaxe:

Jxxx rótulo

Onde xxx, é o mnemônico que complementa o mnemônico da instrução

específica, que lembra as condições a serem satisfeitas para que ocorra o desvio do fluxo de execução do programa. Rótulo deve ser um “short address”, endereço entre -128 10 e 1271 0 .

DESVIOS BASEADOS EM DADOS SEM SINAL (LÓGICO)

INSTRUÇÃO

SIGNIFICADO

FLAGS

TESTADOS

JE/JZ

Jump Equal or Jump Zero

ZF

JNE/JNZ

Jump Not Equal or Jump Not Zero

ZF

JA/JNBE

Jump Above or Jump Not Below or Equal

CF, ZF

JAE/JNB

Jump Above or Equal or Jump Not Below

CF

JB/JNAE

Jump Below or Jump Not Above or Equal

CF

JBE/JNA

Jump Below or Equal or Jump Not Above

AF, CF

LINGUAGEM ASSEMBLY – PARTE II - 12

DESVIOS BASEADOS EM DADOS COM SINAL (ARITMÉTICA)

INSTRUÇÃO

SIGNIFICADO

FLAGS

TESTADOS

JE/JZ

 

ZF

JNE/JNZ

 

ZF

JG/JNLE

Jump Greater or Jump Not Less or Equal

OF, SF, ZF

JGE/JNL

Jump Greater or Equal or Jump Not Less

OF, SF

JL/JNGE

Jump Less or Jump Not Greater or Equal

OF, SF

JLE/JNG

Jump Less or Equal or Jump Not Greater

OF, SF, ZF

DESVIOS BASEADOS EM TESTES ARITMÉTICOS ESPECIAIS

 

INSTRUÇÃO

SIGNIFICADO

FLAGS

TESTADOS

JC

Jump Carry (o mesmo que JB)

CF

JNC

Jump No Carry

CF

JO

Jump Overflow

OF

JNO

Jump No Overflow

OF

JP/JPE

Jump Parity or Jump Parity Even

PF

JNP/JPO

Jump No Parity or Jump Parity Odd

PF

JS

Jump Sign (negativo)

SF

JNS

Jump No Sign (positivo)

SF

LINGUAGEM ASSEMBLY – PARTE II - 13

INSTRUÇÕES AND, OR, XOR, TEST e NOT

Instrução AND

Propósito: Realizar a operação lógica AND sobre bits de dois operandos.

Sintaxe:

AND destino, fonte Essa instrução executa a operação lógica 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

Fonte

registrador

registrador

memória

registrador

registrador

memória

registrador

valor

Instrução OR

Propósito: Realizar a operação lógica OR sobre bits de dois operandos.

Sintaxe:

OR destino, fonte Essa instrução executa a operação lógica 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

Fonte

registrador

registrador

memória

registrador

registrador

memória

registrador

valor

LINGUAGEM ASSEMBLY – PARTE II - 14

Instrução XOR

Propósito: Realizar a operação lógica OR exclusivo sobre bits de dois operandos.

Sintaxe:

XOR destino, fonte Essa instrução executa a operação lógica 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

Fonte

registrador

registrador

memória

Registrador

registrador

Memória

registrador

Valor

Instrução NOT

Propósito: Realizar a operação lógica NOT sobre bits de seu operando.

Sintaxe:

NOT destino Essa instrução executa a operação lógica 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

Instrução TEST

Propósito: Verificar se configuração de uma palavra segue um determinado padrão

Sintaxe:

TEST operando, padrão Essa instrução usa o operador lógico AND para testar se um campo de operando, segue o padrão especificado por padrão. Depois dessa operação nenhum dos operandos (operando e padrão), são afetados, mas, sim, apenas os flags. Dessa forma, após essa operação pode se usar as instruções JE ou JNE para testar os flags.

Flags afetados: CF(0), OF(0), PF, SF, e ZF (AF é indefinido)

Operando

Padrão

registrador

registrador

memória

Registrador

registrador

Memória

registrador

Valor

INSTRUÇÕES DE DESLOCAMENTOS E ROTAÇÕES

Instrução SHR

Propósito: Deslocamento lógico dos bits de um registrador para a direita

Sintaxe:

SHR registrador, desloc 0
SHR registrador, desloc
0

CF

para a direita Sintaxe: SHR registrador, desloc 0 CF Como esta instrução altera CF, pode-se usar

Como esta instrução altera CF, pode-se usar as instruções 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

Instrução SAR

Propósito: Deslocamento aritmético dos bits de um registrador para a direita

Sintaxe:

SHR registrador, desloc

Sinal

CF
CF

Como esta instrução altera CF, pode-se usar as instruções 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.

Instruções SHL

Propósito: Deslocamento lógico dos bits de um registrador para a esquerda.

Sintaxe:

SHL registrador, desloc CF
SHL registrador, desloc
CF

0

Como esta instrução altera CF, pode-se usar as instruções 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.

Instrução SAL Propósito: Deslocamento aritmético dos bits de um registrador para a esquerda.

Sintaxe:

SAL registrador, desloc Tem o mesmo efeito que SHL.

Instrução ROR

Propósito: provocar um deslocamento lógico cíclico dos bits de um registrador para a direita.

Sintaxe:

ROR registrador, desloc

CF

para a direita. Sintaxe: ROR registrador, desloc CF Rotaciona os bits de registrador no sentido horário.

Rotaciona os bits de registrador no sentido horário. 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

Instrução RCR

Propósito: provocar um deslocamento aritmético cíclico dos bits de um registrador para a direita.

Sintaxe:

RCR registrador, desloc

CF

para a direita. Sintaxe: RCR registrador, desloc CF Rotaciona os bits de registrador juntamente com o

Rotaciona os bits de registrador juntamente com o CF (como se CF fizesse parte de registrador), no sentido horário.

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.

Instrução ROL

Propósito: provocar um deslocamento lógico cíclico dos bits de um registrador para a esquerda.

Sintaxe:

ROL registrador, desloc

CF

para a esquerda. Sintaxe: ROL registrador, desloc CF Rotaciona os bits de registrador no sentido anti

Rotaciona os bits de registrador no sentido anti horário. 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

Instrução RCL

Propósito: provocar um deslocamento aritmético cíclico dos bits de um registrador para a esquerda.

Sintaxe:

RCL registrador, desloc

CF

para a esquerda. Sintaxe: RCL registrador, desloc CF Rotaciona os bits de registrador juntamente com o

Rotaciona os bits de registrador juntamente com o CF (como se CF fizesse parte de registrador), no sentido anti horário.

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.

INSTRUÇÕES SOBRE FLAGS

Instrução

Propósito

CLC

Zerar o CF (Carry Flag)

CLD

Zerar o DF (Direction Flag)

CLI

Zerar o IF (Interrupt Flag: desabilita as interrupções mascaráveis externas)

CMC

Complementar o CF: se CF = 0, torna CF = 1, e vice versa.

STC

Faz CF = 1

STD

Faz DF = 1

STI

Faz IF = 1 (habilita as interrupções mascaráveis externas)

LINGUAGEM ASSEMBLY – PARTE II - 20

INSTRUÇÕES PARA MOVIMENTOS DE “STRINGS”: MOVSB, MOVSW e MOVSD

Essas instruções servem para movimentar (copiar para ser exato) dados entre locações de memória. Normalmente essas instruções são prefixadas com a instrução REP (REPeat – repetir). Quando precedido com REP, é usado o registrador CX como contador de repetição. Essas instruções utilizam como operandos os seguintes registradores e flag:

DS:SI

Endereço de locação fonte de memória onde se encontra a string a ser copiada

ES:DI

Endereço de locação destino de memória para onde será copiada a string

DF

Flag de direção. Se DF = 0 a copia da string será feita da esquerda para a direita Se DF = 1 a cópia será da direita para a esquerda.

CX

Contador de vezes que a operação de cópia deverá ser executada

Instrução MOVSB

Propósito: mover (copiar) o byte apontados por DS:SI para a posição apontada por ES:DI.

Sintaxe:

MOVSB

Instrução REP MOVSB

Propósito: mover (copiar) a cadeia de bytes (string de bytes) apontada por DS:SI para a posição apontada por ES:SI.

Sintaxe:

REP MOVSB OBSERVAÇÕES:

Se o flag de direção (DF) está igual a 0, os bytes da string serão copiados da esquerda para a direita, caso contrário, da direita para a esquerda. O número de bytes a ser copiado é determinado pelo registrador CX.

Instrução MOVSW: move uma palavra (dois bytes) Instrução MOVSD: move dupla palavra (quatro bytes)