Você está na página 1de 37

O CPU 8086/8088

Estrutura dos CPUs 8086/8088


Estrutura interna

Estrutura externa

8086

16 bits

16 bits

8088

16 bits

8 bits

8086 Maior performance


8088 Maior economia
Caracterstica comum: endereamento a 20 bits podendo
aceder a 1MByte de memria.

Registos internos
15

DATA
GROUP

AH
BH
CH
DH

POINTER
AND
INDEX GROUP

AX
BX
CX
DX

AL
BL
CL
DL

Accumulator
Base
Count
Data

SP
BP
SI
DI

Stack pointer
Base pointer
Source index
Destination index

CS
DS
SS
ES

Code segment
Data segment
Stack segment
Extra segment

IP

Instruction pointer

FLAGS

Clculo do endereo fsico


BX
BP
SI

BX

SI

BP

DI

DI

Displacement
BX

0000

BP

0000

SI

0000

DI

0000

Physical address

Codificado
na
instruo
Explcito
na
instruo
Assumido
excepto
se indicao
contrria

Registo de flags
X

X OF DF IF TF SF ZF X AF X

CF Carry flag
PF Parity flag
AF Auxiliar flag
ZF Zero flag
SF Sign flag

TF Single Trap flag


IF Interrupt flag
DF Direction flag
OF Overflow flag
X Dont care

PF

Modos de endereamento
Endereamento directo
Endereamento indirecto atravs de registo
Endereamento baseado
Endereamento indexado
Endereamento baseado indexado

Modos de endereamento
Endereamento directo (6 clocks)
O endereo dado na instruo
Ex: mov
ax, Var1

End. indirecto sobre registo (5 clocks)

O endereo lido de um registo base (BX ou BP) ou index (SI ou DI)


Ex: mov
ax, [BX]

Endereamento baseado (9 clocks)

O endereo lido de um registo base (BX ou BP) ao qual adicionado


o valor indicado na instruo
Ex: mov
ax, [BX+5]

Modos de endereamento
Endereamento indexado (9 clocks)

Idntico ao anterior mas usando um registo de index (SI ou DI)


Ex: mov
ax, [SI+10]

Endereamento baseado indexado

O endereo dado pela soma de um registo base (BX ou BP) com


um registo de index (SI ou DI) e ainda com um valor dado na
instruo
Ex: mov
ax, [BX][SI]
(7 ou 8 clocks)
mov
ax, Tabela[BX][SI]
(11 ou 12 clocks)

Instrues dos CPUs


8086/8088

Instruo MOV
mov destino,origem
Transfere um byte ou uma word do operando origem para o
operando destino.

Tipos de transferncias possveis


registo

registo

mov

bx,cx

memria

registo

mov

var1, ax

registo

memria

mov

ax, var2

memria

constante

mov

var1, 23

registo

constante

mov

dx, 45

Instrues ADD e SUB


add destino,origem
A soma dos dois operandos (byte ou word) substitue o valor
do operando destino.

Tipos de operaes possveis


registo

registo

add

cx,dx

memria

registo

sub

var1, ax

registo

memria

add

ax, var2

memria

constante

sub

var1, 2

registo

constante

add

cl, 4

Instruo CMP
cmp destino,origem
Subtrai a origem do destino (byte ou word) no produzindo
resultado mas afectando as flags AF, CF, OF, PF, SF, ZF.
Uma comparao seguida de um JG produzir um salto se
destino > origem.

Tipos de transferncias possveis


registo

registo

cmp

bx,cx

memria

registo

cmp

var1, ax

registo

memria

cmp

ax, var2

memria

constante

cmp

var1, 23

registo

constante

cmp

bl, 45

Instruo JMP
jmp endereo
Salta incondicionalmente para endereo .

Tipos de operaes possveis (simplificado)


jmp

label1

Instrues de salto condicional


JA/JNBE

JG/JNLE

JNE/JNZ

JAE/JNB

JGE/JNL

JNO

JB/JNAE

JL/JNGE

JNP/JPO

JC

JLE/JNG

JE/JZ

JNC

JNS

JO

JP/JPE

JS

JBE/JNA

