Transferência de dados MOV destino, fonte move fonte - INF

Propaganda
INSTRUÇÕES DE TRANSFERÊNCIA
Transferência de dados
MOV
destino, fonte
PUSH fonte
POP
destino
move fonte para destino (byte, word ou
double word)
coloca fonte na pilha (word ou double
word)
retira topo da pilha para destino (word
ou double word)
troca (exchange) operandos
inverte a ordem dos bytes
XCHG op1, op2
BSWAP r32
Detalhes:
1. Acesso a registros de segmento: MOV, PUSH e POP;
2. Endereçamento imediato para CS e IP: não permitido;
3. Operandos de PUSH e POP: 16 ou 32 bits
4. PUSH: decrementa SP (2 ou 4) e escreve; POP: lê e
incrementa SP (2 ou 4)
Transferência de flags
PUSHF/PUSHFD
POPF/POPFD
LAHF
SAHF
coloca registrador de flags na pilha (16 bits
para F ou 32 bits para EF)
retira registrador de flags da pilha (16 bits
para F e 32 bits para EF)
carrega AH com flags (8 bits menos
significativos do registrador F)
carrega flags com AH (8 bits menos
significativos do registrador F)
Transferência sobre endereços
LEA
r16/r32, mem
LDS
r16/32, mem
LES
r16/32, mem
LFS
r16/32, mem
LGS
r16/32, mem
Prof. Sérgio L. Cechin
carrega endereço efetivo do operando
mem para reg (16 ou 32 bits)
carrega endereço de mem para reg (16
ou 32 bits) e DS (16 bits)
carrega endereço de mem para reg (16
ou 32 bits) e ES (16 bits)
carrega endereço de mem para reg (16
ou 32 bits) e FS (16 bits)
carrega endereço de mem para reg (16
ou 32 bits) e GS (16 bits)
1 de 12
Tradução
XLAT
converte AL (translate byte)
Detalhes:
AL ← [BX+AL].
Entrada e Saída
IN
acumulador, porta
OUT porta, acumulador
leitura de byte, word ou dobleword
para AL, AX ou EAX
transfere byte, word ou doubleword
de AL, AX ou EAX para a porta
Detalhes:
1. Espaço de endereçamento separado da memória
2. Capacidade para 65536 endereços (portas)
3. Formatos possíveis:
IN AL, im8 OUT im8, AL
IN AL, DX OUT DX, AL
IN AX, im8 OUT im8, AX
IN AX, DX OUT DX, AX
IN EAX, im8 OUT im8, EAX
IN EAX, DX OUT DX, EAX
INSTRUÇÕES ARITMÉTICAS
Com dois operandos
ADD
ADC
destino, fonte
destino, fonte
SUB
destino, fonte
SBB
destino, fonte
CMP
destino, fonte
soma (destino = destino + fonte)
soma com carry
(destino = destino + fonte + carry)
subtrai fonte do destino
(destino = destino – fonte)
subtrai com borrow
(destino = destino – fonte – borrow)
compara destino – fonte
(sem armazenar o resultado)
Detalhes:
1. Registradores de segmento não podem ser operados
2. Os dois operandos devem ter a mesma largura
3. O registrador envolvido determina a largura (8, 16 ou 32)
4. No caso de mem ou imed., declarar explicitamente a
largura
Prof. Sérgio L. Cechin
2 de 12
Com um operando
INC
DEC
NEG
destino
destino
destino
incrementa de 1
decrementa de 1
troca sinal (complemento de dois)
Multiplicação e Divisão
MUL fonte
multiplica como inteiro sem sinal
IMUL fonte
multiplica como inteiro com sinal
DIV
fonte
divide como inteiro sem sinal
IDIV fonte
divide como inteiro com sinal
Detalhes:
1. Um dos operandos está implícito;
2. Multiplicação...
... de 8 bits AX ← AL x fonte
... de 16 bits DX:AX ← AX x fonte
... de 32 bits EDX:EAX ← EAX x fonte
3. Divisão...
... de 8 bits AL (AH = resto) ← AL / fonte
... de 16 bits AX (DX = resto) ← DX:AX / fonte
... de 32 bits EAX (EDX = resto) ← EDX:EAX / fonte
4. Outros formatos para IMUL (para >= 486)
IMUL
reg, imed
reg = reg x imed
IMUL
reg1, reg2, imed reg1 = reg2 x imed
IMUL
reg, mem, imed reg = mem x imed
IMUL
reg1, reg2 reg1 = reg1 x reg 2
IMUL
reg, mem
reg = reg x mem
Prof. Sérgio L. Cechin
3 de 12
Conversão e Ajuste
CBW
CWD
CWDE
CDQ
converte byte para word (AL para AX)
converte word para double word (AX para DX:AX)
converte word para double word (AX para EAX)
converte double word para quad word
(EAX para EDX:EAX)
DAA decimal adjust after addition (sobre AL)
DAS
decimal adjust after subtraction (sobre AL)
AAA ASCII adjust after addition (sobre AL)
AAS
ASCII adjust after subtraction (sobre AL)
AAM ASCII adjust after multiplication (sobre AX)
AAD ASCII adjust before division (sobre AX)
Detalhes:
1. Usadas em conjunto com as instruções ADD, SUB, MUL
e DIV
2. Para ADD, SUB e MUL, aplicar o ajuste após a operação
3. Para DIV, aplicar o ajuste antes da operação
4. AAx, ajustam um BCD por byte;
5. DAx, ajustam dois BCD por byte.
Conversão e Ajuste
MOVSX
MOVZX
destino, fonte
move fonte para destino
com extensão do sinal (números com sinal)
destino, fonte
move fonte para destino
com extensão de zeros (inteiros positivos)
Detalhes:
1. Após o 80386
2. Formatos possíveis
MOVSX r16, rm8
MOVSX r32, rm8
MOVSX r32, rm16
MOVZX r16, rm8
MOVZX r32, rm8
MOVZX r32, rm16
Prof. Sérgio L. Cechin
4 de 12
MANIPULAÇÃO DE BITS
Instruções lógicas
NOT
AND
OR
XOR
TEST
destino
destino, fonte
destino, fonte
destino, fonte
destino, fonte (AND, sem armazenar resultado)
Deslocamento
SHR
destino, contador
shift logical right
0
SAR
CF
destino, contador
shift arithmetic right
CF
SHL
destino, contador
shift left
CF
SAL
0
destino, contador
shift left
CF
ROR
0
destino, contador
rotate right
CF
RCR
destino, contador
rotate with carry right
CF
ROL
destino, contador
rotate left
CF
RCL
destino, contador
rotate with carry left
CF
Detalhes:
1. Codificações possíveis
operação reg,1
operação reg, CL
operação reg, im8
operação mem,1
operação mem, CL
operação mem, im8
2. Número de deslocamentos: 0 até 31 (a partir do 286)
Prof. Sérgio L. Cechin
5 de 12
Operações sobre bits
BSF operand1, operand2 Bit Scan Forward
BSR operand1, operand2 Bit Scan Reverse
BT operand, bit_index Bit Test
BTC operand, bit_index Bit Test and Complement
BTR operand, bit_index Bit Test and Reset
BTS operand, bit_index Bit Test and Set
Detalhes:
1. A partir do 386
2. BSF e BSR procuram pelo primeiro bit em 1
BSF, a partir do LSB
BSR, a partir do MSB
3. BT, BTC, BTR e BTS testam o bit indicado (copia p/ CF)
BT, só testa
BTC, testa e inverte
BTR, testa e coloca 0
BTS, testa e coloca 1
INSTRUÇÕES DE DESVIO
1. desvios dentro do segmento de código corrente (não altera CS)
near jump → instrução dentro do segmento;
short jump → instrução localizada entre –128 e +127 da posição atual
2. desvios para fora do segmento de código corrente (altera o CS)
far jump → desvio para instrução em outro segmento de código
Incondicional
JMP
destino
Detalhes:
1. Formas possíveis:
Direto:
short IP ← IP + offset (1 byte)
near IP ← IP + offset (2 ou 4 byte)
far CS:IP ← offset (4 bytes)
Indireto
near IP (ou EIP) ← conteúdo de registrador ou de
memória
far CS:IP (ou CS:EIP) ← conteúdo de registrador ou
de memória
Prof. Sérgio L. Cechin
6 de 12
Controle de Laço
LOOP
endereço loop
LOOPE endereço loop while equal / zero (enquanto ZF=1)
LOOPZ endereço loop while equal / zero (enquanto ZF=1)
LOOPNE endereço loop while not equal / not zero (ZF=0)
LOOPNZ endereço loop while not equal / not zero (ZF=0)
JCXZ
endereço jump if CX = 0
JECXZ endereço jump if ECX = 0
Detalhes:
1. LOOP e LOOPcc, utilizam o registro CX (ECX) como
contador de laço
2. LOOPcc, além do contador, utilizam o ZF para decidir se
desviam
3. Os desvios são short (8 bits)
Subrotinas
CALL endereço
RET
valor_opcional
Interrupções de Software
INT tipo
INTO
IRET
Prof. Sérgio L. Cechin
interrupção
interrupção se overflow
retorno de interrupção
7 de 12
Desvio condicional
JG
endereço
greater
((SF XOR OF) OR ZF) = 0
JNLE
endereço
not less nor equal
idem
JGE
endereço
greater or equal (SF XOR OF) = 0
JNL
endereço
not less idem
JL
endereço
less (SF XOR OF) = 1
JNGE
endereço
not greater nor equal idem
JLE
endereço
less or equal ((SF XOR OF) OR ZF) = 1
JNG
endereço
not greater idem
JO
endereço
overflow OF = 1
JS
endereço
sign SF = 1
JNO
endereço
not overflow
OF = 0
JNS
endereço
not sign SF = 0
JA
endereço
above
(CF OR ZF) = 0
JNBE
endereço
not below nor equal idem
JAE
endereço
above or equal CF = 0
JNB
endereço
not below idem
JB
endereço
below
CF = 1
JNAE
endereço
not above nor equal idem
JBE
endereço
below or equal (CF OR ZF) = 1
JNA
endereço
not above idem
JC
endereço
carry CF = 1
JE/JZ
endereço
equal / zero
ZF = 1
JP/JPE
endereço
parity / parity even PF = 1
JNC
endereço
not carry CF = 0
JNE/JNZ endereço
not equal / not zero ZF = 0
JNP/JPO endereço
not parity / parity odd PF = 0
Detalhes:
1. Todos os desvios condicionais são relativos
2. Podem ser short (8bits) ou near (16 bits ou 32 bits)
3. Desvios near, somente a partir do 386
Prof. Sérgio L. Cechin
8 de 12
MANIPULAÇÃO DE STRINGS
Utilização implícita dos seguintes registros:
[E]SI
índice para string fonte
[E]DI
índice para string destino
ES
segmento do string destino
[E]CX
contador
AL/AX/EAX
valor de busca (destino p/ LODS, fonte p/ STOS)
DF
0 (auto incremento p/ DI, SI), 1 (auto decremento p/ DI,
SI)
ZF
condição de término para busca e comparação
Instruções: (s, nas instruções, pode ser substituído por B, W ou D)
MOVSs
move source string to destination string
Move um elemento: DS:SI → ES:DI
CMPSs
compare source string with destination string
Compara dois elementos: DS:SI - ES:DI
SCASs
scan destination string
Procura pelo elemento AL (AX ou EAX): AL - ES:DI
LODSs
load into AL/AX from source string
Carrega elemento para AL (AX ou EAX): DS:SI → AL
STOSs
store AL/AX into destination string
Armazena elemento de AL (AX ou EAX): ES:DI ← AL
Detalhes:
1. Controle de auto incremento (decremento): flag DF=0 (1)
2. Controle de repetição
REP
repeat
REPE / REPZ repeat while equal / zero
REPNE / REPNZ repeat while not equal / not zero
Colocadas como prefixo
Utiliza ECX para o número de repetições
Prof. Sérgio L. Cechin
9 de 12
CONTROLE DO PROCESSADOR
Instruções sobre flags
STC
CLC
CMC
STD
CLD
STI
CLI
set carry flag
clear carry flag
complement carry flag
set direction flag
clear direction flag
set interrupt-enable flag
clear interrupt-enable flag
Instruções condicionais sobre flags
SETcc
rm8
set byte on condition (>=386)
CMOVcc destino, fonte
conditional move (>= Pentium Pro)
Detalhes
1. cc → todas as condições dos desvios condicionais
2. destino → registro (16 ou 32 bits); fonte → registro ou
memória
Instruções de prefixo
SEG segreg
override default segment register
Detalhes:
1. Na linguagem simbólica, a instrução aparece como: MOV
AX, ES:[BX]
Prof. Sérgio L. Cechin
10 de 12
Exemplo de Programa
PILHA
PILHA
SEGMENT STACK
DB
32 DUP (‘STACK---’)
ENDS
CR:
LF:
EQU
EQU
00DH
00AH
DADOS
MENSAGEM
TAMANHO
CONTADOR
DADOS
SEGMENT
DB
EQU
DB
ENDS
‘Hello World !’,CR,LF
$-MENSAGEM
?
CODIGO
SEGMENT
ASSUME
CS:CODIGO,SS:PILHA,DS:DADOS
MOV
MOV
AX, DADOS
DS, AX
; Inicializa segmento de dados
MOV
CALL
DEC
JNZ
CONTADOR, 10
FRASE
CONTADOR
DE_NOVO
; Loop de operação
MOV
MOV
INT
AH, 4CH
AL, 0
21H
; DOS: Termina com código de retorno
NEAR
AH, 40H
BX, 0001H
DX, MENSAGEM
CX, TAMANHO
21H
FRASE
PROC
MOV
MOV
LEA
MOV
INT
RET
ENDP
CODIGO
ENDS
START:
DE_NOVO:
FRASE
; DOS: Grava em arquivo
; Saída padrão
END START
Prof. Sérgio L. Cechin
11 de 12
Short Reference
MOV
destino, fonte
PUSH
fonte
POP
destino
LEA
r16/r32, mem
Lrs
r16/r32, mem
rs=DS, ES, FS, GS
XLAT
AL ← [BX+AL]
ADD
destino, fonte
ADC
destino, fonte
SUB
destino, fonte
SBB
destino, fonte
CMP
destino, fonte
INC
destino
DEC
destino
NEG
destino
MUL
fonte
AX ← AL x fonte; DX:AX ← AX x fonte; EDX:EAX ← EAX x fonte
IMUL
fonte
DIV
fonte
IDIV
fonte
DAA
(decimal-soma) AL
DAS
(decimal-subtração) AL
AAA
(ASCII-soma) AL
AAS
(ASCII-subtração) AL
AAM
(ASCII-multiplicação) AX
AAD
(ASCII-divisão) AX
Prof. Sérgio L. Cechin
12 de 12
Download