Instrukcje assemblera¶
Podstawowe operacje logiczne, arytmetyczne i powiązane¶
Podstawowa składnia asm:
; To jest komentarz
mov eax, 7 ; ustaw eax na 7
mov eax, ebx ; ustaw eax na wartość ebx
mov eax, [8] ; ustaw eax na wartość z pamięci pod adresem z 8
mov eax, [ebx] ; ustaw ebx na wartość z pamięci pod adresem odczytanym z ebx
mov eax, [ebx + ecx*4 + 128] ; ustaw eax na wartość z pamięci pod adresem
; obliczonym z wyrażenia [...] (wyrażenia są bardzo ograniczone)
mov CEL, ŹRÓDŁO
- skopiuj wartość ze źródła do celu (mogą być to rejestry, lokalizacje w pamięci lub konkretne wartościadd CEL, ŹRÓDŁO
- dodaje źródło do celusub CEL, ŹRÓDŁO
- odejmuje źródło od celushl/shr CEL, ŹRÓDŁO
- wykonuje przesunięcie bitowe w lewo/prawo na celu o źródło bitówxchg A, B
- zamienia A z B (muszą być to rejestry bądź rejestr i miejsce w pamięci)lea CEL, ADRES
- ADRES podaje się jak miejsce w pamięci, ale jest ono obliczane i zapisywane do celu tak jak robi tomov
mul B
- mnoży (unsigned) rax przez B, zapisuje wynik do rdx(wyższe bity) i rax(niższe bity)imul B
- tak jak mul, ale wykonuje mnożenie ze znakiem (signed)imul CEL, ŹRÓDŁO
- mnoży cel przez źródło, zapisuje wynik do celuimul CEL, A, B
- mnoży A przez B i zapisuje do celudiv B
- dzieli(unsigned) rdx:rax przez B, zapisuje część całkowitą do rdx, a resztę do eaxidiv B
- tak jak div, ale dzieli ze znakiem (signed)neg A
- wykonuje negację A, zgodnie z metodą 2’s complement (A <- ~A + 1)cdq
- Convert dword to qword - rozszerza znak rax do rdxinc A
- zwiększa A o 1dec A
- zmniejsza A o 1and/or/xor CEL, ŹRÓDŁO
- wykonuje odpowiednią operację logiczną i zapisuje wynik do celunot A
- neguje wszystkie bity A
push A
- odkłada wartość/rejestr A na stospop A
- zdejmuje wartość ze stosu i zapisuje do Apushf
- odkłada flagi procesora na stosiepopf
- zdejmuje flagi procesora ze stosu
nop
- nic nie robi :Dnaz.wa:
- etykieta, oznacza adres kolejnej instrukcji; jeżeli zaczyna się kropką, to jest lokalna dla nadrzędnej etykietyjmp ADRES
- wykonuje skok do adresu (ustawia rip na adres)call ADRES
- odkłada adres następnej instrukcji na stos, a następnie skacze do adresu (jak wywołanie funkcji)ret
- zdejmuje adres ze stosu i do niego skacze (jak powrót z funkcji)int BAJT
- wywołuje przerwanie programowe o podanym numerze (1-bajtowym)- (tylko 64-bitowe)
syscall
- obsługuje syscall zgodnie z interfejsem systemu operacyjnego
test A, B
- wykonuje and bitowy na A i B, flaga znaku jest ustawiana na najbardziej znaczący bit, zera jeżeli wynik jest zerem, parzystości, gdy wynik ma parzystą liczbę jedynekcmp A, B
- porównuje A z B i ustawia odpowiednie flagije/jz ADRES
- skacze gdy ZF=1 (cmp: A==B)jne/jnz ADRES
- skacze gdy ZF=0 (cmp: A!=B)jg ADRES
- skacze gdy SF=OF;ZF=0 (cmp: A>B)jge ADRES
- skacze gdy SF=OF;ZF=1 (cmp: A>=B)ja ADRES
- tak jak jg, ale porównanie bez znakujae ADRES
- tak jak jge, ale porównanie bez znakujl ADRES
- skacze gdy SF!=OF (cmp: A>B)jle ADRES
- skacze gdy SF!=OF lub ZF=1 (cmp: A>=B)jb(e) ADRES
- są dla jl i jle tak jak ja i jae dla jg i jgejo ADRES
- skacze gdy OF=1 (overflow flag)jno ADRES
- skacze gdy OF=0 (overflow flag)js ADRES
- skacze gdy SF=1 (sign flag)jns ADRES
- skacze gdy SF=0 (sign flag)loop ADRES
- zmniejsza rcx o 1, skacze jeżeli rcx jest jeszcze większe od 0loop(e/ne/z/nz)
- jeżeli warunek jest spełniony to działa tak jak loop, jeżeli nie to jest pomijana