JUMPS PARA TODOS OS GOSTOS !!!

Utilizao dos saltos condicionais


Condio de
salto

Comparao
com sinal

Salta se:

Comparao
sem sinal

Salta se:

Igual

JE

ZF=1

JE

ZF=1

Desigual

JNE

ZF=0

JNE

ZF=0

Maior que

JG ou JNLE

ZF=0 e SF=OF

JA ou JNBE

CF=0 e ZF=OF

Menor que

JL ou JNGE

SF?OF

JB ou JNAE

CF=1

Maior ou igual

JGE ou JNL

SF=OF

JAE ou JNB

CF=0

Menor ou igual

JLE ou JNG

ZF=1 e SF?OF

JBE ou JNA

CF=1 ou ZF=1

Instrues de movimento de dados


MOV

{registo | memria},{registo | memria | imediato}


Descrio: Destino = Origem

XCHG

{registo | memria},{registo | memria}


Descrio: Destino <-> Origem

XLAT

Descrio: AL = DS : BX [AL]
DS:BX e AL=5 ?

AL recebe o 6 elemento da tabela

CBW

Descrio: AL = sinal(AL)

CWD

Descrio: DX = sinal(AX)

Intrues de soma e subtraco


ADD

{registo | memria},{registo | memria | imediato}


Descrio: Destino = Destino + Origem

ADC

{registo | memria},{registo | memria | imediato}


Descrio: Destino = Destino + Origem + Carry

SUB

{registo | memria},{registo | memria | imediato}


Descrio: Destino = Destino Origem

SBB

{registo | memria},{registo | memria | imediato}


Descrio: Destino = Destino - Origem Overflow

NEG

{registo | memria}
Descrio: Destino = -Destino

Instrues de incremento e decremento


INC

{registo | memria}

Descrio: Destino = Destino + 1

DEC

{registo | memria}

Descrio: Destino = Destino - 1

Instrues de multiplicao e diviso


MUL {registo | memria}
IMUL {registo | memria}

Descrio: multiplicao sem sinal


Descrio: multiplicao com sinal

AX = AL * Origem8 ou DX:AX = AX * Origem16


DIV

{registo | memria}

Descrio: diviso sem sinal

IDIV

{registo | memria}

Descrio: diviso com sinal

AL = AX / Origem8 e AH = AX mod Origem8


ou
AX = DX:AX / Origem16 e DX = DX:AX mod Origem16
Se for efectuada uma diviso por zero ou o quociente exceder a capacidade do registo
destino (AL ou AX) automaticamente gerado um interrupt tipo 0.
Dado que as instrues de multiplicao e diviso so muito lentas aconselhvel, sempre
que possvel, a utilizao de deslocamentos para as divises e multiplicaes por potncias
inteiras de 2.

Instrues de ajuste
Instrues de ajuste ASCII (unpacked BCD)
AAA Ascii adjust for addition

Exemplo: mov
mov
add
aaa

AAS Ascii adjust for subtraction


AAM Ascii adjust for multiplication
AAD Ascii adjust for division

ax, 9
bx, 3
al, bl

; ax=9
; bx=3
; al=0ch
; ah=1, al=2

Instrues de ajuste decimal (packed BCD)


DAA Decimal adjust for addition Exemplo: mov

DAS Decimal adjust for subtraction

mov
add
daa

al, 88h ; al=88h


ah, 33h ; ah=33h
al, ah ; al=BBh (121 D)
; al=21h CF=1

As instrues de ajuste devem seguir uma operao aritmtica de 8 bits cujo


resultado deve ser sempre o AL.

Instrues de stack e I/O


Instrues de manipulao do stack
PUSH {registo | memria}
POP

Descrio: Topo(Stack) = registo ou memria


{registo | memria}
Descrio: registo ou memria = Topo(Stack)

Instrues de I/O
IN

acumulador, {portnumber | DX}

(portnumber < 256)

Descrio: acumulador = port[portnumber]


OUT

{portnumber | DX}, acumulador

(portnumber < 256)

Descrio: port[portnumber] = acumulador

Instrues de manipulao de flags


LAHF

Descrio: AH = flags

