Wstęp do assemblera
Język maszynowy a assembler
Język maszynowy wymaga instrukcji bezpośrednio jako liczb,
które są rozkazami i danymi bezpośrednio pobieranymi przez procesor wykonujący ten program.
Każdy typ procesora ma swój własny język maszynowy
Asembler jest językiem programowania niskiego poziomu, co oznacza,
że jednej komendzie asemblera odpowiada dokładnie jeden rozkaz procesora.
8b 15 92 80 04 08 mov edx, [koniec]
eb 0a jmp koniec
- Etykieta koniec oznacza adres 0x08048092 (little endian)
Intrukcja asemblera
Instrukcja assemblera ma postać:
etykieta: mnemonik operandy
- mnemoniki są charakterystyczne dla danego asemblera
- jeden mnemonic może kodować wiele instrukcji maszynowych w zależności od operandów
- kolejność i nazewnictwo operandów też jest specyficzne dla danego asemblera
Typy operandów
- register - nazwa rejestru
- memory odnoszą się do danych w pamięci, adres może być podany bezpośrednio jako częśc instrukcji
lub obliczany na postawie wartości rejestrów
- immediate stałe które są częścią instrukcji,
- implied operandy domyślne np. 1 w instrukcji zwiększania o jeden.
Tryby adresowania w 64-bit
- bezpośredni - podajemy 32 lub 64 bitową stałą, która określa przesunięcie względem początku pamięci (czyli adresu 0)
- pośredni przez rejestr - adres znajduje się w jednym z 64/32 bitowych rejestrów (uwaga: adres 32 bit zostaje uzupełniony zerami).
mov al, [rax]
mov al, [ebx]
- indeksowany - efektywny adres wylicza się dodając adres zmiennej i wartość przechowywaną w jednym z rejestrów.
mov zmienna[ebx], 5
- skalowany (ModR/M)
adres = baza + indeks * skala + przesuniecie
gdzie
- baza i indeks znajdują sie w rejestrach,
- skala=1,2,4,8,
- przesuniecie jest czescia instrukcji
mov [ebx + esi * 4 + 2]
- relatywny względem aktualnej instrukcji
adres = rip + przesuniecie
mov [rip + przesuniecie], 1
Typy danych
Rozmiary:
| Nazwa | Liczb bitów | nasm | |
| byte | 8 | db | |
| word | 16 | dw | |
| double word (dword) | 32 | dd | |
| quadruple word (qword, long) | 64 | dq | |
| octuple word (oword) | 128 | do | |
Interpretacja jest zależna od instrukcji:
- liczba całkowita bez znaku
- liczba całkowita ze znakiem
- adres pamięci
- liczba zmiennoprzecinkowa
Składnia Intel vs. AT&T
Intel (NASM)
neg cx
add eax, 44
shl rsi, cl
mov [rsp-12], edi
mov dword [variable], 0
inc qword [ebp+4*ecx+32]
jmp label
jmp [location] | AT&T (GCC, GAS)
negw %cx
addl $44, %eax
shlq %cl, %rsi
movq %edi, -12(%rsp)
movl $0, variable
incq 32(%ebp,%ecx,4)
jmp label
jmp *location |
Tomasz Kapela, Kraków 2011-2020