Top Banner
X86 asembler
98

X86 asembler

Jan 29, 2016

ReportDownload

Documents

deanna

X86 asembler. 80 386 procesor. 32 -bitna CISC arhitrktura . Pretežno dvoadresna mašina. Veličina memorijskog adresnog prostora: 4GB. Adresibilna jedinica: bajt. Veličina podataka u instrukcijama: bajt, reč ( word )– dva uzastopna bajta, - PowerPoint PPT Presentation

  • X86 asembler

  • 80386 procesor

    32-bitna CISC arhitrktura.

    Preteno dvoadresna maina.

    Veliina memorijskog adresnog prostora: 4GB.

    Adresibilna jedinica: bajt.

    Veliina podataka u instrukcijama:bajt,re (word) dva uzastopna bajta,dvostruka re (double word) etiri uzastopna bajta.

  • Redosled bajtova podatka u memorijiLittle-endian vii bajt na vioj adresi.Rijei:(a): 34 12(a+1): 56 34(a+2): 78 56Duple rijei:(a) : 78 56 34 12

  • Zdravo svete! (Linux, int) 3.intel_syntax noprefix .arch i386 .data 1 poruka: .ascii Zdravo svete!\n kraj_poruke: .equ duzina_poruke, kraj_poruke poruka .text 1 .globl _start _start: mov ebx, 1 # mov ecx, offset poruka lea ecx, poruka mov edx, duzina_poruke mov eax, 4 int 0x80 2 mov ebx,0 mov eax,1 int 0x80 2

  • Prevoenje, povezivanje i pokretanjeAsembliranje:as zdravo_svete.s o zdravo_svete.okoriena opcija: -o

    Linkovanje (povezivanje):ld zdravo_svete.o o zdravo_svetekoriena opcija: -o

    Pokretanje./zdravo_svete

  • Prevoenje i povezivanje pomou gccAsembliranje:gcc -c -o zdravo_svete.o zdravo_svete.skoriene opcije:-o -c Prevedoenje i asembliranje, bez linkovanjaLinkovanje (povezivanje):gcc -o zdravo_svete -nostartfiles zdravo_svete.okoriene opcije: -o -nostartfiles Povei bez standardnih startup fajlova.

    Ili, i prevoenje i povezivanje jednim pozivom gcc:gcc -o zdravo_svete -nostartfiles zdravo_svete.sDruge opcije:-nodefoultlibs Povezivanje bez standardnih biblioteka.-nostdlib Kao nostartfiles nodefaultlibs-v Ispisuje komande koje pokree.-### Kao prethodno, ali bez izvravanja komandi.

  • Asemblerske naredbe (Intel sintaksa)[labela:] mnemonik [operandi] [#komentar]

    Labela predstavlja adresu na kojoj se nalazi naredba.

    mnemonik je simboliki zapisana komanda.

    Mogu biti do dva operanda.Prvi je uvijek odredite, a nekad i izvorite.Drugi je izvorite.

  • Transfer podatakamov dst, src# dst = src

    lea dst, src# dst = offset(src)1

    lds dst, src# ds:dst = srcles dst, src# es:dst = src

    xchg op1, op2 # mijenja vrijednosti # u operandima op1 i op2

  • Programski dostupni registri(flat mode, aplikativni reim)Optenamjenski (32-bitni): eax, ebx, ecx, edx, esi i edi.

    Registri za manipulaciju podacima na steku:esp i ebp.

    Segmentni registri (16-bitni): cs, ss, ds, es, fs i gs.U flat modu, svi ukazuju na poetak memorije.

    Registri dostupni samo korienjem posebnih instrukcijaprogramski broja eip,statusna rije procesora eflags.

  • Preslikavanje logike u linearnu (flat) adresuLogika adresa:(Selektor) + ofsetSelektor (16b) = segmentni registarOfset: adresa iz instrukcije(32bita)

    Selektor pokazuje na deskriptor u okviru deskriptorske tabele (deo operativnog sistema)Svi moderni OS podeavaju sadraj deskriptora svih segmenata tako da pokazuju na logiku adresu 0, tako da je programeru dostupan ceo prostor od 4GB koristei samo ofset i ne vodei rauna o segmentima tzv. Linearni adr. prostorPo potrebi se moe ukljuiti i stranienje, kada se logika adresa preslikava u fiziku adresu.

  • Optenamjenski registriNiih 16 bita registara eax, ebx, ecx i edx se moe koristiti i kao:16-bitni registar: ax, bx, cx i dx;dva 8-bitna registra:Npr. ax ->ah vii bajt,al nii bajt.

    Imaju i posebne namene:eax akumulator,ebx bazni registar za adresiranje,ecx brojaki registar,edx pomoni registar za podatke u nekim instrukcijama,esi i edi indeksiranje pri adresiranju.

  • Registri za rad sa stekomesp pokaziva na vrh stekapokazuje na zauzetu lokaciju na vrhu steka,umanjuje se pre smetanja podatka,uveava se posle skidanja podatka.ebp bazni registar za pristup argumentima potprograma i lokalnim promenljivimRadi sa:Reima (16 bita esp se menja za 2)Duplim reima (32 bita esp se menja za 4)

  • Rad sa stekompush src; stavlja na stek src pop dst; sa steka upisuje u dst pushfd; uva eflags na steku popfd; restaurira eflags sa steka ( ; u neprivilegovanom reimu ; bitovi posle OF nee se promeniti) pushf/popf ; koristi samo donjih 16 bita eflags pushad/popad ; uvanje svih registara na steku: ; eax, ecx, edx, ebx, esp, ebp, ; esi, edi.

  • Statusna rije procesoraCF prenos.PF parnost.AF pomoni prenos za BCD aritmetiku.ZF rezultat nula.SF negativan rezultat.TF prekid posle svake instrukcije.IF maskiranje svih maskirajuih prekida.DF smjer za operacije nad stringovima.OF prekoraenje.IOPL I/O priviledge levelNT nested task flagRF resume flagVM virtual 8086 modeVM RF NT IOPL OF DF IF TF SF ZF AF PF CF

  • Naini adresiranja 1/2Neposredno: mov eax, 10add ebx, 20h

    Registarsko direktno (svi registri): mov eax, 2mov edi, ebxmov [ebp+6], ecx

    Memorijsko direktno: mov eax, sumamov niz+6, edx ...

  • Naini adresiranja 2/2Registarsko indirektno (svi opte namene):mov [ebx], eax

    Registarsko indirektno sa pomerajem: mov [eax+88h], 2mov niz[edx], 2

    Bazno indeksno (adresa se sastoji od dva registra): mov [ebx][edx], eax

    Bazno indeksno sa pomjerajem (kao prethodno plus pomjeraj):mov eax, niz[ebx][edi]

  • Skaliranje indeksa

    Opti oblik:[+*] moe biti:1,2,4.

    mov eax, suma[ebx+4*esi]mov vrsta[edx+2*eax], bx

  • NapomeneSamo jedan operand u memorijipostoji nekoliko izuzetaka.

    Podrazumjevana upotreba segmentnih registara:cs kod,ds podaci, osim ako se u adresnom izrazu koristi ebpss ako se u adresnom izrazu koristi ebp

    Zamjena podrazumjevanog segmentnog registra:mov ax,ds:[ebp+4]

    Flat reim = samo jedan segment veliine 4GB.

  • Sistemski pozivi (Linux)Tri naina:direktno, kroz prekid 0x80,kod novijih procesora, instrukcijama SYSENTER i SYSEXIT,indirektno, preko funkcija omotaa iz standardne biblioteke.

    int 0x80eax = 1: exit(int)ebx: povratna vrijednost programa.eax = 3: read(int, char*, int)ebx: ruka fajla (0 za standardni ulaz),ecx: adresa bafera,edx: veliina bafera u B.eax = 4: write(int, char*, int)analogno prethodnom (1 je ruka za standardni izlaz).

  • Zdravo svete! (Linux, int) 3.intel_syntax noprefix .arch i386 .data 1 poruka: .ascii Zdravo svete!\n kraj_poruke: .equ duzina_poruke, kraj_poruke poruka .text 1 .globl _start _start: mov ebx, 1 # mov ecx, offset poruka lea ecx, poruka mov edx, duzina_poruke mov eax, 4 int 0x80 2 mov ebx,0 mov eax,1 int 0x80 2

  • Zdravo svete! (Linux, libc) 1.intel_syntax noprefix .arch i386 .data poruka: .asciz "Zdravo svete!\n kraj_poruke: .equ duzina_poruke, kraj_poruke poruka .text .extern write .extern exit

    .globl _start _start: push duzina_poruke push offset poruka push 1 call write add esp, 12 #write(1,&poruka, # duzina_poruke); push 0 call exit # exit(0); .end

  • Prevoenje, povezivanje i pokretanjeAsembliranje:as -o p1.o p1.s

    Povezivanje:ld -o p1 -dynamic-linker /lib/ld-linux.so.2 p1.o -l cl c: ukljuuje biblioteku libc.a1,vano: navesti biblioteku posle objektnih fajlova koji je koriste2.dynamic-linker /lib/ld-linux.so.2ukljuuje biblioteku za dinamiko povezivanje.

    Pokretanje./zdravo_svete

  • PotprogramiPoinje labelom i opciono:u redu ispred labele: .type , @Functionza potrebe umetanja informacija za debug:na poetku .func [, ]1na kraju .endfunc

    Zavrava se instrukcijom za povratak iz potprograma:ret [exp]# u flat modelu, bliski povratak (samo offset)exp: broj koji po povratku treba dodati na esp Poziv potprograma:call dstnear poziv -> na steku se uva EIP (u flat reimu se koristi ovaj pristup)far poziv -> na steku se uvaju CS i EIPskae na dst

  • Proslijeivanje parametara u registrima i globalnim promjenljivim

    Prije poziva se upisuje u registar ili globalno dostupnu memorijsku lokaciju.

    IZBEGAVATI, osim ako je primarna brzina.

    U jednom trenutku smije postojati najvie jedan poziv takve funkcije -> 1 Da li je dozvoljena rekurzija?Pozivanje u prekidnim rutinama?Pozivanje u konkurentnim nitima?

  • Proslijeivanje parametara preko stekaParametri se prije poziva ostavljaju na steku.

    U funkciji im se pristupa pomou registra EBP.

    Zato svaka funkcija:

    poinje sa: push ebp mov ebp, esp ili enter 0, 0 1

    zavrava se sa: mov esp, ebp ili leave 2 pop ebp

    Ovako je obezbjeeno da svaki poziv funkcije ima svoj zapis na steku (prikaz na sledeem slajdu).

  • Zapis poziva funkcijeParam[n]Loc[m]...Loc[1]EBPstaroretEIPParam[1]...+4+8-4*m+4+4*n-4Bliski poziventer 4*m,0call naziv_funkcijaPred poziv funkcije:push param[n]push param[1]Zapis tekueg poziva neke funkcije

  • Instrukcija enterenterop1, op2:op1:broj bajtova koje je potrebno rezervisati za lokalne prom.16-bitna neposredna konstanta.op2:dubina ugnijeenosti funkcije (0-31),govori koliko pokazivaa na prethodne okvire treba iskopirati u tekui.algoritam: 1push ebpmov ebp, espNa stek doda pokazivae na okvirove prethodnih nivoa (stare vrednososti epb registra)sub esp, op1

  • Konvencije pozivanja potprogramaKonvencija pozivanja potprograma definie:kako se poravnava stek,kako se prosleuju parametri,ko radi oslobaanje prostora sa steka,kako se vraa vrednost,koji registri mogu da se koriste u funkciji bez da se uvaju.

    Konvencije koje se koriste u gcc-u:cdecl (podrazumjevana)stdcallfastcall

  • cdecl konvencija pozivanjaPred poziv funkcije, stek mora biti poravnat na granicu deljivu sa 16.1

    Argumenti se smetaju na stek, s desna na levo.

    Prostor na steku oslobaa pozivaoc:izuzetak je skriveni pokaziva, kojeg oslobaa pozvana funkcija.

    Vrednost se najee vraa u registru:1 bajt -> AL2 bajta -> AX4 bajta -> EAX (naredni primjer)8 bajtova -> EDX:EAXstruktura ili klasa -> preko skrivenog pokazivaa 2

    Funkcija ne mora da uva registre: eax, ecx i edx

  • Razlike stdcall i fastcall u odnosu na stdcallstdcallpozvani potprogram skida sve argumente sa steka

    fastcallprva dva argumenta, ako su celobrojnog tipa, prosleuju se: prvi u ecxdrugi u edxostali, kao i oni koji nisu celobrojnog tipa1 prosleuju se preko stekapozvani potprogram skida sve argumente sa stekau sluaju da je promenljiv broj argumenata, na stek se stavljaju svi.

  • Napisati potprogram za sabiranje dva broja koristei stdcall i cdecl konvencije 1Potprogram: stdcall saberi: enter 0, 0 mov eax, [ebp+8] add eax, [ebp]+12 leave ret 8 cdecl saberi: enter 0, 0 mov eax, [ebp+8] add eax, [ebp]+12 leave ret

    Primjer poziva: push broj1 push broj2 call saberi mov rezultat, eax push broj1 push broj2 call saberi mov rezultat, eax add esp, 8

  • Napisati potprogram za sabiranje dva brojapush 25push 33call saberiretAdr: mov rezultat, eax

    saberi: enter 0, 0 mov eax, [ebp+8] add eax, [ebp]+12 leave ret 8EBP_oldretAdr3325?EAX332558

  • Vraanje vrijednosti preko stekatypedef struct {int a, b;} struc;

    struc f(int x, int y){struc a;a.a = x;a.b = y;return a; 1}

    void main(){struc r = f(0x1122, 0x3344);

    }

    :push ebpmov ebp, espsub esp, 0x10# za lokalne promjenljive

    mov eax, 0xc[ebp] # eax = xmov [ebp-0x8], eax # a.a = eax

    mov eax, [ebp+0x10] # eax + ymov [ebp-0x4], eax # b.b = eax

    mov ecx, [ebp+0x8] # ecx = &ret_bafer

    mov eax, [ebp-0x8] # eax = a.amov edx, [ebp-0x4] # edx = a.b

    mov [ecx], eax # ret_bafer.a = eaxmov [ecx+0x4], edx # ret_bafer.b = edxmov eax, [ebp+0x8] # eax = &ret_bafer

    leave ret 0x4 # oslobaa skriveni parametar

  • Sabiranje i oduzimanjeadd dst, src# dst=dst+srcadc dst, src# dst=dst+src+cf

    sub dst, src# dst=dst-srcsbb dst, src# dst=dst-src-cf

    neg dst# dst=-dst

    inc dst # dst=dst+1dec dst# dst=dst-1

    cmp src1, src2# setuje flegove na osnovu # src1-src2

  • Mnoenje i dijeljenjemul src # neoznaceno mnoenjeimul src # oznaeno mnoenjesrc (8-bitni) mnoi sa al i rezultat ostavlja u axsrc (16-bitni) mnoi sa ax i rezultat ostavlja u dx:axsrc (32-bitni) mnoi sa eax i rezultat ostavlja u edx:eax

    div src # neoznaeno dijeljenjeidiv src # oznaeno dijeljenjeDijeli ax sa src (8-bitni) i rezultat ostavlja u al, a ostatak u ah. Dijeli dx:ax sa src (16-bitni) i rezultat ostavlja u ax, a ostatak u dxDijeli edx:eax sa src (32-bitni) i rezultat ostavlja u eax, a ostatak u edx

    Za mnoenje postoje i druge forme, sa dva i tri operanda

  • Proirivanje podataka znakomcbw # proiruje ah sa znakom iz al

    cwde # proiruje eax sa znakom iz ax

    cwd # proiruje dx sa znakom iz ax

    cdq # proiruje edx sa znakom iz eax

  • Logike operacijenot dst # dst = ~dst

    and dst, src # dst = dst & src

    or dst, src # dst = dst | src

    xor dst, src # dst = dst ^ src

    test op1, op2 # setuje flegove na osnovu # op1 & op2

  • Pomjeranje i rotiranjeshl dst, cnt # pomjeranje logiki lijevosal dst, cnt # pomjeranje aritmetiki lijevoshr dst, cnt # pomjeranje logiki desnosar dst, cnt # pomjeranje aritmetiki desnoror dst, cnt # rotiranje desnorol dst, cnt # rotiranje lijevorcr dst, cnt # rotiranje kroz cf desnorcl dst, cnt # rotiranje kroz cf lijevo

    cnt moe biti:1,neposredna vrijednost iliregistar cl.

  • Primjerstanje prije: ax=0xf00f, CF=0, cl=2

    shl ax, cl # 0xC03C,CF=1 (bit koji je ispao)sal ax, cl # 0xC03C,CF=1 (bit koji je ispao)

    shr ax, cl # 0x3C03,CF=1 (bit koji je ispao)sal ax, cl # 0xFC03,CF=1 (bit koji je ispao)

    ror ax, cl # 0xFC03,CF=1 (poslednjirol ax, cl # 0xC03F,CF=1 rotirani bit)

    rcr ax, cl # 0xBC03,CF=1 (poslednjrcl ax, cl # 0xC03D,CF=1 izbaeni bit)

  • Uslovni skokovi 1/2Relativni skok.Pomjeraj se posmatra kao oznaeni cijeli broj veliine:8 bita (short jump), ili16-bita (near jump), ili32-bita (near jump).Test pojedinanih flegova:jz (je), (Jump if Zero; Jump if Equal)jnz (jne), (Jump if Not Zero; Jump if Not Equaljs, (Jump if Sign set)jns,jp (jpe), (Jump if Parity flag set; Jump if Parity even)jnp (jpo), (Jumo if No Parity flag set; Jump if Parity odd)

  • Uslovni skokovi 2/2Poreenje neoznaenih brojeva:jb (jnae, jc) =jbe (jna) Poreenje oznaenih brojeva:jl (jnge) =jle (jng)

  • if-then-elseVii programski jezici:if (ecx
  • Lokalne labeleSmanjuju mogunost sluajnog ponavljanja iste labele.

    Mogue koristiti 10 razliitih::

    Sa svakog mjesta je mogue referisati prvu labelu:unazad:bodnosi se na prvo pojavljivanje labele : prije tekue instrukcijeunaprijedfodnosi se na prvo pojavljivanje labele : posle tekue instrukcije

  • Primjer upotrebe lokalnih labela

    #Primjer 1: cmp ecx,0 je 1f jmp 2f 1: jmp 1f 2: 1:

    #Primjer 2: 1:add eax, ebx sub ebx, 1 test ebx, 1 je 2f dec ebx 2:jnz 1b

  • Podrka za petlje 1/2Neke mogue implementacije:Pomou instrukcija uslovnog skokaPomogu namjenskih instrukcija za formiranje petljiPomou potprograma i manipulacije povratnom adresom (strogo izbjegavati).

    Instrukcije:loop labloopz (loope) labloopnz (loopne) lab

  • Podrka za petlje 2/2Algoritam rada:na poetku instrukcije se prvo umanji ecx: ecx=ecx-1potom se provere uslovi izlaska iz petlje:ecx==0, za loopecx==0 ili zf==0, za loopeecx==0 ili zf==1, za loopneLab je labela poetak petlje ili instrukcije skoka na poetak petlje.Lab mora biti u opsegu -128..+127B od adrese sledee instrukcije.

    jcxz lab ;skae na lab ako je ecx=0

  • Primjer, suma prvih N brojevamovecx, n # inicijalizacija # brojaa

    jcxz 2f # ako je ecx = 0, preskae se # petlja

    mov eax, 0 # poetna vrijednost # sume

    1:add eax, ecx # raunanje sume

    loop 1b # skok na poetak # petlje ako je # ecx>0

    2:... # prva sledea instrukcija

  • Bezuslovni skok

    jmp lab # skace na lab

    Za lab se mogu koristiti modovi adresiranja kao i za podatkeMoe se koristiti i indirektno memorijsko adresiranje.

    Primeri:jmp eax # skae se na adresu zapisanu u eaxjmp [eax] # skae se na adresu zapisanu na adresi iz eaxjmp lab # skae se na labelu labjmp [lab] # sa adrese lab se ita adresa skokajmp DWORD PTR lab # isto kao prethodno

  • Minimum dva broja 1Napisati program koji sa standardnog ulaza uitava dva broja i na standardni izlaz ispisuje manji od dva unijeta broja.Traenje minimuma izdvojiti u funkciju u zasebnom fajlu (koristiti stdcall konvenciju pozivanja).Zadatak uraditi:tako da se oba fajla napiu na asembleru,tako da se potprogram napie na C-u, a program na asembleru,tako da se potprogram napie na asembleru, a da se program napie na C-u.

  • Uvoenje i izvoenje simbolaIzvoenje:Dvije sintakse:.globl .global Ako je simbol definisan, ostae vidljiv i za fazu povezivanja.Ako simbol nije definisan, smatra se da se uvozi spolja.

    Uvoenje:.extern

  • p4b.s (potprogram).data.globl izlazni_formatizlazni_format:.asciz "min(%i, %i) = %i\n"

    .text.globl minmin: 1enter0, 0movebx, [ebp+8]cmpebx, [ebp]+12 #isto to i [ebp+12]jle1fmoveax, [ebp]+12jmp2f1:moveax, ebx2:leaveret8 1 .end

  • p4a.s (program).dataulazni_format:.asciz "%i%i".extern izlazni_format

    .text.extern printf.extern scanf.extern exit.globl _start_start:call mainpush 0call exit.extern minmain:enter 8, 0and esp, 0xfffffff0

    lea eax, [ebp-4]push eaxsub eax, 4push eaxpush offset ulazni_formatcall scanfadd esp, 12push [ebp-8]push [ebp-4]call min

    push eaxpush [ebp-4]push [ebp-8]push offset izlazni_formatcall printfadd esp, 16leaveret.end

  • Prevoenje, povezivanje i pokretanjePrevoenje asemblerskog koda:as -o p4a.o p4a.sas -o p4b.o p4b.s

    Povezivanje:ld -o p4 -dynamic-linker /lib/ld-linux.so.2 -l c p4a.o p4b.o

    Pokretanje:./p4

  • P5b.c (potprogram)char izlazni_format[] = "min(%i, %i) = %i\n";

    int __attribute__((stdcall)) min(int a, int b) {return a < b ? a : b;}

  • p5a.s (program)Isti kao p4a.s

  • Prevoenje, povezivanje i pokretanjePrevoenje:as -o p5a.o p5a.s

    Prevoenje C koda:gcc -c -o p5b.o p5b.cc: prevesti samo do objektnog programa, bez povezivanja

    Povezivanje:ld -o p5 -dynamic-linker /lib/ld-linux.so.2 -l c p5a.o p5b.o

    Pokretanje./p5

    Disasembliranje objektnog fajla koji sadri funkciju minobjdump d1 Mintel2 p5b.o

  • Disasembliran prevod C funkcije00000000 : 1 0: 55push ebp 1: 89 e5mov ebp, esp 3: 8b 45 08mov eax, [ebp+0x8] 6: 39 45 0ccmp [ebp+0xc], eax 9: 0f 4e 45 0ccmovle eax, [ebp+0xc] d: 5dpop ebp e: c2 08 00ret 0x8

  • p6b.s (potprogram)Isti kao p4b.s

  • p6a.c (program)#include

    extern char izlazni_format;

    int __attribute__((stdcall)) min(int x, int y);

    int main(){int x1, x2, z;scanf("%i%i", &x1, &x2);z = min(x1,x2);printf(&izlazni_format, x1, x2, z);return 0;}

  • Prevoenje, povezivanje i pokretanjePrevoenjegcc -c -o p6a.o p6a.c-c: eli se samo prevesti zadati fajl, bez pozivanja.as -o p6b.o p6b.sPovezivanje:ld -o p6 -dynamic-linker /lib/ld-linux.so.2 -L /usr/lib/gcc/i686-linux-gnu/4.6/ /usr/lib/i386-linux-gnu/crt1.o /usr/lib/i386-linux-gnu/crti.o /usr/lib/gcc/i686-linux-gnu/4.6/crtbegin.o p6a.o p6b.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i686-linux-gnu/4.6/crtend.o /usr/lib/i386-linux-gnu/crtn.o

    Prevoenje i povezivanje u jednoj komandi:gcc o p6 p6a.c p6b.sza prikaz pojedinanih komandi dodati opciju v

    Pokretanje./p6

  • Definisanje podataka i poravnavanje. balign bajt_multipl, [bajt_za_dopunjavanje], [max]bajt_multipl1bajt_za_dopunu2max3

    Rezervisanje prostora u memoriji:Bajt:.byte init [,init...] Rije (2B): .word init [,init...] .short init [,init...]Dupla rije (4B) :.long init [,init...] .int init [,init...]Lista stringova:.ascii lista_stringova_odvojenih_zapetamaLista stringova sa \0:4.asciz lista_stringova_odvojenih_zapetama

    Ponavljanje sadraja: .rept broj_ponavljanja sadraj za ponavljanje .endr

  • Primjera: .byte 2 jedan bajt kojem se pristupa sa a

    b: .word 3, 8, 63 rijei, sa b se pristupa prvoj, a sa b+2 i b+4 drugim dvijema.

    c: .asciz "Tekst"niz od 6 bajtova, zadnji je null.

    d: .long cjedna dupla rije sa ofsetom od c

    F:.rep 4.byte 0,1.endr8 bajtova inicijalizovanih sa 0,1,0,1,0,1,0,1

  • Direktive.equ noviSimbol, izrazsvako pojavljivanje noviSimbol zamjenjuje vrijednou izraza.

    .include fileukljuuje sadraj fajla file na poziciju ove direktive.

    OFFSET exprvraa ofset izraza.

    BYTE PTR exprpristup bajtu.

    WORD PTR exprpristup rijei.

    DWORD PTR exprpristup dvostrukoj rijei.

  • Sabiranje niza brojevaNapisati program koji sa standardnog ulaza uitava i sabira niz brojeva. Program prvo uita broj elemenata niza, a potom i elemente niza. Broj elemenata nije unapred poznat, pa se prostor alocira na steku. Smatrati da e stek biti dovoljno veliki za smetanje niza, kao i da se zbir rauna unutar potprograma.

  • Sabiranje niza brojeva.dataporuka: .asciz "Unesite broj elemenata\ niza, pa zatim elemente niza.\n"ulazni_format: .asciz "%i"izlazni_format: .asciz "Suma elemenata unijetog\ niza je = %i\n"

    .text.extern scanf.extern printf.extern exit.globl _start_start:call mainpush 0call exit# exit(0);

    # prvi argument: broje elemenata# naredni argumenti: elementi nizasaberi:enter0, 0xoreax, eax# sum = 0movecx, [ebp+8]# i = Njcxz2f# if (i==0) ret 0;

    # adresa prvog elementa: ebp+12# i=N .. 1# adrese elemenata niza:# ebp+12 + (i-1)*4

    #sum+=niz[i-1]1:addeax, [ebp+4*ecx]+8loop1b

    2:leaveret

  • Sabiranje niza brojevamain: enter4, 0

    pushoffset poruka call printf addesp, 4

    lea eax, [ebp-4] # eax = &[ebp-4] pusheax # 2. arg za scanf

    pushoffset ulazni_format # 1. arg

    callscanf addesp, 8 movecx, [ebp-4] jcxz2f # if (N==0) goto exit movebx, ecx shlebx, 2 subesp, ebx movebx, esp

    1:pushecx

    pushebx pushoffset ulazni_format call scanf # scanf(%i, adr_elementa) addesp, 8 popecx

    addebx, 4 # adr_elementa++

    loop1b

    pushDWORD PTR [ebp-4]# push N callsaberi# eax = sum addesp, 4

    pusheax pushoffset izlazni_format callprintf# printf(, sum) addesp, 8

    2:leave ret.end

  • Rekurzivne funkcijeNapisati rekurzivnu funkciju koja sabira brojeve u opsegu 0..N. Koristiti stdcall konvenciju pozivanja.

  • Primjer rekurzija, sabiranje N..0suma: push ebp mov ebp, espmov eax, [ebp+8] # itanje parametra sa stekacmp eax, 0 # da li se doslo do 0?je dalje # ako jeste, skoci na kraj i # vrati 0dec eax # ako nije, pozovi suma(i-1)push eaxcall sumaadd eax, [ebp+8] # na tekucu sumu (0..i-1) dodaj idalje: pop ebpret 4 # po povratku oslobodi prostor rezervisan # za parametar na steku

    Promjer poziva sa parametrom 3:

    3 ;vrijednost programa proslijeena pred poziv retEIP ;adresa van funkcijeEBPold12 retEIP ;adresa add EAX, [EBP+8]EBPold21retEIP ;adresa add EAX, [EBP+8]EBPold30retEIP ;adresa add EAX, [EBP+8]EBPold3EBP pokazuje ovdjeEBP+8 pokazuje na poziciju koja sadri vrijednost 3Poto je sa steka oitano 3, to je razliito od 0, na stek se stavlja 3-1, to je parametar za naredni pozivEBP pokazuje ovdjeEBP+8 pokazuje na poziciju koja sadri vrijednost 2Poto je sa steka oitano 2, to je razliito od 0, na stek se stavlja 2-1, to je parametar za naredni pozivEBP pokazuje ovdjeEBP+8 pokazuje na poziciju koja sadri vrijednost 1Poto je sa steka oitano 1, to je razliito od 0, na stek se stavlja 1-1, to je parametar za naredni pozivEBP pokazuje ovdjeEBP+8 pokazuje na poziciju koja sadri vrijednost 0.Poto je 0, skae se na kraj. Primjetiti da je u ovom trenutku EAX=0 to je poetna sumaSada se kree sa izlascima iz ranije uinjenih poziva ove funkcije. Svaki put se po povratku na tekuu sumu doda vrijednost parametra iz tekueg poziva. Tekua suma se uvijek zapie u EAX i u njemu se i ostavlja.EBP pokazuje ovdje. Sa [EBP+8] se ita 1 i dodaje na tekuu sumu:EAX = EAX+1 (0+1)EBP pokazuje ovdje. Sa [EBP+8] se ita 2 i dodaje na tekuu sumu:EAX = EAX+2 (1+2)EBP pokazuje ovdje. Sa [EBP+8] se ita 3 i dodaje na tekuu sumu:EAX = EAX+3 (3+3).Ovo je i povratna vrijednost funkcije.

  • Uslovno prevoenjePoetak bloka sa uslovnim prevoenjem:.if apsolutni_izrazda li je vrijednost apsolutnog izraza razliita od nule?.ifdef name:da li je simbol name definisan?.ifndef

    Opciono moe da se pojavi i else grana:.else.elseif

    Na kraju mora da se pojavi:.endif

  • Makroi 1/2Poetak makroa:.macro name [arg[=def_val] {[ |,] [arg[=def_val]} name naziv makroaarg parametridef_val podrazumijevana vrijednost parametraKraj makroa:.endmIzlazak iz makroa sa sredine:.exitmUpotreba parametara:\naziv_parametra

  • Primjer upotrebe makroaDefinicija:

    .macro INVOKE, func, p1, p2, p3push\p3pushoffset \p2push\p1call\funcaddesp, 12.endm

    Poziv: INVOKE write,1,poruka,duzina_poruke

  • Primjer upotrebe makroaDefinicija:

    .macro sum from=0, to=5.long \from.if \to-\fromsum "(\from+1)",\to.endif.endmPoziv: sum 0,5

    Rezultat1:.long 0.long 1.long 2.long 3.long 4.long 5

  • Makroi 2/2.irp param, # ovaj segment koda se ponavlja onoliko puta koliko ima# argumenata i to tako da se svaki put umjesto svakog pojavljivanja# param zamjeni jedna vrijednost arg..endm

    .irpc param, # isto kao prethodno, osim to su argumenti slova# navedenog stringa.endm

    \ - operator prepoznavanja parametra u tekstu

  • Primjeri upotrebe makroaUlaz:.irp param,0,4,8move d\param,[BX+\param].endr

    Rezultat:move d0, [BX+0]move d4, [BX+4]move d8, [BX+8]Ulaz:.irpc param,048 move d\param,[BX+\param] .endr

    Rezultat:move d0, [BX+0]move d4, [BX+4]move d8, [BX+8]

  • Razlike izmeu Intel i AT&T sintakse

    IntelAT&TRedosled operanadadst, srcsrc, dst 1Indirektno adresiranje[registar](registar)Prefix za registrenema%Prefix za konstantenema$Prefix za apsolutne adrese jump i callnema*Veliina operanada u memorijina osnovu direktiva uz operandna osnovu sufiksa mnemonika 2Daleke adresesection:offset$section, $offset

  • Primjer Intel i AT&T sitaksipush ebpmov ebp, espmov eax, [ebp+0x8]cmp [ebp+0xc], eaxcmovle eax, [ebp+0xc]pop ebpret 0x8push %ebpmov %esp, %ebpmov 0x8(%ebp), %eaxcmp %eax, 0xc(%ebp)cmovle 0xc(%ebp), %eaxpop %ebpret $0x8

  • Primjeri rada sa WIN32 API

  • Zdravo svete (Windows).intel_syntax noprefix.arch i386.extern _MessageBoxA@16: PROC.extern _ExitProcess@4: PROC.global _start.equ MB_OK, 0.datanl:.ascii "Zdravo svete\0#.asciz "Zdravo svete"

    .text _start: push MB_OK push offset nl push offset nl push 0 call _MessageBoxA@16 push 0 call _ExitProcess@4.end

  • PrevoenjeAsembliranje:as zdravo_svete.s -o zdravo_svete.objkoriena opcija: -o

    Linkovanje (povezivanje):ld -o zdravo_svete.exe zdravo_svete.obj -l user32 -l kernel32koriene opcije:-o -l

  • Primjer itanje jednog znaka i vraanje u registru.intel_syntax noprefix.datastdin .long 0.text.extern _readconsolea@20

    .type readc, @Functionreadc:enter 8, 0push ebxlea eax, [ebp-4] # adresa bafera za podatke

    lea ebx, [ebp-8] # bafer za broj procitanih # znakovapush 0push ebxpush 1 # broj znakova za citanjepush eax # adresa bafera za podatkepush stdin # stdin handle (naredni slajd)call _readconsolea@20 # stdcall

    mov eax, [ebp - 4]and eax, 0ffhpop ebxleaveret

  • stdin i stdout rukeDa bi se mogao vriti ispis na konzolu, na poetku programa (prije prvog ispisa) je neophodno dohvatiti stdout handle:

    .equ STD_OUTPUT_HANDLE, -11push STD_OUTPUT_HANDLEcall GetStdHandlemov stdout, eax

    Da bi se moglo vriti itanje standardnog ulaza pripadajue konzole, na poetku programa (prije prvog itanja) je neophodno dohvatiti stdin handle:

    .equ STD_INPUT_HANDLE, -10push STD_INPUT_HANDLEcall GetStdHandlemov stdin, eax

  • Inline asemblerNa mesto naredbe se ubacuje :_ _asm_ _(# niz redova sa asemblerskim naredbama zavrenih sa ;);ili_ _asm_ _({"instrukcija \n"} : output : input : modify);output: "=tmp"(naziv promenljive)input: tmp"(naziv ulazne promjenljive)modify: "registar" spisak registara na ije vrijednosti kompajler ne treba da rauna nakon izvravanja bloka.tmp privremena lokacija (objanjena na sledeem slajdu).

  • Inline asembler polje tmptmp oznaka privremene lokacije (registra ili memorije) ova lokacija e biti koriena u asembleru umesto promenljive.

    u asembleru se referie sa %

    input -> prije instrukcija iz asm bloka, u tmp e se uitati vrednost promenljive navedene u zagradama.

    output -> nakon instrukcija iz asm bloka, vrednost tmp e se upisati u promenljivu navedenu u zagradama.

    za tmp je mogue koristiti:registre (eax, ebx, ecx, edx, esi, edi, r-bilo koji registar)1memoriju (memory)

  • Inline asembler - primerint t;

    int main(){int x1, x2, z;__asm__(// ".intel_syntax noprefix\n1 "mov ebx, %2\n"\ "add ebx, %3\n" "mov %0, ebx\n"\ "mov %1, ebx\n"// ".att_syntax\n1: "=c"(x1), "=m"(z)\ : "a"(x2), "m"(t)\: "ebx"\ );

    return 0;}Izlaz koji se dobije kada se c kod prevede na asm:

    moveax, DWORD PTR [ebp-16]2

    mov ebx, eax3add ebx, DWORD PTR t4mov ecx5, ebxmov DWORD PTR [ebp-20]6, ebx

    movesi, ecx7movDWORD PTR [ebp-12], esi

  • Microsoft asemblerInformativno

  • Definisanje potprograma (Microsoft asembler)name PROC [FAR|NEAR] start potprograma. Moe biti: bliski (pri pozivu se koristi samo EIP) ilidaleki (koriste se i CS i EIP). Podrazumjevana vrijednost zavisi od modela (flat near)Mogue definisati i konvenciju pozivanja, kao i parametrePROC[][] {,:} - neka od konvencija pozivanja :U sluaju definisanja konvencije pozivanja, umeu se i odgovarajue instrukcije za navedenu konvenciju pozivanja: npr. za C, na poetku: PUSH EBP MOV EBP, ESP i pred svaki ret: POP EBPname ENDP kraj potprograma name. Ne proizvodi nijednu instrukciju, pa je potrebno ispred staviti ret ili neku drugu instrukciju za kontrolu toka, kako bi se osigurali da nikada nee doi do neregularne situacije.

  • Uvoenje i izvoenje simbolapublic name[,name...] izvoz iz fajla

    extern name:type [,name:type...] uvozNeki asembleri dozvoljavaju izostavljanje tipaU MASM, tip je obavezan

    Novi pristup je direktiva externdef koja mijenja obje prethodne direktive:Ukoliko je simbol definisan u fajlu u kojem se nalazi direktiva, tada je to simbol koji se izvoziUkoliko simbol naveden u direktivi nije definisan, tada je to simbol koji se uvoziSintaksa kao kod EXTERN direktive

  • Definisanje prototipa potprogramaDirektiva PROTOPrednosti:definie prototip potprograma => poziv sa INVOKEdodjeljuje nazive parametrima (umjesto pomjeraja)ova direktiva automatski generie i odgovarajui EXTERNDEFSintaksa:PROTO[][] {,:} - neka od konvencija pozivanja.Neophodno je na isti nain definisati i sam potprogram (PROTO zamjeniti sa PROC).Mogue definisati i lokalne promjenljive:LOCAL : {, :} => pogodno za pristupanje lokalnim promjenljivim bez raunanja pomjeraja.

  • INVOKEPotprogrami definisani u skladu sa prethodnim slajdom, pomou INVOKE mogu biti pozvani slino pozivima u viim programskim jezicima.Primjer:f1 PROC C par1:DWORD, par2:DWORDmov EAX, par1add EAX, par2f1 ENDP

    f1 PROTO C param1:DWORD, param2:DWORD

    INVOKE f1, EAX, EBX ;ekvivalentno sa:;push EBX;push EAX;call f1;add ESP, 8

  • Definisanje segmenataPojednostavljene direktive (MASM):klasa segmenta. Standardno:.stack stek (ne mora da se navodi).code programski kod.data inicijalizovani podaci.data? neinicijalizovani podaciNa poetku programa navesti:.386P ; za koji procesor su naredbe.model flat ; za linearne adreseiza flat je mogue navesti standardnu konvenciju pozivanja potprograma

  • Start programaend [label] kraj programa

    ako postoji label, to je oznaka poetka programa

    Pri linkovanju vie fajlova, samo jedan smije imati ulaznu taku (poetak)

  • Definisanje podataka i poravnavanjeeven poravnava sledeu promjenljivu na parnu adresu. Dobra praksa zbog breg pristupa memoriji.Rezervisanje prostora u memoriji:Bajt: [name] DB init [,init...] Rije (2B): [name] DW init [,init...]Dupla rije (4B) : [name] DD init [,init...]Dvostruka dupla rije (8B) [name] DQ init [,init...]Za svaku poetnu vrijednost se rezervie jedna lokacija.count DUP (init [,init...]) ponavlja ono to je u () onoliko puta koliko je vrijednost count.? neinicijalizovana lokacija

  • Primjera DB 2 ;jedan bajt kojem se pristupa sa ab DW 3 DUP(?);3 neinicijalizovane rijei, sa b se pristupa prvoj, a sa b+2 i b+4 naredne dvijec DB "Tekst$";niz od 6 bajtovad DD c;jedna dupla rije sa segmentom i ofsetom od cf DB 4 DUP(0,1);8 bajtova inicijalizovanih sa 0,1,0,1,0,1,0,1

  • Direktivename EQU expr svako pojavljivanje name zamjenjuje sa expr.

    include file ukljuuje sadraj fajla file na poziciju ove direktive.

    OFFSET expr vraa ofset izraza.

    BYTE PTR expr pristup bajtu.

    WORD PTR expr pristup rijei.

    LENGTH var broj elemenata u nizovnim prom.

  • Bezimene labele (Microsoft asembler)

    Kao labela se moe koristiti @@:

    Na labelu se referie sa:@B - ako se eli prva bezimena labela unazad@F - ako se eli prva bezimena labela unaprijed

  • Uslovno prevoenjeIFDEF name uslovno preveenje.ELSEENDIF

  • Makroi 1/2Poetak makroa: name MACRO arg [,arg...]name naziv makroaArg - parametriENDM kraj makroa.LOCAL name [,name...] lokalni simboli za makro. Neophodno za labele u makrou, kako bi se jedan makro mogao ekspandovati vie puta u okviru jednog koda bez problema dupliranih labela.

  • Makroi 2/2IRP param, ;ovaj segment koda se ponavlja onoliko puta koliko ima;argumenata i to tako da se svaki put umjesto svakog pojavljivanja;param zamjeni jedna vrijednost arg.ENDM IRPC param, ;isto kao prethodno, osim to su argumenti slova navedenog stringaENDM& - operator prepoznavanja parametra u tekstu

    1. Sadraj programa je izdeljen na sekcije. Dvije najee sekcije su: - .data sekcija koja sadri inicijalizovane podatke, - .text sekcija koja sadri izvrni mainski kod.Vie o segmentima se moe nai u delu o skriptama za proces linkovanja.

    2. Sistemski poziv int 0x80-eax = 4: ispis u fajl-ebx: deskriptor (1 za standardni izlaz)-ech: adresa bafera-edx: veliina bafera u bajtovima-eax = 1: zavretak programa int exit()-ebx povratna vrijednost programa (isto to i rezultat main funkcije u C-u)

    3. Dodatna objanjenja su data u fajlu p0.s, datom meu primjerima.**Prevoenje se moe izvriti i koristei program gcc koji dalje poziva potrebne alate (u ovom sluaju asembler i linker):Asembliranje: gcc -c o zdravo_svete.o zdravo_svete.s-opcija c zahteva da se izvri samo prevoenje i asembliranje bez povezivanja.Povezivanje: gcc -o zdravo_svete -nostartfiles zdravo_svete.o-opcija nostartupfiles govori da pri povezivanju ne treba koristiti standardne startup fajlove. Ti fajlovi interno sadre simbol _start koji linker podrazumevano trai kao oznaku mesta od kojeg poinje izvravanje programa, i nakon niza akcija inicijalizovanja, jedan od startup fajlova poziva funkciju main.

    Asembliranje i linkovanje je mogue zahtevati i samo jednim pozivom gcc programa, pri emu se programu prosleuje fajl sa asemblerom, a kao izlaz se oekuje izvrni program:gcc -o zdravo_svete -nostartfiles zdravo_svete.s

    *1. Lea instrukcija izraunava adresu koja odgovara zadatom operandu src, ali umesto sadraja memorije sa te adrese, u odredite upisuje adresu.Na C jeziku to bi bilo analogno sa dst = &srcKompajleri cesto koriste ovu instrukciju kada je potrebno sabrati sadraj neka dva registra i jedne konstante (pogledati naine adresiranja).*1. Sadraj programa je izdeljen na sekcije. Dvije najee sekcije su: - .data sekcija koja sadri inicijalizovane podatke, - .text sekcija koja sadri izvrni mainski kod.Vie o segmentima se moe nai u delu o skriptama za proces linkovanja.

    2. Sistemski poziv int 0x80-eax = 4: ispis u fajl-ebx: deskriptor (1 za standardni izlaz)-ech: adresa bafera-edx: veliina bafera u bajtovima-eax = 1: zavretak programa int exit()-ebx povratna vrijednost programa (isto to i rezultat main funkcije u C-u)

    3. Dodatna objanjenja su data u fajlu p0.s, datom meu primjerima.*1. Objanjenja su data u fajlu p1.s, datom meu primjerima.*1. Statika biblioteka za vezivanje sa dinamikom standardnom C bibliotekom2. Prilikom nailaska na biblioteku, neki linkeri (pokazalo se u linkeru u okviru MinGW) izostavljaju sve simbole koji im nisu potrebni u tom trenutku (trenutak procesiranja argumenata komandne linije).*1. Labela oznaava ulaznu taku programa. Ako se ne navede, koristi se naziv ispred kojeg se dodaje prefix, koji je najee donja crta ili nita, u zavisnosti od ciljnog sistema.*1. Rekurzija nije mogua direktno, ali ako se prije rekurzivnog poziva doda kod koji e privremeno sauvati vrijednosti parametara tekueg poziva i kod koji e nakon rekurzivnog poziva restaurirati originalne vrijednosti parametara za tekui poziv, onda je rekurzija mogua.2. Pod uslovom da prekidna rutina ispravno uva svoj kontekst, prosleivanje u registrima je mogue.3. Pozivanje iz konkurentnih niti je mogue u sluaju proslijeivanja argumenata kroz registre.4. Poto globalne promjenljive obino nisu dio konteksta, pozivi funkcija kojima se argumenti proslijeuju kroz globalne promjenljive nisu dozvoljeni ni u sluaju prekida, ni u sluaju konkurentnih niti.*1. Instrukcija: enter 0, 0 je ekvivalentna nizu instrukcija:push ebpmov ebp, esp

    2. Instrukcija:leaveje ekvivalentna nizu instrukcija:mov esp, ebppop ebp*Prije poziva potprograma, na stek se stavljaju parametri. Potom se poziva funkcija i u okviru nje, u prvoj instrukciji, rezervie prostor za lokalne promjenljive (loc[1..m]). Desno od steka su prikazani pomjeraju koje je potrebno koristiti u odnosu na ebp da bi se pristupilo odreenim lokalnim promjenljivim i argumentima (pomjeraji su u odnosu na ebp koji pokazuje na EBPstaro pustiti slide show). Uz desnu ivicu ekrana se prikazuju instrukcija koje na steku daju odgovarajui sadraj. Instrukcije se na prezentaciji prikazuju u redoslijedu izvravanja.*Za egzaktan algoritam, pogledati Intel 64 and IA-32 ArchitecturesSoftware Developers ManualVolume 2A:Instruction Set Reference, A-M*1. Poravnavanje na granicu deljivu sa 16B je uvedeno tek u novijim verzijama. Kompajler uvek oekuje da stek na poetku funkcije bude poravnat na granicu deljivu sa 16.

    2. GCC na steku rezervie prostor dovoljne veliine za povratnu vrednost, potom na stek smesti argumente i kao prvi argument (poslednji koji stavlja na stek) prosledi adresu prostora rezervisanog za povratnu vrednost. U funkciji, prvi argument koristi kao adresu prostora u koji treba smestiti povratnu vrednost, a samu adresu vrati u registru eax.

    *1. U slucaju da neki od prva dva argumenta ne moe da stane u registar, svi argumenti poev od argumenta koji ne moe da stane u registar se uvaju na steku.*1. Za objanjenje pogledati animaciju na sledeem slajdu.*1. Za funkciju f, u prikazanom primjeru, vrijednost je vraena kroz prostor koji je na steku rezervisan prije poziva funkcije f. Adresa rezervisanog prostora se prosleuje kao prvi parametar ( [ebp+0x8] ), dok su parametri x i y redom [ebp+0xc] i [ebp+0x10].Prilikom povratka iz potprograma, u eax registru ostaje adresa bafera kroz koji je vraena vrijednost.

    *Poslednji bit koji ispadne iz operanda se smjeta u CF.**1. Detaljniji opis reenja je dat u primjerima p4, p5 i p6.*1. stdcall konvencija pozivanja; fiksan broj parametara>pozvana funkcija oslobaa prostor rezervisan na steku za parametre.*1. -d: disasemblirati fajl2. -Mintel: generisati izlaz po Intel sintaksi**Ako tekua adresa nije djeljiva sa bajt_multipl, uveava se do prve koja jeste. Postoji i slina direktiva .align (bez slova b na poetku) koja takoe radi poravnanje, ali se u toj varijanti prvi argument tumai kao stepen broj 2 kojim adresa mora biti djeljiva.2. bajt_za_dopunu slui za dopunjavanje sadraja koji se preskoi. Moe biti izostavljen (tada se u data sekciji koristi 0, a u text sekciji instrukcija NOP).3. max predstavlja maksimalan broj bajtova koji se smiju preskoiti. Ako je broj bajtova koje bi trebalo preskoiti vei od max, ne radi se nita.4. Na navedeni string se nadovezuje null znak (znak iji je ASCII kod 0).*1. Prikaz rezultata ekspanzije makroa moe da se dobije sledeom komandom:as alm= *1. U AT&T sintaksi, redosled nije zamenjen u sluaju instrukcija koje prihvataju dva neposredna podatka, poput enter2. U Intel sintaksi se koriste direktive: byte ptr, word ptr, dword ptr i qword ptr, dok se u AT&T sintaksi na mnemonike dodaju sufiksi: b (za bajt), w (za re), l (za duplu re), q (za etvorostruku re).*1. Umjesto naziva registara, mogue je koristiti i skraenice:eax: aebx: becx: cedx: desi: Sedi: Dbilo koji registar: rmemorijska lokacija: mAko se eli isti registar koji je ranije naveden, pod navodnicima navesti redni broj registra kada je prvi put naveden.*Podrazumevana sintaksa je AT&T, pa je u sluaju korienja Intel sintakse u inline asembleru neophodno postojanje oznaenih linija kako bi se pre inline asm bloka asembler privremeno prebacio na Intel sintaksu i na kraju vratio na AT&T sintaksu. Umesto privremene promene sintakse, mogue je za gcc proslediti opciju -masm=intel koja menja podrazumevanu sintaksu Intel sintaksom.x2 je lokalna promenljiva koja se u datom primeru nala na adresi [esp+0x1c] i koja se kao posledica specifikacije ulaza u inline asembler na poetku uitava u zadati registar (eax).%2 zamenjeno sa eax u skladu sa ulaznom specifikacijom a(x2)%3 zamenjeno globalnom promenljivom t%0 zamenjeno sa ecx%1 zamenjeno lokalnom promenljivom z koja je u datom primeru na adresi ebp-20Vrednost iz ecx se kopira u x1 u skladu sa izlaznom specifikacijom =c(x1). Lokalna promenljiva je u datom primeru bila na adresi ebp-12.*

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.