SAHF

Descrio: flags = AH

PUSHF

Descrio: Topo(stack) = flags

POPF

Descrio: flags = Topo(stack)

STC

Descrio: Carry = 1

CLC

Descrio: Carry = 0

CMC

Descrio: Carry = not Carry

STD

Descrio: DF = 1

CLD

Descrio: DF = 0

STI

Descrio: IF = 1

CLI

Descrio: IF = 0

Instrues de manipulao de endereos


LEA

registo, memria
Descrio: Registo = Endereo(memria)

Exemplo:

LDS

dx, string
dx, OFFSET string
dx, string[si]

; lento !!!
; rpido
; til !!!

registo, memria
Descrio:

LES

lea
mov
lea

Registo = word ptr memory (offset)


DS = word ptr memory + 2 (segment)

registo, memria
Descrio:

Registo = word ptr memory (offset)


ES = word ptr memory + 2 (segment)

Instrues lgicas
NOT

{registo | memria}

Descrio :

AND
OR
XOR

{registo | memria}, {registo | memria | imediato}


{registo | memria}, {registo | memria | imediato}
{registo | memria}, {registo | memria | imediato}

Descrio :

TEST

inverso bit-a-bit do operando

Destino = Destino AND|OR|XOR Origem

{registo | memria}, {registo | memria | imediato}

Descrio : Destino = Destino AND Origem afectando apenas afecta as flags

CMP

{registo | memria}, {registo | memria | imediato}

Descrio : Destino = Destino - Origem afectando apenas afecta as flags

Instrues de shift e rotate


SHL

{registo | memria}, {CL | 1}

Shift left

SHR

{registo | memria}, {CL | 1}

Shift right

SAL

{registo | memria}, {CL | 1}

Shift Aritmetic left

SAR

{registo | memria}, {CL | 1}

Shift Aritmetic right

ROL

{registo | memria}, {CL | 1}

Rotate left

ROR

{registo | memria}, {CL | 1}

Rotate right

RCL

{registo | memria}, {CL | 1}

Rotate through carry left

RCR

{registo | memria}, {CL | 1}

Rotate through carry right

Nota : a partir do 80186 possvel a especificao de qualquer nmero de


shifts/rotates (valor a 8 bits).

Instrues de shift
7

CF

SHL Shift left

CF
7

SHR Shift right

CF

SAL Shift arithmetic left


7

CF

SAR Shift arithmetic right

Instrues de rotate
7

CF

ROL Rotate left


7

CF

ROR Rotate right


7

CF

Rotate through carry left


7

CF

Rotate through carry right

Instrues sobre strings


Operaes a efectuar para a construo de uma
instruo com prefixo de repetio
1 Direccionar a DF

DF=0 low to high addresses


DF=1 - high to low addresses

2 Carregar no CX o nmero de repeties pretendido.


3 Carregar o endereo de origem no DS:SI e do destino no ES:DI (s
pode ser efectuado um override sobre o registo de segmento de origem).
4 Escolher o prefixo adequado e coloca-lo imediatamente antes da
instruo pretendida (na mesma linha).

Instrues sobre strings


Em cada ciclo de repetio o processador executa os
seguintes passos:
1 Se CX=0 termina o ciclo.
2 Executa a instruo uma vez.
3 Incrementa/decrementa SI e/ou DI de acordo com a DF. O
incremento ser de um ou de dois consoante a instruo for sobre bits ou
words.
4 Decrementa CX no afectando as flags.
5 Se a instruo for SCAS ou CMPS verifica a flag de zero e termina
se a condio for falsa, istp , ZF=0 com REPE ou REPZ ou ZF=1 com REPNE
ou REPNZ.
6 Repete a partir de 1.

Instrues sobre strings


Prefixos

REP
Descrio : repetir CX vezes
REPE/REPZ
Descrio : repetir enquanto igual no mximo CX vezes
REPNE/REPNZ Descrio: repetir enquanto diferente no mximo CX vezes

Instrues

[rep] MOVS
[rep] MOVSB
[rep] MOVSW
[repe|repne]
[repe|repne]
[repe|repne]

