You are on page 1of 31

Interface Hardware-Software

Instrues de Transferncia de Dados


x86 (Modo Real)
Categoria de Instrues no x86
Transferncia de dados
Aritmticas
Lgicas
Manipulao de bits
Strings
Desvios de fluxo
Veremos hoje!
Instrues de Transferncia de Dados
Pode-se transferir dados entre:
Registrador Registrador
Registrador Endereo de memria
Registrador Imediato
Registrador Endereo de Porta
Endereo de memria Registrador
Endereo de Memria Endereo de Memria
Endereo de Porta Registrador
Podem diferem quanto a quantidade de valores
transferidos:
nico valor
Muitos valores
Instruo MOV
Transfere o valor de origem para destino, onde so
possveis as seguintes combinaes:

mov destino, origem
Forma Geral
destino, origem exemplo
registrador, registrador
mov ax, dx
registrador, imediato
mov ax, 0xa
registrador, memria
mov ax, [0xe]
memria, registrador
mov [bx], ax
memria, imediato
mov byte[si], 0
Mais sobre a Instruo MOV
Instruo codificada diferente dependendo dos seus
operandos
mov ax, 0x30 codificada diferente de mov al, 0x30
Assembler examina tamanho do registrador e codifica o
imediato de acordo com este tamanho
Lembrando que operaes que envolvem a memria, o
endereo especificado do byte menos significativo (Little-
endian)
mov [si], ax
0x0001 AX
Memria
Operando 1 0x00
0x01
DS +0x0301
0x0300 SI
DS +0x0300
Como Saber Tamanho de Operando?
Em casos, onde um operando um imediato e o uma
posio de memria, deve-se colocar qualificadores antes
da posio de memria
byte, word, dword,qword
mov byte[si], 0x11
Memria
0x00
0x11
DS +0x0301
0x0300
DS +0x0300
mov word[0x300], 0x11
Memria
0x23
0x11
DS +0x0301
0x0300 SI
DS +0x0300
Escreve somente na
primeira posio
Escreve nas duas
posies
Instrues MOVSX e MOVZX
Estende origem com sinal (movsx) ou sem sinal (movzx)
e armazena em destino, onde so possveis as
seguintes combinaes:

movsx destino, origem
Forma Geral
destino, origem exemplo
reg16, reg8 ou mem8
movsx ax, al
reg32, reg16 ou mem16
movzx eax, dx
reg32, reg8 ou mem8
movsx eax, byte[0xe]
movzx destino, origem
Funcionamento de MOVSX e MOVZX
movsx ax, dl
Memria
0x11
0x11
DS +0x0301
DS +0x0300
0xF1 DL
0xFFF1 AX
movzx eax, byte[0x0300]
0x00000011 EAX
Instruo PUSH
Empilha o valor de origem na posio de memria dada
por SS+SP
Valor de SP decrementado antes automaticamente
Se o SP empilhado, o valor empilhado o valor de SP
antes do push
origem pode ser:


push origem
Forma Geral
Origem exemplo
registrador
push ax
imediato
push 0xa
memria
push[0xe]
Funcionamento de PUSH
push ax
Memria
?
?
SS +0x2000
SS +0x1FFF
0x1234 AX
?
?
0x2000
SP
SS +0x1FFE
SS +0x1FFD
?
12
SS +0x2000
SS +0x1FFF
0x1234 AX
34
?
0x1FFE
SP
SS +0x1FFE
SS +0x1FFD
Decrementa SP de
acordo com o
tamanho do
operando em bytes
SP = SP - 2
Instrues PUSHW e PUSHD
Pushw empilha necessariamente um valor de 16 bits
(word)
pushw ds push ds
Pushd empilha necessariamente um valor de 32 bits
pushd eax push eax



pushw origem
Forma Geral
pushd origem
Instrues PUSHA e PUSHAD
Pusha empilha todos os registradores de propsito geral
de 16 bits

Pushad empilha todos os registradores de propsito geral
de 32 bits



pusha
Forma Geral
pushad
Ordem de Empilhamento
Ordem
pusha pushad
1 ax eax
2 cx ecx
3 dx edx
4

bx ebx
5 sp esp
6 bp ebp
7 si esi
8 di edi
SP
decrementado em
8 * quantidade de
bytes de cada
registrador
Instruo POP
Desempilha o valor na posio de memria dada por
SS+SP e armazena em destino
Valor de SP incrementado depois automaticamente
Todos os registradores excetos o CS e IP podem ser
utilizados
destino pode ser:


pop destino
Forma Geral
Destino exemplo
registrador
pop ax
memria
pop [0xa]
Funcionamento de POP
pop bx
Memria
?
0x30
SS +0x2000
SS +0x1FFF
0x1234 BX
0x20
?
0x2000
SP
?
0x30
0x3020 BX
0x20
?
0x2002
SP
Incrementa SP de
acordo com o
tamanho do
operando em bytes
SP = SP + 2
SS +0x2001
SS +0x2002
SS +0x2000
SS +0x1FFF
SS +0x2001
SS +0x2002
Instrues POPA e POPAD
Popa desempilha todos os registradores de propsito geral
de 16 bits e atualiza os respectivos registradores

