Interface Hardware-Software
Instruções Aritméticas e Lógicas x86
(Modo Real)
Categoria de Instruções no x86
Transferência de dados Aritméticas Lógicas Manipulação de bits Strings Desvios de fluxoVeremos hoje!
Instruções Aritméticas/Lógicas
Pode-se realizar operações aritméticas entre:
– Registrador, Registrador
– Registrador, Endereço de memória – Registrador,Imediato
– Endereço de Memória, Imediato
Não se pode utilizar registradores de segmentos como operandos!
Quando utilizar um registrador para acessar operando na memória, lembre que só podem ser utilizados registradores de base ou de índice (BX,BP,SI e DI)
Instruções Aritméticas ADD/SUB
Adiciona/subrai o valor de origem com/de destino, colocando o resultado em destino
São possíveis as seguintes combinações:
add
destino
,
origem
Forma Geral
destino, origem exemplo
registrador, registrador add ax, dx
registrador, imediato sub al, 0x12
registrador, memória add ax, [0x1e]
memória, registrador sub [bx], ax
memória, imediato add byte[si], 0x23
Funcionamento do ADD
0x0001 AX Memória Destino 0x1235 AX Destino 0x12 0x34 ? ? DS + 0x302 DS +0x303 Fonte DS + 0x301 DS + 0x300 0x0302 SIadd
AX
,
[SI]
Funcionamento do SUB
0x0001 AX 0x0003 Origem Destino 0xFFFE AX Destinosub
AX
,
0x0003
Instruções Aritméticas INC/DEC
Incrementa/decrementa o valor de destino em uma unidade colocando o resultado em destino
Melhor do que utilizar add/sub, pois inc/dec são instruções que ocupam menos memória (1 byte invés de 3 bytes)
destino pode ser:
inc
destino
Forma Geral
destino exemplo
registrador inc ax
memória dec byte[0x1e]
Funcionamento do INC/DEC
0x0001 AX Destino 0x0002 AX Destinoinc
AX
0x0001 AX Destino
dec
AX
Instrução Aritmética CMP
Compara o valor de origem com o de destino, mas não altera o valor de nenhum dos operandos
– Altera o flag ZF para 1 caso operandos iguais, senão 0
São possíveis as seguintes combinações:
cmp
destino
,
origem
Forma Geral
destino, origem exemplo
registrador, registrador cmp ax, dx
registrador, imediato cmp al, 0x12
registrador, memória cmp ax, [0x1e]
memória, registrador cmp [bx], ax
Funcionamento do CMP
Destinocmp word
[SI]
,
0x10
Memória 0x00 0x10 ? ? DS + 0x302 DS +0x303 Origem DS + 0x301 DS + 0x300 0x0302 SI 0x0010
1
Instrução Aritmética CMPXCHG
Compara o valor de destino a AL, AX ou EAX (depende do tamanho de destino)
– Se operandos forem iguais, destino←origem – Senão, AL,AX ou EAX ← destino
São possíveis as seguintes combinações:
cmpxchg
destino
,
origem
Forma Geral
destino, origem exemplo
registrador, registrador cmpxchg bl, dl
registrador, memória cmpxchg bx, [0x1e]
Funcionamento do CMPXCHG
cmpxchg
bl
,
cl
Antes
Mais sobre CMPXCHG
Esta instrução só foi criada a partir do processador 486
Permite a comparação e troca de valores de maneira atômica
– Usada para a atualização atômica de semáforos
mov dx,1 mov ax, 0 Lock:cmp ax,[bx] jnz Lock mov [bx],dx Regiao_critica: mov dx,1 Lock:mov ax, 0 cmpxchg [bx],dx jnz Lock Regiao_critica:
Pode ser interrompido entre duas instruções
Atualização atômica do
Instrução Aritmética MUL
Faz a multiplicação sem sinal do valor de origem por AL, AX ou EAX
– origem é um registrador ou um operando na memória
Resultado colocado em:
mul
origem
Chapter 2 — Instructions: Language of the Computer — 15
Funcionamento do MUL
MUL CL
00 20H 00 80H AH AL CH CL 10 00H AH AL Multiplica CL por AL e coloca resultado em AXInstrução Aritmética IMUL
A primeira forma é idêntica a mul, porém é uma multiplicação com sinal
Na segunda forma, faz origem x destino e coloca resultado em destino
– destino deve ser um registrador de 16/32 bits
– origem pode ser reg, operando na memória ou imediato
Na terceira forma, faz imediato x origem (não pode ser imediato) colocando o resultado em destino
imul
origem
Formas Gerais
imul
destino
,
origem
Exemplos de Uso IMUL
imul cl; ax = cl*al
imul ax,bx; ax = ax * bx
imul ecx,[di]; ecx = ecx *[di]
imul bx,-50; bx = bx * (-50)
imul ebx,[esi],2000; ebx = [esi] * 2000
Instrução Aritmética DIV/IDIV
div/idiv fazem a divisão sem/com sinal de AX, DX:AX,
ou EDX:EAX por origem dependendo do tamanho de
origem (byte, word ou double word)
– origem é um registrador ou um operando na memória
div
origem
Forma Geral
Funcionamento do IDIV
IDIV
CX
DX 0x7960 AX CX Divide DX:AX por CX e coloca resultado em DX:AX 0xFFFE 0x1388 0xFFEC 0xFFFE7960÷
AX DX 0x0000 Em decimal -100000 Em decimal 5000 Em decimal -20 Quociente RestoInstrução Aritmética NEG
Muda o sinal do valor de destino
– destino é um registrador ou um operando na memória – Lembrando que números são representados em
complemento de dois Exemplos:
neg
destino
Forma Geral
destino exemplo registrador neg bx
Instruções Aritméticas CBW/CWD/CWDE/CDQ
cbw faz uma extensão com sinal do operando de 8 bits de
al para 16 bits em ax
cwd faz uma extensão com sinal do operando de 16 bits
de ax para 32 bits em dx:ax
cwde faz uma extensão com sinal do operando de 16 bits de ax
para 32 bits em eax
cdq faz uma extensão com sinal do operando de 32 bits de eax
para 64 bits em edx:eax
Úteis para preparar os operandos antes de um mul ou div
cbw
Formas Gerais
Instrução Lógica NOT
Faz a negação bit a bit de destino
– destino é um registrador ou um operando na memória
Exemplos:
not
destino
Forma Geral
destino exemplo
registrador not ax
Instruções Lógicas AND/OR/XOR
Faz o e/ou/ou-exclusivo lógico bit a bit de origem com
destino, colocando o resultado em destino
São possíveis as seguintes combinações:
and
destino
,
origem
Formas Gerais
destino, origem exemplo
registrador, registrador and ax, dx
registrador, imediato or al, 0x12
registrador, memória xor ax, [0x1e]
memória, registrador and [bx], ax
memória, imediato or byte[si], 0x23
or
destino
,
origem
xor
destino
,
origem
Instrução Lógica TEST
Faz o “e” lógico bit a bit de origem com destino,
contudo não coloca o resultado em destino, apenas as flags são alteradas
São possíveis as seguintes combinações:
test
destino
,
origem
Forma Geral
destino, origem exemplo
registrador, registrador test ax, dx
registrador, imediato test al, 0x12
registrador, memória test ax, [0x1e]
memória, registrador test [bx], ax
memória, imediato test byte[si], 0x23
imediato, registrador test 0x23, cl
Diferença entre o AND e o TEST
and
al
,
dl
1
00000001 AL DL 10000000 00000000 ALtest
al
,
dl
1
00000001 ALFaz o and bit a bit e modifica al e flags
Faz o and bit a bit e modifica apenas
Exemplo de Uso do Test
test dx,1
jnz IMPAR
inc ax
jmp exit
IMPAR:
inc bx
exit:...
Código que testa se um
número é par ou ímpar
if (d % 2 == 0)
par++;
else
impar++;
...
Instruções Lógicas BSF/BSR
Instruções que percorrem origem bit a bit até encontrar o primeiro bit 1, e colocam a posição do bit em destino
– destino deve ser um registrador de 16/32 bits ou um operando na memória
– origem pode ser um registrador de 16/32 bits ou um operando na memória
bsf percorre origem partindo do bit menos significativo,
bsr percorre no sentido contrário
Se origem tem valor 0, ZF terá valor 1 e destino terá um valor indefinido
bsf
destino
,
origem
Formas Gerais
Funcionamento do BSF e o BSR
EBX
0x4CE00000
bsf
eax
,
ebx
0x00000015 EAX 21 em decimal
Instrução Lógica BT
Testa o bit de destino na posição indicada por origem, e coloca o valor do bit no flag de carry
– Instrução adicionada no processador 386
São possíveis as seguintes combinações de operandos:
bt
destino
,
origem
Forma Geral
destino, origem exemplo
reg16/32, imediato bt ax, 10
reg16/32, reg16/32 bt eax,ebx
mem16/32, reg16/32 bt word[0x300], ax
Funcionamento do BT
Destinobt word
[SI]
,
4
Memória 0x00 0x00 0x00 0x10 DS + 0x302 DS +0x303 DS + 0x301 DS + 0x300 0x0300 SI
1
0x0010 Binário 0000000000010000 Bit 4Instruções Lógicas BTC/BTS/BTR
Testam o bit de destino na posição indicada por origem, e coloca o valor do bit no flag de carry, mas modificam o bit em destino
– btc complementa o bit de destino na posição indicada por
origem
– bts coloca o bit de destino para 1 na posição indicada por
origem
– btr coloca o bit de destino para 0 na posição indicada por
origem
btc
destino
,
origem
Formas Gerais
bts
destino
,
origem
Exemplos de Uso BTC/BTS/BTR
mov ax,10
btc ax,0; ax = 11, carry = 0
bts ax,2; ax = 15, carry = 0
btr ax,3; ax = 7, carry = 1
Instrução Lógica SETcc
Testa a flag especificada em condição, caso ela seja
verdadeira, armazena-se o valor 1 no byte especificado em
destino, caso contrário 0
– destino só pode ser um registrador/operando na memória de 8 bits