[ES:]destination,[segmentregister]:source
Descrio : ES:DI ? DS:SI

CMPS
[segmentregister:]source,[ES:]:destination
CMPSB
CMPSW

Descrio : depois da instruo REPNE CMPS teremos ZF=0 se no foi


encontrada qualquer semelhana. Depois da instruo REPE CMPS
teremos ZF=1 se no foi encontrada nenhuma diferena.

Instrues sobre strings


[repe|repne]
[repe|repne]
[repe|repne]

SCAS [ES:]destination
SCASB
SCASW

Descri
Descri
o
o:: procura na string ES:DI a primeira ocorrncia/no ocorrncia do valor em
AL/AX. ES:DI ficaro com o valor imediatamente seguinte
seguinte.. Depois de um
REPNE SCAS, ZF=0 indica que no foi encontrado o valor. Depois de um REPE
SCAS, ZF=1 indica que no foi encontrado o valor procurado
procurado..

[rep] STOS [ES:]destination


[rep] STOSB
[rep] STOSW
Descri
Descri
o
o:: preenchimento da string ES:DI com o valor em AL/AX (comp. CX)

LODS
[segmentregister:]source
LODSB
LODSW
Descri
Descri
o
o:: AL/AX=DI:SI (Si
( Si ajustado de acordo com a DF).

Instrues de controlo de fluxo


CALL

{registo | memria}

Descrio: Topo(stack)=end.
Descrio:
Topo(stack)=end. Retorno e PC=End. Destino
Exemplos::
Exemplos
call
Proc1
call
ProcTable[si]]
ProcTable[si
call
ax
call
[bx].table[si
bx].table[si]]

RET

[constante]

Descrio:: PC=Topo(stack
Descrio
PC=Topo(stack)) e Stack=stack+constante
Stack=stack+constante

JMP

{registo | memria}

Descrio: PC=End. Destino


Descrio:
Exemplos::
Exemplos
jmp
jmp
jmp
jmp
jmp

short
near
far_ptr
[bx].target
cx

Intrues de saltos condicionais


JL/JNGE

JA/JNBE

JNS

JNC

JLE/JNG

JAE/JNB

JO

JE/JZ

JNE/JNZ

JB/JNAE

JP/JPE

JG/JNLE

JNO

JBE/JNA

JS

JGE/JNL

JNP/JPO

JC

IMPORTANTE
Os saltos condicionais so limitados a 128 bytes (jumps short).

Instrues de loop
LOOP

label

Descrio : CX=CX-1; se CX<>0 salta para label seno continua

LOOPE/LOOPZ

label

Descrio : CX=CX-1; se CX<>0 e ZF=1 salta para label seno continua

LOOPNE/LOOPNZ

label

Descrio : CX=CX-1; se CX<>0 e ZF=0 salta para label seno continua

JCXZ

label

Descrio : se CX=0 salta para label seno continua (no consulta as flags).

Instrues de interrupo
INT

interruptNumber

Descrio : provoca uma interrupo por software sobre o vector


interruptNumber.

INTO
Descrio : provoca uma interrupo por software sobre o vector 4.

IRET
Descrio : retorna de uma rotina de entendimento de interrupo .

Operaes efcetuadas durante


uma interrupo
Interrupt
descriptor
table

INT segment

Status flags

Program FLAGS

Code segment

Program CS

Instruction
pointer

Program IP

INT offset

Memria baixa

Program FLAGS
New CS
New IP

Program FLAGS
Program CS
Program IP
Memria baixa

SP
Previous IP

Stack

Previous CS
Previous FLAGS

SP

Memria alta

Memria alta

SP

Instrues de sincronizao com


o exterior
HLT

Descrio : pra o processador at ser recebida uma interrupo


ou efectuado RESET.

WAIT

Descrio : pra o processador at que um co -processador


termine a sua tarefa.

ESC

Descrio : prefixo que indica a ocorrncia de uma instruo para


o co -processador.

LOCK

Descrio : prefixo que torna indivisvel a instruo a que


respeita. Utilizado apenas em sistemas de multi -processamento
para acesso a semforos em memria comum.

NOP

Descrio : instruo nula.

Você também pode gostar