Você está na página 1de 4

Uso explícito da STACK

mov eax, 15AB


mov ebx, 102C FFFF

ESP
push eax
15AB
push ebx 102C

pop ecx
;ecx fica com 102C …………
pop edx
;edx fica com 15AB
0

Memória

Uso implícito da STACK

CALL usa PUSH


RET usa POP

; programa ; func01
… …
… …
call func01 …
… ret

CALL faz push do endereço de retorno e salta para a função.


RET faz pop do endereço de retorno e volta ao programa.

Instruções aritméticas

Adição

V1 dd 8

mov eax, 23
mov ebx, 7
add eax, ebx ; eax fica com o valor 30
add ebx, -2 ; ebx fica com 5
add [V1], 4 ; V1 fica com 12
add eax, [V1] ; eax fica com 42
adc eax, ebx ; equivalente a: eax = eax + ebx + CF

inc eax ; equivalente a: eax = eax + 1

Subtracção

sbb eax, ebx ; equivalente a: eax = eax – ebx – CF

dec eax ; equivalente a: eax = eax – 1

neg eax ; equivalente a: eax = – eax

Multiplicação

Os registos eax e edx são usados implicitamente.


eax – multiplicador
edx : eax – resultado

Neste exemplo o ebx é o multiplicando (mas podia ser outro registo qualquer):

mov eax, 4
mov ebx, 7
mul ebx

O resultado fica em edx : eax.


Neste caso, ficam com os seguintes valores:
edx – 0
eax – 28

Divisão

Os registos eax e edx são usados implicitamente.


edx : eax – dividendo
eax – cociente
edx – resto

Neste exemplo o ebx é o divisor (mas podia ser outro registo qualquer):

mov edx, 0
mov eax, 35
mov ebx, 8
div ebx

O resultado desta divisão é:


eax – 4
edx – 3
CBW – Converte byte em word

mov al, –5
mov bx, 1024
add bx, al ; erro! registos de tamanhos diferentes

mov al, –5
mov bx, 1024
cbw
add ax, bx

Justificação:
O número –5 é representado, em binário com 8 bits, da seguinte forma: 11111011
5=00000101
-5=11111010 (em complemento para 1)
-5=11111011 (em complemento para 2)

O mesmo número –5 é representado, em binário com 16 bits, da seguinte forma:


1111111111111011

A instrução CBW converte o número 11111011 em 1111111111111011.

Instruções de manipulação de bits

al 1011010
1
bl 0110001
1
and a l , b l 0010000
1
or a l , b l 1111011
1
xo r a l , b l 1101011
0
not a l 0100101
0
sh l b l , 1 1100011 O bit mais à esquerda perde-se e
entra 0 pela direita
0
sh l a l , 1 0110101 O bit mais à esquerda perde-se e
entra 0 pela direita
0
shr al, 1 0101101 O bit mais à direita perde-se e entra 0
pela esquerda
0
sar al, 1 1101101 O bit mais à direita perde-se e entra o
sinal pela esquerda
0
sar bl, 1 0011000 O bit mais à direita perde-se e entra o
sinal pela esquerda
1
rol bl, 1 1100011 O bit que sai pela esquerda entra pela
direita
0
ror al, 1 1101101 O bit que sai direita pela entra pela
esquerda
0
rcr bl, 1 0011000 Supor que CF=0 antes da instrução.
No final, fica CF=1
1
Explicação do rcr bl,1:

bl 01100011

0 CF

Após instrução

bl 00110001

1 CF