uvod u GNU asembler, asemblersko programiranje Flashcards
Direktiva .align expr?
Ova direktiva radi poravnanje , ubacice od 0 do expr bajtova kako bi uradila poravnanje, expr mora biti stepen dvojke
.byte 0x55
.align 4 (dodacemo 3 0x00)
.long 0xAA55EE11
Direktiva .ascii “string” ?
Ubacuje string bez nul karaktera
.ascii “JNZ” (0x41 0x4E 0x5A)
Direktiva .asciz “string”?
Ubacuje string sa null karakterom
.asciz “JNZ” (0x41 0x4E 0x5A 0x00)
Direktiva .byte “izraz”?
Ubacuje najt
Direktiva .data?
Sekcija u kojoj se nalaze promenljivi podaci
Direktiva .text?
Sekcija u kojoj se nalazi izvrsni kod
Direktiva .rodata?
Nalaze se konstance
Direktiva .bss?
Nalaze se neinicijalizovani staticki podaci
Direktiva .end?
Kaze da se ovde zavrsava asemblerski kod, sve posle ove direktive smatramo da ne postoji
Diretiva .equ simbol,izraz?
Dodeljuje vrednosti kao i diretiva .set ili =
.equ var, (5*8)-2
<=>
.set var, 0x2A
<=>
var = 0x2A
Direktiva .global?
Kazuje da je ovaj simbol globalam i da se koristi u drugim modulima
Direktiva .word ili .2byte?
Ubacujemo 16obitnu rec, 2 bajta
Direktiva .include “fajl”?
Ubacuje sadrzaj fajla na mesto ove direktive
Direktiva .skip izraz?
Korismo za deklarisanje neinicijalizovanih promenljivi, tj. kao da vrsimo rezervaciju prostora za nju
buffer: .skip 512 (bafer je velicine 512 bajtova)
Direktiva .long ili .4byte?
Ubacuje 32bitnu rec
Direktiva .quad ili .8byte?
Ubacuje 64obitnu rec
Apsolutne i relativne vrednosti?
-apsolutne vrednosti: ne zavise od svog polozaja u izvrsnom kodu
primer: numericka konstanta
-relativne vrednosti: izvrsavaju se u odnosu na neku adresu, koriste samo + i i koriste se za sracunavanje pomeraja
Pravilo mesanja:
rel + apso = rel
apso + rel = rel
rel - aspo = rel
rel - rel = apso
Stanje arhitekture vidljivo programeru?
-PC = adresa sledece instrukcije
-reg banka = registri
-kodovi uslova =status info o poslednjoj aritmeticko logickoj operaciji
-memorija = kod i podaci (.text, .data, .bss) i stek
Kako bi se ovo napisalo na asembleru:
chart c = ‘0’;
short s = 1;
int i = 2;
long l = 3l;
void *p = &1;
float f =5.0f;
double d = 6.0;
chart str[] = “Niz znakova”;
c: .byte ‘0’
.align 2 (poravnanje kako bi short poceo
s: .word 1 tamo gde treba)
.align 4
i: .long 2
.align 8
l: .quad 3
.align 8
p: .quad 1
.align 4
f: .long 5.0
.align 8
d: .quad 6.0
.align 8
str: .string “Niz znakova”
Komanda za predstavljanje neinicijalizovanih podataka?
primer:
short s;
chart str[10];
asembler: .comm s,2,2 [simbol,broj_bajtova,uravnanje]
chart str,10,8
x86 arhitektuja je tipa little_endian , sta to znaci?
Znaci da na najnizu adresu ide bajt najmanje tezine
Bitni registri za nas su?
rip - koji predstavlja pc kounter
esp - stek pointer
ebp -bejz pointer
eax - akumulator
Transfer podataka, operacija mov?
mov ne moze da radi prebacivanje iz memorije u memoriju, to nije dozvoljena kombinacija
izvoriste: mem, reg, imm
odrediste: mem ,reg
mov odrediste,izvoriste
ako je odrediste memorija mozemo dodati specifikaciju koliki je taj podatak na primer
mov QWORD PTR[rax], -147
Instrukcija za racunanje adresa lea?
lea dest, sors
-samo izracunava adresu podatka, ali mu ne pristupa
Aritmeticke i logicke operacije?
-ne prave razliku izmedju oznacenih i neoznacenih brojeva
-add ->sabiranje
-sub ->oduzimanje
-imul ->mnozenje
-shl/sal ->siftovanje u levo
-sar/shr ->siftovanjeu desno
-xor ->ekskluzivno ili
-and -> i logicko
-or -> ili logicko
-inc
-dec
-neg ->negacija oznacenih brojeva
-not ->bitski komplement
Kodovi uslova?
To su flegovi pswa
-CF=1 ako radimo sa neoznaceim brojevima imamo prenos/pozajmice
-ZF=1 ako je rezultat nula
-SF=1 ako radimo sa oznacenim brojevima, rez je negativan broj
-OF=1 ako radimo sa oznacenim brojevima, prekoracenje (a,b>0, (a+b)<0) ili (a,b<0 , (a+b)>0)
Kada se postavljaju kodovi/flegovi uslova?
Kada radimo sa aritmetickim operacijama, ne racunajuci lea instrukciju i instrukcije poredjenja :
cmp br1, br2 ->radi oduzimanje brojeva i postavlja flegoe, tako da znamo rezultat poredjenja ovih brojeva
test br1,br2 -> takodje radi poredjenje jedino sto radi bitsko & brojeva, postavlja samo SF i ZF
set instrukcijom, menja samo jedan bit ne celo reg psw:
sete -ZF(==0), setne -~ZF(!=0), sets-SF(negativan broj), setns- ~SF(nenegativan broj), setg(veci), setge (>=), setl(<), setle(<=), seta, setb,…
Operacija movzx?
Postavlja u gornjoj polovini registra sve 000, a u donjoj vrednost koju prebacujemo
Operacija cmovX dest, src?
Prebacivanje se vrsi samo ako je uslov X ispunjen
Stek?
lifo princip rada,
push src - umanjujemo rsp za 8 i upisujemo operand na datu adresu
pop des - citamo vrednost sa adrese rsp, uvecavamo rsp za 8
Stek raste prema nizim adresama
Poziv i povratak iz potprograma?
call labela -> stavljamo povratnu adresu na stek i skacemo na labelu
ret ->skidamo adresu sa steka i skok na adresu
Ulazni parametri i povratna vrednost?
prvih 6 parametara ide na rdi,rsi,rdx,rsx,r8,r9 , ako imamo vise od 6 param koristimo stek
povratna vrednost ide u rax
Okvir na steku?
Sadrzi: povratnu adresu, lokalne promenljive, privremene prom
-na pocetak pokazuje registar rbp
Tekuci okvir ima?
Argumente
7+
____________________
povratna vrednost
___________________
stari rbp <- novi rbp
_______________
sacuvani reg+
lokalne vrednosti
Koje registre cuva pozivalac, a koje pozvani potprogram?
Pozivalac cuva rax,rdi,…r9, r10 i r11
Pozvani potprogram cuva rbx,r12,r13,r14,rbp,rsp
Direktiva .extern simb?
Kazemo da je simbol definisan u nekom drugom fajlu/modulu, al se ovde koristi
Programski skokovi?
jX oblika, skok u kodu u zavisnosti od kodniv uslova/flegova