Prezentacja - fulmanski.pl

Download Report

Transcript Prezentacja - fulmanski.pl

Asembler - podstawowe instrukcje,
deklarowanie zmiennych.
Ariel Grzechowski
Rejestr flag
Zapisane są w nim takie ustawienia, jak np. możliwość korzystania z
instrukcji wejścia-wyjścia przez nasz program. Ponadto, w rejestrze tym
zapisywanych jest wiele informacji na temat ostatnio przeprowadzanej
operacji arytmetycznej.
Rejestr EFLAGS wygląda tak (rozkład bitów):
31
30
29
28
27
26
25
24
23
22
21
20
19
18
17
16
0
0
0
0
0
0
0
0
0
0
ID
VIP
VIF
AC
VM
RF
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
0
NT
OF
DF
IF
TF
SF
ZF
0
AF
0
PF
1
CF
IOPL
Rejestr flag
znaczniki, których wartość zależna jest jedynie od ostatniego działania arytmetycznego
ID
ang. nazwa
równy 1 gdy
CF
carry flag
w wyniku dodawania/odejmowania przekroczono możliwy zakres wartości zmiennej
PF
parity flag
liczba jedynek w najmłodszym bajcie jest parzysta
AF
auxiliary flag
wystąpiło przeniesienie z bitu 3. na 4. lub pożyczka z 4. na 3.
ZF
zero flag
wynik ostatniego działania wyniósł 0
SF
sign flag
bit znaku jest równy 1 (liczba jest ujemna)
OF
overflow flag
bit znaku zmienił swoją wartość, ale nie doszło do przeniesienia poza zakres (tzn. CF=0)
pozostałe znaczniki ze zmienną wartością
NT
nested task
obecny proces nie wywodzi się z żadnego innego (nie wywołano go poprzez CALL; nie dotyczy
JMP)
RF
resume flag
wystąpiło przerwanie zatrzymujące wykonanie programu (może wystąpić tylko, gdy TF=1)
VIP
virtual interrupt pending
trwa wirtualne przerwanie
ID
ID flag
jeśli można zmienić jej wartość oznacza to, że procesor obsługuje instrukcję CPUID
Rejestr flag
znaczniki, które mają wpływ na sposób działania procesora
ID
ang.
nazwa
gdy równy 1
TF
trap flag
procesor wchodzi w tryb pracy krokowej, dzięki czemu po każdym wykonanym poleceniu generuje przerwanie i
przechodzi do odpowiednich procedur obsługi (wykorzystywane przez np. debuggery)
IF
interrupt
flag
przerwania są uwzględniane (w przeciwnym wypadku są ignorowane)
DF
direction
flag
przetwarzanie łańcuchów odbywa się w normalny sposób, ku rosnącym adresom; w przeciwnym wypadku w
dół, ku malejącym
IOPL
inputoutput
privilage
level
odczyt/zapis z/do wyjścia jest dozwolony; jest to 2-bitowa flaga
VM
virtual
8086
mode
przejście w tryb emulacji procesora 8086
VIF
virtual
interrupt
flag
przerwania są dozwolone (kopia IF w trybie wirtualnym); aby tryb wirtualny został aktywowany musi zostać
włączona flaga VME w rejestrze CR4
Asembler - podstawowe instrukcje
Instrukcje dzielimy na:
1. Arytmetyczne
2. Logiczne
3. Skokowe
4. Transferowe
Asembler – instrukcje arytmetyczne
add
działanie: sumuje A i B; wynik przechowuje w A.
A: rejestr lub adres pamięci.
B: konkretna wartość, rejestr lub adres pamięci (jeśli A nie jest adresem).
modyfikowane flagi: OF, CF, SF, ZF, AF i PF.
Przykład:
add eax, 09h
Asembler – instrukcje arytmetyczne
sub
działanie: odejmuje B od A; wynik przechowuje w A.
A: rejestr lub adres pamięci.
B: konkretna wartość, rejestr lub adres pamięci (ale tylko jeśli A również nie
jest adresem pamięci).
modyfikowane flagi: OF, CF, SF, ZF, AF i PF.
Przykład:
sub edx, 09h
Asembler – instrukcje arytmetyczne
mul
działanie: mnoży A przez odpowiedni rejestr i zapisuje wynik w odpowiednim
rejestrze (zależne od rozmiaru A; patrz tabela); wszystkie działania są
wykonywane na liczbach bez znaku; dla liczb ze znakiem skorzystaj z imul.
A: rejestr ogólnego przeznaczenia lub adres pamięci.
modyfikowane flagi: OF, SF, ZF, AF, PF i CF.
modyfikowane rejestry: zależnie od rozmiaru A
Przykład:
mul eax
rozmiar A
rejestr
wynik
byte
AL
AX
word
AX
DX:AX
double word
EAX
EDX:EAX
Asembler – instrukcje arytmetyczne
div
działanie: dzieli odpowiedni rejestr przez A i przechowuje wynik w tym rejestrze
(patrz niżej). Zarówno rejestr jak i A są traktowane jako liczby bez znaku. Dla
liczb ze znakiem skorzystaj z idiv.
A: rejestr lub adres pamięci.
modyfikowane flagi: OF, CF, SF, ZF, AF i PF.
modyfikowane rejestry: zależnie od rozmiaru A.
Przykład:
div eax
rozmiar A
rejestry
wynik
reszta
byte
AX
AL
AH
word
DX:AX
AX
DX
double word
EDX:EAX
EAX
EDX
Asembler – instrukcje arytmetyczne
POZOSTAŁE
adc
cmp
dec
idiv
sumowanie A i B oraz flagi CF (przeniesienia)
porównuje A i B oraz ustawia flagi
zmniejsza A o 1
dzielenie dla liczb ze znakiem
imul
inc
mnożenie dla liczb ze znakiem
zwiększa A o 1
sbb
odejmuje B i flage CF(przeniesienie) od A
Asembler – instrukcje logiczne
and
działanie: wykonuje operację AND (koniunkcja) na odpowiadających sobie
bitach operandów A i B; wynik jest przechowywany w A (poprzednia wartość
zostaje zamazana).
A: rejestr lub adres pamięci.
B: konkretna wartość, rejestr lub adres pamięci (jeśli A nie jest adresem).
modyfikowane flagi: OF i CF są zerowane; SF, ZF i PF nabywają wartość
zależną od wyniku.
Przykład:
and edx, ebx
Asembler – instrukcje logiczne
not
działanie: neguje (odwraca) wartości wszystkich bitów w A (1->0; 0->1).W
literaturze instrukcja ta zwana jest także uzupełnieniem jedynkowym
A: rejestr lub adres pamięci.
Przykład:
not edx
Asembler – instrukcje logiczne
shl
działanie: przesuwa wszystkie bity A w lewo o ilość bitów zdefiniowaną przez B
A: rejestr lub adres pamięci.
B: konkretna wartość lub rejestr CL (8-bitowa część rejestru ECX).
modyfikowane flagi: CF (przyjmuje wartość ostatniego bitu "wyrzuconego"
poza obręb); SF, ZF i PF (zależnie od wyniku), OF (tylko, gdy B=1; przyjmuje
wartość 0, gdy dwa ostatnie bity przed przesunięciem były równe; przyjmuje
1 w przeciwnym przypadku).
Przykład:
shl edx 02h
Asembler – instrukcje logiczne
POZOSTAŁE
neg
or
shr
wykonuje działanie 0-A (odwraca znak liczby)
wykonuje operacje OR na bitach A i B
przesuwa bity A w prawo
test
wykonuje operacje AND ale nie zapisuje
nigdzie wyniku, ustawia tylko odpowiednie
flagi
xor
wykonuje operacje XOR na bitach A i B
Asembler – instrukcje skokowe
jmp
działanie: polecenie wykonuje bezwarunkowy skok do etykiety. Instrukcja ta
przyjmuje tylko jeden operand.
A: etykieta do której ma być wykonany skok.
Przykład:
jmp etykieta
Asembler – instrukcje skokowe
call
działanie: wykonuje wywołanie procedury (funkcji).
A: etykieta lub adres procedury zawarty w rejestrze lub komórce
pamięci.
Przykład:
Call moja_procedura
Asembler – instrukcje skokowe
POZOSTAŁE
Mnemonik
Opis warunku
Znacznik lub
rejestr
JZ
JE
skok, jeśli zero
skok, jeśli równe
ZF=1
JNZ
JNE
skok, jeśli nie zero
skok, jeśli nie równe
ZF=0
JA
JNBE
skok, jeśli większe (bez znaku)
skok, jeśli nie mniejsze lub równe (bez znaku)
CF=0 i ZF=0
JNA
JBE
skok, jeśli nie większe (bez znaku)
skok, jeśli mniejsze lub równe (bez znaku)
CF=1 lub ZF=1
JB
JNAE
JC
skok, jeśli mniejsze (bez znaku)
skok, jeśli nie większe lub równe (bez znaku)
skok, jeśli jest przeniesienie
CF=1
JNB
JAE
JNC
skok, jeśli nie mniejsze (bez znaku)
skok, jeśli większe lub równe (bez znaku)
skok, jeśli nie ma przeniesienia
CF=0
JG
JNLE
skok, jeśli większe (ze znakiem)
skok, jeśli nie mniejsze lub równe (ze znakiem)
ZF=0 i SF=OF
Asembler – instrukcje skokowe
POZOSTAŁE
Mnemonik
Opis warunku
Znacznik lub
rejestr
JNG
JLE
skok, jeśli nie większe (ze znakiem)
skok, jeśli mniejsze lub równe (ze znakiem)
ZF=1 lub
SF<>OF
JL
JNGE
skok, jeśli mniejsze (ze znakiem)
skok, jeśli nie większe lub równe (ze znakiem)
SF<>OF
JNL
JGE
skok, jeśli nie mniejsze (ze znakiem)
skok, jeśli większe lub równe (ze znakiem)
SF=OF
JCXZ
skok, jeśli rejestr CX=0
CX=0
JECXZ
skok, jeśli rejestr ECX=0
ECX=0
JP, JPE
skok, jeśli parzystość
PF=1
JNP, JPO
skok, jeśli nieparzystość
PF=0
JO
skok, jeśli przepełnienie
OF=1
JNO
skok, jeśli nie ma przepełnienia
OF=0
JS
skok, jeśli znak (ujemny)
SF=1
JNS
skok, jeśli nie ma znaku (dodatni)
SF=0
Asembler – instrukcje transferowe
mov
działanie: kopiuje B do A. Oba parametry muszą być tego samego rozmiaru.
Operand docelowy i źródłowy nie mogą być jednocześnie adresami w
pamięci.
A: rejestr ogólnego przeznaczenia, rejestr segmentowy (poza CS) lub adres
w pamięci.
B: konkretna wartość, rejestr ogólnego przeznaczenia, rejestr segmentowy
lub adres w pamięci.
Przykład:
mov edx, 09055509h
Asembler – instrukcje transferowe
push
działanie: umieszcza A na szczycie stosu.
A: word lub double word.
modyfikowane rejestry: ESP (zwiększany o rozmiar A)
Przykład:
push edx
Asembler – instrukcje transferowe
xchg
działanie: wymienia zawartość operandów między sobą.
Przykład:
xchg AL, CL
Asembler – instrukcje transferowe
POZOSTAŁE
clc
cld
cli
cmc
Ustawia flagę CF na 0
Ustawia flagę DF na 0
Ustawia flagę IF na 0
Neguje zawartość flagi CF
movzx
out
Kopiuje B do A wraz z rozszerzeniem o zera
wysyła dane A do portu B
Asembler – instrukcje transferowe
POZOSTAŁE
pop
zdejmuje ze stosu wartość i kopiuje do A
popa,popad zdejmuje ze stosu wszystkie wartości i
kopiuje je rejestrów ogólnego przeznaczenia
pusha
odkłada wszystkie rejestry na stos
stc
Ustawia flagę CF na 1
std
Ustawia flagę DF na 1
sti
Ustawia flagę IF na 1
Asembler – deklarowanie zmiennych
NASM
Aby utworzyć nową zmienną należy użyć schematu:
nazwa typ wartość
W polu nazwa wpisujemy nazwę dla naszej zmiennej (pole to jest opcjonalne); w
polu typ wpisujemy typ zmiennej (patrz: tabela), zaś w polu wartość
wpisujemy startową wartość dla naszej zmiennej.
ID
PRZYKŁAD:
liczba db 10
nazwa ang.
nazwa polska
rozmiar
b
byte
bajt
1 bajt
w
word
słowo
2 bajty
d
double word
podwójne słowo
4 bajty
f
threefold word
potrójne słowo/sześć bajtów
6 bajtów
q
quad word
poczwórne słowo
8 bajtów
t
ten bytes
dziesięć bajtów
10 bajtów
Asembler – deklarowanie zmiennych
GNU As
Aby utworzyć nową zmienną należy użyć schematu:
nazwa: .typ wartość
PRZYKŁAD:
liczba .string "\10\18\3"