Popad empilha todos os registradores de propsito geral
de 32 bits e atualiza os respectivos registradores

O valor que seria armazenado no SP/ESP descartado para no
mudar o valor do SP/ESP no meio da operao



popa
Forma Geral
popad
Ordem de Desempilhamento
Ordem
popa popad
1 di edi
2 si esi
3 bp ebp
4

sp esp
5 bx ebx
6 dx edx
7 cx ecx
8 ax eax
Valores so
descartados
Funcionamento de POPA
?
0xFF
SS +0x1FFC
SS +0x1FFA
0x2211 DI
0xDD
0xBB
0x99
0x77
0x55
0x33
SP
Antes de
popa
SS +0x1FFE
SS +0x2000
SS +0x1FF4
SS +0x1FF2
SS +0x1FF6
SS +0x1FF8
?
0x00
0xEE
0xCC
0xAA
0x88
0x66
0x44
0x11
SS +0x1FF0
0x22
0x4433 SI
0x6655 BP
Descartado
0xAA99 BX
0xCCBB DX
0xEEDD CX
0xFF00 AX
SP
Depois de
popa
Instrues PUSHF e PUSHFD
Pushf empilha o 16 bits menos significativos do registrador
das flags

Pushfd empilha todo os 32 bits do registrador de flags



pushf
Forma Geral
pushfd
Instrues POPF e POPFD
Popf desempilha um valor de 16 bits e coloca nos 16 bits
menos significativos do registrador das flags

Popfd desempilha um valor de 32 bits e coloca no
registrador de 32 bits de flags



popf
Forma Geral
popfd
Instruo LEA
A instruo LEA (Load Effective Address) move o endereo
indicado por origem para o registrador destino
destino no pode ser um registrador de segmento
Instruo NO move o contedo do endereo apontado por
origem
O endereo pode ser dado por um registrador ou imediato
lea destino, origem (endereo efetivo)
Forma Geral
Exemplos de Uso de LEA
string db Hello,0
lea si, [string];coloca endereo de string em si
lea cx, [di] ;coloca valor de di em cx
lea bx, [0x300] ;coloca 0x300 em bx
lea ax, [bx+bp] ;coloca valor de bx + bp em ax

Diferena entre LEA e MOV
mov ax, [si]
Memria
0x23
0x11
DS +0x0301
0x0300 SI DS +0x0300
0x02311 AX
lea ax, [si]
0x0300 SI
0x0300 AX
Equivalente a mov ax, si
Instruo IN
Serve para a leitura de dispositivo de E/S, l o que est no
endereo de porta e armazena em acumulador
acumulador s pode ser AL, AX ou EAX
porta pode ser dado por DX ou um imediato (endereos
entre 0x0 e 0xFF)
in acumulador, porta
Forma Geral
in al, 61h
mov dx,0x32FF
in ax, dx
Instruo OUT
Serve para a escrita de dispositivo de E/S, escreve o que
est no acumulador no endereo de porta
acumulador s pode ser AL, AX ou EAX
porta pode ser dado por DX ou um imediato (endereos
entre 0x0 e 0xFF)
out porta,acumulador
Forma Geral
Exemplos de Uso de IN e OUT
;;Programa que emite um beep no alto-falante
in al, 61h; porta associada ao alto-falante
or al,3; coloca 1 nos bits menos significativos
out 61h,al; alto-falante emite um beep
mov cx,1000h
L1:
loop L1
in al,61h
and al,0fch
out 61h,al; alto-falante para de emitir beep

Instruo XCHG
Troca o contedo de origem e destino (devem ser do
mesmo tamanho)
Pelo menos um dos operandos deve estar em um registrador
(excetuando-se registradores de segmento)
Se um operando est na memria, este deve estar dentro do
um segmento de dados
xchg destino, origem
Forma Geral
destino, origem exemplo
registrador, registrador
xchg ax, bx
registrador, memria
xchg dx, [bx]
memria, registrador
xchg [0xe],ax
Instruo BSWAP
Instruo BSWAP (Byte Swap) inverte a ordem dos bytes
de destino
destino deve ser um registrador de 32 bits
bswap destino
Forma Geral
Funcionamento de BSWAP
bswap eax
0xF1234567
EAX
0x674523F1
EAX
Instrues LDS/LES/LFS/LGS/LSS
Estas instrues carregam blocos de 4 bytes da posio de
memria apontada por origem em 2 registradores de 16
bits
Os dois bytes menos significativos so armazenados em
destino e o restante em um registrador de segmento
DS em LDS, ES em LES, FS em LFS, GS em LGS e SS em
LSS
lds destino, origem
Forma Geral
Funcionamento de LDS
lds di,[si]
Memria
0x90
0x80
DS +0x2000
0xF0
0x30
0x2000
SI
DS +0x2001
DS +0x2002
DS +0x2003
?
DS +0x2004
0xF030 DI
0x9080 DS