You are on page 1of 36

I DIO 1. Razlika izmedu CISC i RISC! Postoje dva pristupa dizajnu raunara : RISC: Raunar s reduciranim skupom instrukcija.

Samostalne instrukcije obavljaju jednu, dobro definiranu operaciju. RISC pristup pretpostavlja da e se veina programiranja obavljati u jezicima visokog nivoa. Ovaj pristup poveava broj instrukcija koje je potrebno upotrebiti u programu, ali pojednostavljuje strukturu procesora. CISC: Raunar s kompleksnim skupom instrukcija. Jedna instrukcija obavlja vie operacija. Jednostavnije je pisati programe u mainskom i asemblerskom jeziku, ali se kompleksnost procesora poveava. 2. Podjela maina po memorijskom pristupu!

1. Trodresne maine
Svi tri operanda su eksplicitno navedeni u veini instrukcija.

2. Dvoadresne maine
U 2-adresnoj maini, instrukcije imaju samo dvije eksplicitne adrese. Jedna od njih ima dvije uloge: adresa izvornog operanda i adresa odredita.

3. Jednoadresne maine (akumulatorske)


U jednoadresnoj maini ili akumulatorskoj maini, akumulator ima ulogu odredinog i jednog od izvornih operanada. Potrebno je navesti samo adresu drugog izvornog operanda. Specifina je jedino STORE instrukcija, u kojoj je akumulator izvorni operand, a odredite je na memorijskoj lokaciji koja se eksplicitno navodi. Akumulator je registar u akumulatorskoj maini. Akumulator se nalazi unutar CPU.

4. Jednoadresne maine sa vie registara


Mnoge moderne maine (npr. CPU u svakom PC raunaru) prihvatile su ideju jedne adrese, ali umjesto jednog akumulatora koriste vie razliitih internih registara. To ubrzava neke operacije.

5. Nula adresne maine (stekovne)


Mogu je i pristup da se operandi nalaze na internom mjestu u memoriji ili procesoru. Jedan takav pristup je preko steka (o njemu vie u posebnom poglavlju). Kod 0 adresne maine operacije uzimaju vrijednosti sa steka i smjetaju rezultate takoe na stek. 3. Uloga registara SI, DI, SP, BP! Postoje dva indeksna registra: SI i DI. Oni se esto koriste kao pokazivai, ali se takoe koriste kao registri opte namjene. Ipak, oni se ne mogu rastaviti u osmobitne registre (u sluaju 16-bitnih registara). Registri BP i SP se koriste da pokazuju na podatke na mainskom steku i zovu se Base Pointer I Stack Pointer.

4. Koji su dijelovi registra EAX? EAX je 32-bitni registar. AX je niih 16 bita registra EAX, ba kao to je AL niih 8 bita registra AX (kao i EAX). Nema direktnog naina za pristup do viih 16 bita EAX registra. 5. Dobijanje fizicke adrese u realnom reimu! U realnom reimu rada (kompatibilnom sa 8086 i aktivnom pri startu raunara) memorija je ograniena na samo jedan megabajt. Ispravne adrese u opsegu (heksadekadno) izmeu 00000 i FFFFF. Ove adrese zahtijevaju 20-bitne brojeve. Jasno, 20-bitni broj se ne moe smjestiti u 16-bitne registre procesora 8086. Intel je rijeio taj problem koritenjem dvije 16-bitne vrijednosti radi odreivanja adrese. Prva 16 bitna vrijednost se zove selektor ili segmentna vrijednost. Vrijednosti selektora se moraju uvati u segmentnim registrima. Druga esnaestobitna vrijednost se zove pozicija (offset). Fizika adresa koja se dobije 32 bitnim parom selektor-pozicija se rauna formulom: 1610* selektor + pozicija Mnoenje sa 1610 u heksadekadnom sistemu je lako, samo se dodaje 0 na kraj broja. Na primjer, fizika adresa navedena kao 047C16:004816 iznosi: 047C0 +0048 -------04808 6. Dobijanje fizicke adrese u 16 bitnom zaticenom reimu! Kod zatienog reima, vrijednost selektora je redni broj elementa u deskriptorskoj tabeli, kombinovan s jo tri bita (od kojih jedan odreuje koji od dva mogua deskriptorska registra pokazuje na tabelu, a dva bita odreuju s kojim pravima se eli pristupiti memorijskom segmentu). I za zatieni I za realni reim, program se dijeli u segmente. U zatienom reimu, segmenti nisu na fiksnoj poziciji u fizikoj memoriji. ak, ne moraju uopte biti u RAM memoriji. Zatieni reim koristi tehniku koja se zove virtualna memorija. Osnovna ideja virtualne memorije da se u RAM-u uvaju samo podaci i program koji se trenutno koristi. Ostali podaci i programski kod se privremeno dre na disku dok ne budu opet potrebni. U 16-bitnom zatienom reimu, segmenti se premjetaju izmeu memorije i diska po potrebi. Kada se segment vrati sa diska u memoriju, vrlo je vjerovatno da e biti smjeten u drugi dio memorije u odnosu na onaj gdje je bio prije nego to je prebaen na disk. Sve se ovo radi transparentno, u operativnom sistemu. Sam program ne mora biti posebno pisan da radi s virtualnom memorijom. U zatienom reimu, svakom segmentu je pridruen element deskriptorske tabele. Taj element ima sve informacije potrebne sistemu da zna o

segmentu. Informacije ukljuuju: da li je trenutno u memoriji, ako jeste gdje je, koja su prava nad datim segmentom (npr samo za itanje). Redni broj elementa segmenta je vrijednost selektora smjetena u segmentnim registrima. 7. Dobijanje fizicke adrese u 32 bitnom zaticenom reimu! 80386 uveo je 32-bit zatieni reim. Postoje dvije glavne razlike izmeu 32-bitnog reima za 386 i 16 bitnog reima za 286: 1. Memorijske pozicije su poveane na 32 bita. To omoguuje postavljanje pozicije na vrijednost preko 4 milijarde. Tako, segmenti mogu imati veliine do 4 gigabajta. 2. Segmenti se mogu dijeliti na manje jedinice od 4 kilobajta, koje se zovu stranice. Sistem virtualne memorije sada radi s stranicama umjesto segmenata. To znai da u memoriji moemo drati i samo dijelove segmenata. U 16-bitnom reimu procesora 80286 , ili je cijeli segment u memoriji ili nije. To nije praktino sa velikim segmentima kakve doputa 32-bitni reim. 8. Razlika izmedu MOV EAX,DATA i MOV EAX,[DATA] u NASM! Indirektno adresiranje omoguuje registrima da se ponaaju kao pokazivake varijable. Da se oznai da se registar koristi indirektno kao pokaziva, uokviren je uglastim zagradama ([ ]). Na primjer:
mov ax, [Data] // normalno direktno memorijsko adresiranje rijei mov ebx, Data // ebx = & Data - adresa mov ax, [ebx] // ax = *ebx podatak na adresi

Poto AX sadri 16bitnu rije, linija 3 ita rije koja poinje na adresi koja je navedena u registru EBX. Ako se AX zamijeni sa AL, bio bi proitan samo jedan bajt. 9. Objasniti MOV ECX,[EAX+4*EBX+2000h] Indirektno adresiranje se esto koristi za realizaciju nizova, pa je uvedena generalna forma za indirektni pristup memoriji. [ bazni registar+ faktor *indeks reg+ konstanta ] gdje su: bazni registar jedan od EAX, EBX, ECX, EDX, EBP, ESP, ESI ili EDI. faktor je jedan od 1, 2, 4 ili 8. (Ako je 1, faktor se ne navodi) indeks reg je jedan od registara EAX, EBX, ECX, EDX, EBP, ESI, EDI ili se moe izostaviti. ( ESP nije na listi.) konstanta je 32-bitna konstanta. Konstanta moe biti i labela. 10. ta su to big endian i little endian? Imaju dva popularna metoda za smjetanje cijelih brojeva, big endian i little endian. Big endian je metod koji izgleda prirodnije. Najvei (tj. najznaajniji) bajt se smjeta na

adresu najmanju po vrijednosti, nakon njega sljedei po znaaju itd. Na primjer dupla rije 00000004 se smjeta kao etiri bajta, tj. 00 00 00 04. IBM veliki raunari, veina RISC procesora I Motorolini procesori koriste metod big endian. Ipak, Intel-bazirani procesori koriste little endian metod! Ovdje se najmanje znaajan bajt smjeta prvi, pa se 00000004 smjeta u memoriji kao 04 00 00 00. Razlog za ovaj format je to operacije s Little endian formatom mogu ponekad biti bre. Ovaj format je ugraen u sam mikroprocesor i ne moe se mijenjati. Normalno programer ne treba da brine koji se format koristi. Ipak, ponekad je ovo bitno 1.Kada se binarni podaci prenose izmeu razliitih raunara (preko datoteka ili mreno) 2.Kada se binarni podaci upisuju u memoriju kao viebajtni cijeli broj, a zatim itaju kao pojedinani bajtovi ili obrnuto. 11. Na koji nacin se proiruje osmobitni podatak u 32 bita? Ima vie instrukcija za procesor 80386 i jai koje omoguavaju proirivanje veliine brojeva. Sam raunar ne zna da li je broj predznaeni ili nepredznaeni. Na programeru je da koristi korektnu instrukciju. Za nepredznaene brojeve mogu se prosto staviti nule u gornje bitove koristei instrukciju MOV. Ipak, nije mogue koristiti MOV instrukciju za konverziju nepredznaene rijei u AX u nepredznaenu duplu rije u EAX. Zato? Nema naina da se MOV instrukcijom specificira gornjih 16 bita registra EAX. Procesor 80386 rjeava ovaj problem uvoenjem nove instrukcije MOVZX. Ova instrukcija ima dva operanda. Odredini (prvi operand) mora biti 16 ili 32 bitni registar. Izvorni (drugi operand) moe biti 8 ili 16 bitni registar odnosno bajt ili rije memorije. Drugo ogranienje je da odredite mora biti vee od izvora. (Veina instrukcija zahtijeva da su izvor i odredite iste veliine.) Za predznaene brojeve, MOV nije pogodna za proirivanje veliine podataka. 8086 procesor dao je neke instrukcije za proirivanje predznaenih brojeva. Instrukcija CBW (Convert Byte to Word) predznano proiruje registar AL u AX. Operandi su implicitni. CWD (Convert Word to Double word) instrukcja predznaeno proiruje AX u DX_AX. Notacija DX_AX predstavlja da se zamisli da DX i AX registri ine jedan 32 bitni registar s gornjih 16 bita u DX i donjih 16 bita u AX. (Ne treba zaboraviti da 8086 nije imo ni jedan 32 bitni registar!) Procesor 80386 je dodao nekoliko novih instrukcija. Instrukcija CWDE (Convert Word to Double word Extended) predznano proiruje AX u EAX. Instrukcija CDQ (Convert Double word to Quad word) predznano proiruje EAX u EDX_EAX (64 bita). Konano, instrukcija MOVSX radi kao MOVZX, osim to koristi pravila za predznaene brojeve. 12. ta su to asemblerske direktive? Direktiva je element asemblera, a ne mikroprocesora. One se generalno koriste bilo da daju instrukciju asembleru da neto uradi, bilo da se asembler informira o neemu. Direktive se ne prevode u mainski kod. Uobiajena primjena direktiva je: definiranje konstanti definiranje memorije za smjetanje podataka grupiranje memorije u segmente

uslovno ukljuivanje izvornog koda ukljuivanje drugih datoteka 13. Tipicni uzorak za realizaciju if naredbe [Stranica 40.] ili: ; instrukcije koje postavljaju flags jge thenblock ; uslov: jge, jne, jl, itd. (tabela str. 33) ; odabrati tako da se skok desi ako je uslov if-a tacan ; instrukcije else blocka jmp next thenblock: ; instrukcije then blocka endif: ; nastavak programa 14. Zato se parametrima direktno pristupa na njihovim lokacijama umjesto POP Parametri na steku se skidaju u potprogramu, nego im se umjesto toga direktno pristupa na steku. Zato? Poto se oni moraju smjestiti na steku prije CALL instrukcije, povratna adresa bi se morala prvo pokupiti sa steka (i onda smjestiti na njega ponovo). esto se parametri koriste na vie mjesta u potprogramu. Obino, oni se ne mogu uvati u registrima tokom cijelog potprograma i morali bi biti smjeteni u memoriji. Njihovo uvanje na steku odrava kopiju u memoriji kojoj se moe pristupati s bilo kojeg mjesta u potprogramu. 15. Razlika izmeu C call, Pascal call I STD call Nakon to je potprogram zavren, parametri koji su smjeteni na stek moraju biti uklonjeni. C konvencija poziva specificira da program pozivalac to mora uraditi. Druge konvencije su drugaije. Na primjer, Pascal konvencija specificira da pozvani potprogram mora ukloniti parametre. Postoji i druga forma RET instrukcije koja to jednostavno radi. Neki C kompajleri podravaju i ovu konvenciju. U deklaraciji prototipa funkcije se navede kljuna rije pascal da se kae kompajleru da slijedi ovu konvenciju. U emu je prednost ove konvencije? Ona je malo efikasnija od C konvencije. Zato se ona onda ne koristi u svim C funkcijama? Generalno, C programi doputaju da funkcije imaju promjenjiv broj argumenata (npr., printf i scanf funkcije). Za ovaj tip funkcija, operacija koja skida parametre sa steka e se razlikovati za razliite pozive funkcija. C konvencija doputa da se ovo razliito preuzimanje parametara jednostavno realizuje. Pascal konvencija ine ovu operaciju tekom. Zato Pascal konvencija (kao i Pascal jezik) ne doputa ovaj tip funkcije. MS Windows moe koristiti ovu konvenciju jer ni jedna od njegovih API funkcija (osim wvsprintf) ne uzima promjenjiv broj argumenata. Pascal konvencija je bila koritena u Windows 16 bitnim verzijama. Ipak, 32-bitne Windows funkcije koriste mjeavinu C i Pascal konvencija koja se zove stdcall. Ona koristi redoslijed parametara na steku

kao C konvencija, ali se stek prilagoava na kraju potprograma kao kod Pascal konvencije. 16. U tipinom podprogramu, kako se pristupa lokalnim varijablama Stek se moe koristiti kao pogodno mjesto za lokalne varijable. Na ovom mjestu i jezik C smjeta lokalne (ili automatske) varijable. Upotreba steka za varijable je vana ako se eli postii da su potprogrami ponovno pozivljivi. Ponovno pozivljiv program e raditi ako je pozvan sa bilo kog mjesta, ukljuujui i sam taj potprogram. Drugim rijeima, ponovno pozivljivi potprogrami se mogu zvati rekurzivno. Upotreba steka za varijable takoer tedi memoriju. Podaci koji se ne smjetaju na stek koriste memoriju od poetka do kraja izvrenja cijelog programa (C naziva ove tipove varijabli globalne ili statike ). Podaci smjeteni na stek koriste memoriju samo kada je potprogram u kome su definisani aktivan. Lokalne varijable se nalaze odmah iza sauvane EBP vrijednosti na steku. One se alociraju umanjivanjem ESP za potreban broj bajtova potrebnih za ESP u po_etnom dijelu potprograma. Registar EBP se koristi za pristup lokalnim varijablama. 17. Na ta treba paziti kada se povezuju assembler i C Kada se asemblerski jezik koristi, to je obino za manje dijelove koda. To se radi na dva naina, pozivom asemblerskih potprograma iz C-a ili ugraenim (inline) asemblerom. Ugraeni asembler omoguava programeru da smjesti asemblerske naredbe direktno unutar C programa. To moe biti dosta praktino, ali ima i nedostataka ugraenog asemblera. Asemblerski kod se mora pisati u formatu koji kompajler koristi. Popularni C kompajleri ne koriste NASM format. Razliiti kompajleri koriste razliite formate. Borland I Microsoft koriste MASM format. MinGw GCC i Linuxov gcc zahtijevaju GAS format. GAS je asembler koji svi GNU kompajleri koriste. On koristi AT&T sintaksu koja je vrlo razliita od relativno slinih sintaksi MASMa, TASMa i NASMa. Tehnika poziva posebno prevedenih asemblerskih potprograma je daleko standardizovanija na PC raunarima. Asemblerske rutine se obino koriste sa C-om iz sljedeih razloga: Direktni pristup je neophodan hardverskim osobinama raunara kojima je teko ili nemogue pristupiti iz C-a. Rutina mora biti to je mogue bra i programer moe bolje optimizovati kod, nego raunar. Drugi razlog je dijelom izgubio na znaaju. Tehnologija kompajlera je uznapredovala i kompajleri mogu generisati veoma efikasan kod, posebno ako su optimizacije ukljuene, mada jo uvijek ima sluajeva kada se programom u asembleru moe postii nekoliko puta vea brzina nego ekvivalentnim programom u C-u. Mane asemblerskih rutina su smanjena portabilnost i itljivost. 18. Na ta treba paziti pri pisanju ponovo pozovivih I rekurzivnih programa Ponovno pozivljiv program mora zadovoljavati sljedee kriterije: Ne smije modificirati instrukcije programa. U viim programskim jezicima to je teko, ali u asembleru nije teko programu da modifikuje vlastiti kod.

Ne smije modifikovati globalne podatke (poput onih u data i bss segmentima). Sve varijable se smjetaju na steku. Rekurzivni potprogrami moraju imati uslov zavretka. Kada je ovaj uslov ispunjen, vie se ne vre rekurzivni pozivi. Ako rekurzije nemaju uslov zavretka, ili taj uslov nikad nije ispunjen, rekurzija nikada nee prestati (poput je beskonane petlje). 19. Kako se rauna adresa N-tog elementa u jednodimenzionalnom nizu array_name + N * velicina_podataka_u_nizu_(u byteima) Tu N znaci index elementa (pocinje od nule) 20. Kako se rauna adresa elementa u dvodimenzionalnom nizu Na primjer, niz koji ima tri reda i dvije kolone se definie kao: int a [3][2]; Kako kompajler odreuje gdje se a[i][j] nalazi u rasporeivanju po redovima? Prosta formula e izraunati indeks iz i,j. Formula u ovom sluaju je 2i + j . Nije teko zakljuiti kako je ova formula dobivena. Svaki red ima dva elementa, pa je poetni element i-og reda na poziciji 2i. Nakon toga se pridoda kozicija kolone j, sabiranjem j s 2i. Ova analiza pokazuje kako se formula moe generalizovati za niz od N kolona: N i +j . Ova formula ne ovisi od broja redova. Nema posebnog razloga zato je izabrana reprezentacija po redovima. Mogla bi raditi i reprezentacija po kolonama. U reprezentaciji po kolonama, svaka kolona je smjetena kontinualno. Element [i][j] se nalazi na poziciji i + 3j . Ova analiza pokazuje kako se formula moe generalizovati za niz od N redova: i + N j .

21. Koja je uloga REP prefiksa u blok instrukcijama Familija 80x86 ima specijalni instrukcijski prefiks koji se zove REP i koji se moe koristiti za string instrukcije. Instrukcijski prefiks nije instrukcija, on je specijalni bajt koji se postavlja ispred string instrukcije koji modifikuje njeno ponaanje. (Postoje i drugi prefiksi za promjenu podrazumijevanih segmenata pri memorijskom pristupu ili naina adresiranja.) Prefiks REP kae procesoru da ponavlja narednu string instrukciju navedeni broj puta. Registar ECX se koristi za brojanje iteracija. 22. Kako su organizovani registri u pokretnom zarezu Najraniji Intelovi procesori nisu imali hardversku podrku za operacije u pokretnom zarezu. To ne znai da nisu mogli obavljati te operacije. To samo znai da su morali obavljati ove operacije preko procedura koje obavljaju cjelobrojne operacije. Za ove rane sisteme Intel je proizveo poseban ip koji se zvao matematiki koprocesor. Matematiki koprocesor ima mainske instrukcije koje obavljaju mnogo operacija u pokretnom zarezu daleko bre nego upotrebom softverskih procedura. Numeriki koprocesor ima osam registara za rad u pokretnom zarezu. Svaki registar ima 80 bitova podataka

Brojevi u pokretnom zarezu se interno uvaju u tim registrima u formatu od 80 bita, proirene preciznosti. Ovi registri se zovu ST0, ST1, ST2, . . . ST7. Registri za rad u pokretnom zarezu se koriste na drugi nain nego cjelobrojni registri u glavnom procesoru. Registri za rad u pokretnom zarezu su organizovani kao stek. Poznato je da je stek Last-In First-Out (LIFO) lista. ST0 uvijek pokazuje na vrijednost na vrhu steka. Postojei brojevi se guraju na steku da se napravi mjesto za novi broj. Postoji i statusni registar u numerikom koprocesoru. On ima vie indikatora. 23. ta je to poravnanje u strukturama ANSI C standard definie da su elementi strukture u memoriji poredane u istom redoslijedu kako su definisani u definiciji struct. On takoer definie da je prvi element na samom poetku strukture (tj. Pozicija 0). Standard definie i koristan makro u zaglavlju stddef.h pod imenom offsetof(). Ovaj makro rauna I vraa poziciju bilo kojeg elementa strukture. Makro zahtijeva dva elementa, prvi je ime tipa strukture, drugi je ime elementa ija se pozicija trai. Recimo da je rezultat offsetof(S, y) bi bio 2. Ako bi se koristio makro offsetof za traenje pozicije polja y koritenjem gcc kompajlera, primjetie se da je on vratio vrijednost koju vraa 4, a ne 2! Zato? Zato to gcc (i mnogi drugi kompajleri) poravnavaju vrijednost na duplu rije. U 32-bitnom zatienom reimu, CPU bre ita tridesetdvobitne podatke u memoriji ako podaci poinju na granici duple rijei. Kompajler ubacuje dva nekoritena bajta u strukturu da poravna y i z na granicu duple rijei. To pokazuje zato je razumna ideja koristiti offsetof za raun pozicija, umjesto da ih programer sam rauna kada se koriste strukture definisane u C-u. Osmobitni podaci se tipino ne moraju poravnavati na adrese koje odgovaraju duploj rijei, jer za njihovo itanje nema razlike u brzini pristupa ako su adrese poravnate ili ne. esnaestbitni podaci se poravnavaju na granice esnaestbitne rijei. Naravnom ako se struktura koristi samo u asembleru, programer moe sam odrediti pozicije. Ipak, ako se povezuju C i asemblerski jezik, veoma je vano da se asemblerski kod i C kod slau po pitanju pozicija elemenata. Dodatna komplikacija moe biti da razliiti C kompajleri mogu dati razliite pozicije podataka. Ipak ANSI C standard ne definie kako to treba biti uraeno, i stoga razliiti kompajleri to rade na razliit nain.

24. MODRM bajt u generisanom kodu ModR/M: Biti 7..6 predstavljaju Mode, biti 2..0 sadre kod registra ili memorijskog reima koji je indiciran modom, biti 5..3 su rezervno polje U 16 bitnom rezimu: Mod predstavlja veliinu pomaka (0, 1, 2 bajta) ili 3 ako je u pitanju registar. Polja 2..0 doputaju nekoliko kombinacija registara za adresiranje, pri emu [bp] se mora kodirati kao [bp+0] U 32 bitnom reimu mod polje predstavlja duinu dijela pomaka, 0 znai da nema pomaka, 1 znai jedan bajt, 2 predstavlja 4 bajta. Ako se pomaku pridodaje samo jedan registar i on nije ESP, tada r/m polje sadri vrijednost koja

predstavlja taj registar i nema polja SIB. Ako je r/m polje jednako 4 , postoji SIB polje. Takoer, [ebp] se mora kodirati kao [ebp+0]. 25. SIB bajt u generisanom kodu SIB bajt ima tri polja: Faktor skaliranja u bitima 7..6 koji predstavljaju 1, 2, 4 ili 8, indeksni registar u bitima 5..3 I bazni registar u bitima 2..0. Ideja je da se generie [BASE + SCALE*INDEX], koji se onda dodaju eventualnom pomaku navedenom u ModR/M bajtu. Na primjer, kod D3 (11010011) ima skalu 11 (znai 8), indeksni registar 010 (znai EDX) I bazni registar 011 (znai EBX) pa se kodira kao [ebx+edx*8]. U 16 bitnom reimu SIB bajt se nikada ne koristi

II DIO 1. Instrukcija ADC I SBB Asemblerski jezik takoe posjeduje instrukcije koje omoguavaju sabiranje ili oduzimanje brojeva veih od duple rijei. Ove instrukcije koriste carry indikator. Kako je ve reeno, i ADD i SUB instrukcije mijenjaju carry indikator ako se dese prijenos ili pozajmnica. Ova informacija smjetena u carry indikator se moe koristiti za sabiranje ili oduzimanje velikih brojeva razbijanjem operacije u operacije sa manjim dijelovima veliine duplih rijei (ili jo manje) Instrukcije ADC i SBB koriste ovu informaciju u carry indikatoru. Instrukcija ADC obavlja sljedeu operaciju:
operand1= operand1+ carry flag + operand2

Instrukcija SBB obavlja:


operand1= operand1-carry flag - operand2

2. Instrukcija ADD ADD instrukcija se koristi za sabiranje cijelih brojeva: add eax, 4 add al, ah ; eax = eax + 4 ; al = al + ah

3. Instrukcija AND Rezultat AND operacije nad dva bita je 1 ako su oba bita 1, ina_e je 0. Procesori podravaju ove operacije kao instrukcije koje rade neovisno nad svim bitima paralelno. Na primjer ako se izvri AND operacija izmeu AL i BL , osnovna AND operacija se primjeni na svaki od 8 parova odgovarajuih bita u oba registra.

AND

10101010 11001001 10001000

Na primjer:
mov ax, 0C123H and ax, 82F6H ; ax = 8022H

4. Instrukcija CALL Instukcija CALL smjeta na stek adresu instrukcije neposredno iza same sebe i izvrava bezuslovni skok u potprogram. 5. Instrukcija CBW Instrukcija CBW (Convert Byte to Word) predznno proiruje registar AL u AX. Operandi su implicitni. 6. Instrukcija CDQ Instrukcija CDQ (Convert Double word to Quad word) predznano proiruje EAX u EDX_EAX (64 bita). 7. Instrukcija CMP Kontrolne strukture treba da odrede ta da se radi na bazi pore_enja podataka. U asemblerskom jeziku, rezultat poreenja se smjeta u FLAGS registar da bi se kasnije koristio. Procesori iz serije 80x86 nude instrukciju CMP radi obavljanja poreenja. Registar FLAGS se postavlja na bazi razlike dva operanda instrukcije CMP. Operandi se interno oduzmu i FLAGS se postavi na bazi rezultata, ali rezultat samog oduzimanja se nigdje ne smjeta. Ako je rezultat potreban, tada se treba koristiti SUB instrukcija umjesto CMP. 8. Instrukcija DEC Instrukcija DEC umanjuje vrijednosti za 1. Poto je 1 implicitni operant, mainski kod za DEC je krai od ekvivalentnog SUB instrukcije. dec dl ; dl-

9. Instrukcija DIV DIV je operator dijeljenja. On obavlja nepredznaeno dijeljenje. Opti oblik je: div source

Ako je izvor 8-bitni, AX se dijeli sa operandom. Kolinik se smjeta u AL a ostatak u AH. Ako je izvor 16-bitni, onda se DX_AX dijele s operandom. Kolinik se smjeta u AX a ostatak u DX. Ako je izvor 32-bitni, onda se EDX_EAX dijeli sa operandom, a koli_nik se smjeta u EAX a ostatak u EDX. 10. Instrukcija FABS FABS ST0 = |ST0| Uzima apsolutnu vrijednost ST0

11. Instrukcija FADD Svaka operacija sabiranja ra;una sumu registra ST0 i drugog operanda. Rezultat se uvijek smjeta u koprocesorski registar. FADD src ST0 += src .

Izvor moe biti bilo koji koprocesorski registar ili broj jednostruke ili dvostruke preciznosti u memoriji. 12. Instrukcija FCOMP FCOMP src Poredi ST0 i src i pokupi broj s koprocesorskog steka. Izvor moe biti koprocesorski registar ili float ili double u memoriji. 13. Instrukcija FDIV FDIV src ST0 /= src. Izvor moe biti bilo koji koprocesorski registar ili broj jednostruke ili dvostruke preciznosti u memoriji. 14. Instrukcija FIADD FIADD src ST0 += (float) src . Sabira cijeli broj sa ST0. Izvor mora biti rije ili dupla rije u memoriji. 15. Instrukcija FLD FLD source Uitava broj u pokretnom zarezu iz memorije na vrh koprocesorskog steka. Izvor moe biti broj u jednostrukoj, dvostrukoj ili proirenoj preciznosti ili koprocesorski registar. 16. Instrukcija FSIN FSIN Sinus ST0

17. Instrukcija FSUB FSUB src ST0 -= src . Izvor moe biti bilo koji koprocesorski registar ili broj jednostruke ili dvostruke preciznosti u memoriji. 18. Instrukcija IDIV IDIV je operator dijeljenja. On obavlja predznaeno dijeljenje. Opti oblik je: idiv source Ako je izvor 8-bitni, AX se dijeli sa operandom. Kolinik se smjeta u AL a ostatak u AH. Ako je izvor 16-bitni, onda se DX_AX dijele s operandom. Kolinik se smjeta u AX a ostatak u DX. Ako je izvor 32-bitni, onda se EDX_EAX dijeli sa operandom, a kolinik se smjeta u EAX a ostatak u EDX. Instrukcija IDIV radi na isti nain. Ako je kolinik prevelik da stane u registre ili je djeljenik jednak 0, program se prekida i zavrava. Veoma esta greka je zaboravljanje inicijalizacije registara DX ili EDX prije dijeljenja. 19. Instrukcija IMUL Postoje dvije razliite instrukcije za mnoenje i dijeljenje. Instrukcija IMUL se koristi za mnoenje predznaenih brojeva. Pravila za mnoenje su razliita za nepredznaene i predznaene brojeve u drugom komplementu. Instrukcija IMUL ima isti format kao i MUL, ali dodaje jo neke formate. Postoje formati od dva ili tri operanda: imul dest, source1 imul dest, source1, source2 20. Instrukcija INC Instrukcija INC uveavaju vrijednosti za 1. Poto je 1 implicitni operant, mainski kod za INC od ekvivalentnog za ADD instrukciju. inc ecx ; ecx++

21. Instrukcija JO, JNO Ima mnogo razliitih uslovnih skokova. One takoer oznaavaju labelu kao njihov jedini operand. Najjednostavnije od njih samo posmatraju jedan od bitova FLAGS registra da odrede da li e se skok obaviti ili ne.
JO skae samo ako je OF postavljen na 1

JNO skae samo ako je OF postavljen na 0

Indikator prekoraenja (overflow) se postavlja na 1 ako je rezultat operacije neoekivanog predznaka (npr. Nakon sabiranja dva pozitivna broja dobije se negativan broj), ime se dolo do prekoraenja opsega predznaenih brojeva. 22. Instrukcija JZ, JNZ Ima mnogo razliitih uslovnih skokova. One takoer oznaavaju labelu kao njihov jedini operand. Najjednostavnije od njih samo posmatraju jedan od bitova FLAGS registra da odrede da li e se skok obaviti ili ne.
JZ skae samo ako je ZF postavljen na 1 JNZ skae samo ako je ZF postavljen na 0

Indikator nule (zero) se postavlja na 1 ako bi rezultat razlike bio 0. 23. Instrukcija JG, JA JG labela; ili JA labela JG se koristi za predznaceno poredjenje I skokove: vrsi skok na labelu ako je je vleft > vright JA radi isto, samo za nepredznacene brojeve. 24. Instrukcija JC, JB, JNAE, ta rade, ima li razlike medu njima Svi rade isto skok ako je vleft < vright. JC radi skok ako je Carry Flag = 1 (bice 1 za vleft < vright), JB I JNAE ako je vleft < vright gdje su operandi nepredznaceni. 25. Instrukcija JCXZ Jump if CX Zero: Vrsi skok ako je CX = 0 26. Instrukcija JMP, oblici Instrukcija JMP (skra_eno od jump ) ini bezuslovne skokove. Njen jedini argument je obino programska labela na koju se treba skoiti. Asembler ili linker e zamijeniti labelu ispravnom adresom instrukcije. To je jo jedna od dosadnih operacija koje asembler ini da programerov ivot bude jednostavniji. Vano je zakljuiti da naredba iza JMP se nikada nee izvriti ukoliko neka druga instrukcija ne skoi na nju. Ima vie varijanti instrukcija skokova: SHORT Ovaj skok je vrlo ogranienog dometa. On moe napraviti pomak svega do 128 bajtova u memoriji. Prednost ovog tipa je to koristi manje memorije nego ostali. On koristi jedan predznaeni bajt da smjesti pomak skoka. Pomak predstavlja vrijednost za koliko se bajtova treba pomjeriti naprijed ili nazad. Pomak se sabira sadrajem registra EIP). Da se specificira kratki skok, koristi se kljuna rije SHORT odmah ispred labele unutar instrukcije JMP. NEAR Ovaj skok je podrazumijevani tip za bezuslovne i uslovne skokove, pa se moe koristiti za skok na bilo koju lokaciju na segmentu. Zapravo, 80386 podrava dva tipa

near skokova. Jedan od njih koristi dva bajta za pomak. To doputa skokove do priblino 32,000 bajtova. Drugi tip koristi tiri bajta za pomak, to naravno doputa skok na bilo koju lokaciju unutar kodnog segmenta. etvorobajtna verzija je podrazumijevana u 386 zatienom reimu. Dvobajtni tip se moe specificirati stavljanjem WORD kljune rijei prije labele u instrukciji JMP. FAR Ovaj skok omoguava kontroli da skoi u drugi kodni segment. To je izuzetno rijetka akcija u 386 zatienom reimu. 27. Instrukcija LEAVE Poetni i krajnji dio potprograma se mogu pojednostaviti koritenjem dvije specijalne instukcije koje su dizajnirane upravo za ovu namjenu. Instrukcija ENTER realizuje poetni kod, a instrukcija LEAVE realizuje zavretak. Instrukcija ENTER ima dva neposredna operanda. Za C konvenciju poziva, drugi operand je uvijek 0. Prvi operand je broj bajtova potreban za lokalne varijable. LEAVE instrukcija nema operanada.
subprogram_label: enter LOCAL_BYTES, 0 ; = # bajtova potrebno za lokalne varijable ; kod potprograma leave ret

28. Instrukcija LEA LEA (Load Effective Address ). Sljedei kod rauna adresu varijable x I smjeta je u EAX: lea eax, [ebp - 8] Sada EAX sadri adresu varijable x i moe se smjestiti na stek prilikom poziva funkcije pp. Da se izbjegnu zabune, ovo izgleda kao da se itaju podaci sa adrese [EBP-8]; ali to nije sluaj. Instrukcija LEA nikada ne ita memoriju. Ona samo rauna adresu lokacije koja bi bila proitana nekom drugom instrukcijom i smjeta tu adresu u prvi registarski operand. Poto ona ne ita memoriju, nema potrebe (niti je doputeno) za navoenjem veliine operanda (npr dword). 29. Instrukcija LODS, LODSB, LODSW Najprostije string instrukcije itaju ili piu memoriju ili oboje. One mogu itati ili pisati bajt, rije ili duplu rije u trenutku. Instrukcije s kratkim opisom u pseudokodu ta one rade.
LODSB AL = [DS:ESI] ESI = ESI 1 LODSW AX = [DS:ESI] ESI = ESI 2

LODSD EAX = [DS:ESI] ESI = ESI 4 String instrukcije za itanje!

Prvo, ESI se koristi za itanje. To je lako zapamtiti ako se zna da SI je skraenica od Source Index. Dalje, registar koji uva podatke je fiksni ( AL, AX ili EAX). Konano, instrukcije za upis koriste ES za odreivanje segmenta u koji se pie, a ne DS. U zatienom reimu rada, ovo obino ne predstavlja problem, poto postoji samo jedan segment podataka i ES treba biti automatski inicijaliziran da referencira na njega (kao i DS ). Ipak, kod programiranja u realnom reimu rada, veoma je vano da programer inicijalizira registar ES na korektnu vrijednost selektora. 30. Instrukcija MOVS, MOVSB, MOVSW Kombinacija instrukcija LODSx i STOSx je vrlo esta. Zapravo, prva kombinacija se moe izvesti jednom MOVSx string instrukcijom. LODSD I STOSD se mogu zamijeniti jednom MOVSD instrukcijom s istim efektom. Jedina razlika je to se registar EAX uopte ne bi koristio u petlji.
MOVSB byte [ES:EDI] = byte [DS:ESI] ESI = ESI 1 EDI = EDI 1 MOVSW word [ES:EDI] = word [DS:ESI] ESI = ESI 2 EDI = EDI 2 MOVSD dword [ES:EDI] = dword [DS:ESI] ESI = ESI 4 EDI = EDI 4 Instrukcije za pomijeranje memorije!

31. Instrukcija MOV Najosnovnija instrukcija je MOV instrukcija. Ona premjeta podatke s jedne lokacije na drugu (poput operatora dodjeljivanja u jezicima visokog nivoa), Ona ima dva operanda: mov dest, src Podaci navedeni u src se kopiranju u dest. Ogranienje je da oba operanda ne mogu biti memorijski operandi. To pokazuje na jo jednu nezgodnu osobinu asemblerskog jezika. esta su (ponekad proizvoljna) pravila kako se pojedine instrukcije koriste. Operandi moraju takoe biti iste veliine. Vrijednost registra AX se ne moe smjestiti u BL. 32. Instrukcija MOVZX Ipak, nije mogue koristiti MOV instrukciju za konverziju nepredznaene rijei u AX u nepredznaenu duplu rije u EAX. Zato? Nema naina da se MOV instrukcijom specificira gornjih 16 bita registra EAX. Procesor 80386 rjeava ovaj problem uvoenjem

nove instrukcije MOVZX. Ova instrukcija ima dva operanda. Odredini (prvi operand) mora biti 16 ili 32 bitni registar. Izvorni (drugi operand) moe biti 8 ili 16 bitni registar odnosno bajt ili rije memorije. Drugo ogranienje je da odredite mora biti vee od izvora. (Veina instrukcija zahtijeva da su izvor i odredite iste veliine.) 33. Instrukcija NEG Instrukcija NEG negira svoj operand raunajui njegov drugi komplement. Njen operand moe biti 8-bit, 16-bit, ili 32-bit register ili memorijska lokacija. 34. Instrukcija NOT NOT operacija je unarna operacija (tj. ona radi nad jednim operandom, ne nad dva kao binarne operacije poput AND ). Primjer:
mov ax, 0C123H not ax ; ax = 3EDCH

Uoava se da NOT generie prvi komplement. Za razliku od drugih bit operacija instrukcija NOT ne mijenja sadraj niti jednog bita u registru FLAGS. 35. Instrukcija OR Ukljuivo OR dva bita je 0 ako i samo ako su oba bita 0, inae je rezultat 1. Primjer:
mov ax, 0C123H or ax, 0E831H ; ax = E933H

36. Instrukcija OUT Dakle, koja to mainska instrukcija tampa slovo na ekranu? Pogled na tablicu Pentiumovih instrukcija ne otkriva nikakvu specijalnu instrukciju. Umjesto toga, uoava se instrukcija OUT. One imaju sljedee oblike:
out osmobitni_broj_porta, al in al, osmobitni_broj_porta out osmobitni_broj_porta, ax in ax, osmobitni_broj_porta out osmobitni_broj_porta, eax in eax, osmobitni_broj_porta out dx, al in al,dx out dx, ax in ax,dx out dx, eax in eax,dx

Svaki periferijski ureaj ima neki dodijeljeni broj, koji se zove port. Instrukcija OUT alje podatak periferijskom ureaju i ima dva parametra. Prvi parametar predstavlja port ureaja kome aljemo podatak, a drugi predstavlja registar u kome se nalazi sam podatak. 37. Instrukcija POP

Instrukcija POP ita duplu rije na [ESP] i zatim dodaje 4 na ESP. Evo primjera kako ova instrukcija radi, koji pretpostavlja da je ESP inicijalno 1000H.
pop eax pop ebx pop ecx ; EAX = 3, ESP = 0FF8h ; EBX = 2, ESP = 0FFCh ; ECX = 1, ESP = 1000h

Stek se moe koristiti kao pogodno mjesto za privremeno uvanje podataka. Takoer se koristi za realizaciju poziva potprograma, prosljeivanje parametara i lokalnih varijabli. Na 80x86 postoji i PUSHA instrukcija koja smjeta vrijednosti na stek registara EAX, EBX, ECX, EDX, ESI, EDI i EBP registri (ne u ovom redoslijedu). Instrukcija POPA se moe koristiti da ih pokupi sve sa steka . Naredbe PUSH, POP, PUSHA i POPA imaju i esnaestbitne verzije, ali se one ne koriste u tridesetdvobitnim operativnim sistemima. 38. Instrukcija PUSH Instrukcija PUSH ubacuje rije ili duplu rije na stek, oduzimajui 4 od registra ESP i zatim smjeta duplu rije na adresu [ESP]. Evo primjera kako ova instrukcija radi, koji pretpostavlja da je ESP inicijalno 1000H.
push dword 1 push dword 2 push dword 3 ; 1 na adresi 0FFCh, ESP = 0FFCh ; 2 na adresi 0FF8h, ESP = 0FF8h ; 3 na adresi 0FF4h, ESP = 0FF4h

Stek se moe koristiti kao pogodno mjesto za privremeno uvanje podataka. Takoer se koristi za realizaciju poziva potprograma, prosljeivanje parametara i lokalnih varijabli. Na 80x86 postoji i PUSHA instrukcija koja smjeta vrijednosti na stek registara EAX, EBX, ECX, EDX, ESI, EDI i EBP registri (ne u ovom redoslijedu). Instrukcija POPA se moe koristiti da ih pokupi sve sa steka . Naredbe PUSH, POP, PUSHA i POPA imaju i esnaestbitne verzije, ali se one ne koriste u tridesetdvobitnim operativnim sistemima. 39. Instrukcija RCL Postoje dvije dodatne instrukcije rotiranja koje pomjeraju bitove u podacima i carry indikatoru zvane RCL and RCR. Na primjer, ako se rotira registar AX ovim instrukcijama, rotira se 17 bita sastavljenih od AX i carry indikatora.
mov ax, 0C123H clc ; obrisi carry indikator (CF = 0) rcl ax, 1 ; ax = 8246H, CF = 1 rcl ax, 1 ; ax = 048DH, CF = 1 rcl ax, 1 ; ax = 091BH, CF = 0

40. Instrukcija RET . Instrukcija RET uzima adresu sa steka i skae na ovu adresu. Prilikom upotrebe ovih instrukcija vano je manipulisati s stekom korektno da bi se prava vrijednost preuzela RET instrukcijom! Upotreba instrukcija CALL i RET omoguava gnijeenje

potprograma. Neka, na primjer potprogram get_int poziva read_int. Ovaj poziv smjeta na stek adresu iza instrukcije CALL read_int. Na kraju koda potprograma read_int se nalazi RET koji preuzima povratnu adresu i ponovo skae u kod od potprograma get_int. Onda, kada se izvri instrukcija RET potprograma get_int, ona preuzima povratnu adresu pa se ponovo skae u glavni program. Ovo radi zbog LIFO (Last In First Out) svojstva steka. Vrlo je vano pokupiti sve podatke koji su smjeteni na stek. 41. Instrukcija ROL, ROR Instrukcije rotiranja rade kao instrukcije logikog pomijeranja, osim to se bitovi koji bi bili izgubljeni na jednoj strani ubacuju na drugu. Tako se podaci kreiraju kao cirkularna struktura. Dvije najprostije instrukcije rotiranja su ROL i ROR koje obavljaju rotiranja u lijevo i desno. Ba kao i ostala pomijeranja, ova pomijeranja ostavljaju kopiju zadnjeg kopiranog bita u carry indikator.
mov ax, 0C123H rol ax, 1 rol ax, 1 rol ax, 1 ror ax, 2 ror ax, 1 ; ax = 8247H, CF = 1 ; ax = 048FH, CF = 1 ; ax = 091EH, CF = 0 ; ax = 8247H, CF = 1 ; ax = C123H, CF = 1

42. Instrukcija SAL, SAR Ove instrukcije pomijeranja su dizajnirane da omogue predznaenim brojevima da budu brzo pomnoeni ili podijeljeni stepenima broja 2. To osigurava da se bit predznaka korektno tretira. SAL Shift Arithmetic Left Ova instrukcija je samo sinonim za SHL. Ona se prevodi u doslovno isti mainski kod kao i SHL. Sve dok se bit predznaka ne mijenja pomijeranjem, rezultat e biti korektan. SAR Shift Arithmetic Right Ovo je instrukcija koja ne pomjera bit predznaka (najznaajniji bit) svog operanda. Drugi bitovi su pomjereni kao i normalno, osim to su novi biti koji dolaze s lijeve strane kopija bita predznaka (tj. Ako je bit predznaka jednak 1, novi biti su takoe 1). Tako, ako se bit pomjera ovom instrukcijom, samo donjih 7 bita se pomjera. Kao i sa drugim pomijeranjima, zadnji pomjereni bit se smjeta u carry indikator.
mov ax, 0C123H sal ax, 1 ; ax = 8246H, CF = 1 sal ax, 1 ; ax = 048CH, CF = 1 sar ax, 2 ; ax = 0123H, CF = 0

43. Instrukcija SETE, SETNE SETE: postavlja odredisni operand na 1 ako su vrijednosti koje su bile poredjene jednake, tj. Ako je ZF = 1. Ako je ZF = 0, onda postavlja odredisni operand na 0. SETNE: postavlja odredisni operand 1 ako su vrijednosti koje su bile poredjene razlicite, tj. Ako je ZF = 0. Ako je ZF = 1, onda postavlja odredisni operand na 1.

44. Instrukcija XCHG Razmjenjuje vrijednosti operanada. Operandi mogu biti ili 2 registra ili jedan registar I jedna memorijska lokacija. Mogu biti I 16bitni I 32bitni registri. 45. Instrukcija XOR Iskljuivo XOR dva bita je 0 ako i samo ako su oba bita jednaka u protivnom je rezultat 1. Primjer:
mov ax, 0C123H xor ax, 0E831H ; ax = 2912H

III DIO 1. Razlika I primjeri memorijski mapiranih I U/I mapiranih ureaja Ureaji kojima se pristupa koristei IN i OUT instrukcije se zovu ulazno/izlazno (U/I mapirani ureaji). Ne pristupa se svakom ureaju na niskom nivou na ovaj nain, uz pomo IN i OUT instrukcija. Zapravo, ako se pogledaju skupovi instrukcija mikroprocesora kao to je Motorola 68000 ili nekih RISC procesora, nee se nai ovakve instrukcije. Umjesto toga, ovi procesori (a i 80x86 kod nekih periferijskih ureaja kao to je ekran) koriste memorijski mapirane ureaje. Kod ovakvih ureaja, memorijski ipovi na odreenim adresama se zamijene ureajem koji reaguje na upis ili itanje date lokacije. Na ovaj nain se pristupa periferijskim ureajima koristei obine MOV instrukcije. Prednost U/I mapiranih periferijskih ureaja je to ne troe adresni prostor koji bi se mogao puniti memorijskim ipovima (na 8086 64 kilobajta je znaajan procenat adresnog prostora on jednog megabajta) I to je u programima lake izdvojiti instrukcije koje rade s perifernim ureajima. Prednost memorijski mapiranih periferijskih ureaja je to mogu koristiti sve adresne reime instrukcija koje se koriste i za pristup memoriji, a mogue im je pristupiti i iz C programa bez pisanja asemblerskih rutina. 2. Textualna video memorija, organizacija DOS programeri (u realnom reimu) veoma esto pristupaju direktno u video memoriju. Na primjer, ako se raunar nalazi u tekstualnom reimu rada, i ako je registar DS postavljen na vrijednost 0B800h i izmijeni vrijednost na adresi 0000 u 41h, primjetie se da se slovo A ispisalo na ekranu u gornjem lijevom uglu. Broj 41h je ASCII kod slova. Ovo jo uvijek radi pod svim DOS programima kada se izvravaju na Windows mainama (osim Windows XP/Vista 64 bit edition koji nisu vie DOS kompatibilni). Svaki znak u tekstualnom reimu zauzima dva bajta, jedan za ASCII kod, a drugi za oznaku boje. Oznaka boje je podijeljena u dva nibla, nia 4 bita predstavljaju boju samog znaka, a via etiri bita predstavljaju boju pozadine. Da bi se promijenio znak na poziciji X,Y (gdje je pozicija 0,0 gornji lijevi ugao ekrana) prosto se mijenja bajt na adresi ( ako je DS na 0B800h)

X*2+Y*160 Ova formula je vaea ako je ekran irok 80 znakova. Ali ako je irok 40 znakova, formula bi bila X*2+Y*80. 3. Upotreba WriteConsole funkcije Postoje dvije sistemske funkcije bitne za ispis teksta na konzolnom ekranu: GetStdHandle I WriteConsoleA. One su locirane u kernel32.dll, i oekuju parametre na steku. Ako se na stek smjesti vrijednost -11 prije poziva funkcije GetStdHandle ova funkcija e vratiti vrijednost koja predstavlja oznaku konzole u registru EAX. Funkcija WriteConsoleA, prikazuje tekst na konzoli i oekuje redom pet parametara na steku, jednu nulu, adresu lokacije na koju e biti primljen broj ispisanih znakova, broj znakova koje treba ispisati, adresu same poruke koja se ispisuje i na kraju oznaku konzole (handle). Ove funkcije se mogu pozvati i iz asemblerskog programa i iz C-a. Primjeuje se, meutim, da ime funkcije koje se poziva iz asemblerskog jezika ima dva dodatka, podvlaujuu crticu ispred imena i broj bajtova koje one zahtijevaju na steku naveden iza ampersand (@) znaka. U jeziku C, tih dodataka nema. 4. Koja su 4 osnovna dijela Windows API programa [Ne znam sta bi ovo pitanje trebalo da znaci... Ako je u pitanju samo program koji koristi WIN API, onda on se moze sastojati od samo main-a i jednog poziva funkcije, tako da ni nema sanse da ima 4 dijela :/] Ako je u pitanju event driven GUI aplikacija, onda bi to moglo biti: WinMain funkcija unutar koje se nalazi petlja poruka (event loop, message dispatcher) koja preusmjerava poruku na odgovarajucu prozorsku proceduru (CALLBACK) koja obradjuje poruku ispitujuci koja je poruka proslijedjena. Obavezno mora imati #include windows.h 5. Tipini izgled petlje poruka while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } 6. Tipini izgled prozorske procedure int CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { switch (iMsg) { case WM_DESTROY: PostQuitMessage(0); break; case . .. .. default:

return DefWindowProc(hwnd, iMsg, wParam, lParam); } } 7. ta radi RegisterClass Kada je prozorska klasa definisana, ona se registruje, to se ini prosljeivanjem reference na klasu &wndclass funkciji RegisterClass. Nakon to je klasa registrovana, moe se koristiti tekstualno ime klase radi kreiranja instance prozora koji pripada ovoj klasi. 8. Kako se kreira I prikazuje prozor u Windowsu Prozor se kreira pozivom funkcije CreateWindow. Prvi argument koji CreateWindow uzima je tekstualno ime prozorske klase. Drugi argument je naslov prozora - string koji se pojavljuje na vrhu prozora. Trei argument je stil prozora, vrijednost WS_OVERLAPPEDWINDOW se odnosi na standardni prozor sa okvirom i osnovnim menijem. etiri broja 0, 0, 200, 200 specificiraju x i y koordinate (gornjeg lijevog ugla) i irinu i visinu prozora. Preostali argumenti predstavljaju oznaku roditeljskog prozora (u ovom sluaju prazno), oznaku menija (trenutno prazno), oznaku samog programa (hInstance kako je dodijelio operativni sistem i proslijedio ka WinMain), i tzv. Podaci o kreiranju, koji se ne koriste u jednostavnijim primjerima. CreateWindow funkcija vraa oznaku novokreiranog prozora (handle). Nakon to je prozor kreiran na ovakav nain, blok memorije je alociran za prozor. Ali prozor nije jo vidljiv na ekranu. Za prikaz prozora na ekranu koriste se dvije druge funkcije, ShowWindow I UpdateWindow. Ove funkcije nose oznaku prozora kao parametar, ShowWindow funkcija ima drugi argument koji specificira reim ekrana (normalni prozor, minimizirani ili maksimizirani) to obino koristi iCmdShow parametar proslijeen WinMain funkciji. UpdateWindow alje WM_PAINT poruku direktno prozorskoj proceduri, forsira prozor da se odmah crta (bez nje e WM_PAINT poruka biti smjetena u red ekanja, pa crtanje moe u nekim programima biti zakanjelo). 9. Uloga poruke WM_PAINT WM_PAINT poruka se alje prozoru kada je potrebno ga iscrtati. (na primjer prilikom prvog kreiranja ili ako ga je neki drugi prozor prekrio). Prvo se poziva BeginPaint. Ova funkcija vraa kontekst ureaja pridruen uz prozor. Sve funkcije za crtanje kao parametar ne trae oznaku prozora, nego konteksta ureaja. Razlog je to to omoguava upotrebu istih funkcija za crtanje i na onome to nije unutranjost prozor (papir tampaa, desktop, okvir prozora). Prvi argument funkcije BeginPaint je oznaka prozora, a drugi &ps je referenca na PAINTSTRUCT strukturu. Neki programi iz ove strukture mogu saznati vie o samom prozoru, ali u ovom primjeru te informacije nisu potrebne. 10. Naini komunikacije s tastaturom na niskom nivou

IBM je koristio veoma jednostavan dizajn tastature na originalnim PC raunarima, ali je redizajnirao interfejs izmeu raunara i tastature, poevi od IBM PC/AT, i ovaj standard se prati i danas, promijenjen je u meuvremenu samo oblik prikljuka. Princip rada IBM AT tastature se zasniva na dva mikrokontrolera, jedan na matinoj ploi raunara, a drugi unutar kuita tastature. Slanje komandi kontroleru na matinoj ploi se obavlja slanjem na port 64h a komandi kontroleru na samoj tastaturi se obavlja slanjem na port 60h. Slino, status kontrolera na matinoj ploi se dobija itanjem s porta 64h, a itanje samog tastera se dobija itanjem porta 60h. Mana ovog pristupa je postala uoljiva im je prvi PC prodan izvan Amerike. Razliite zemlje su navikle na razliite rasporede tastera (najbolji primjer je poloaj tastera Z na naoj i engleskoj tastaturi), a rutina vraa vrijednost tastera koja je fiksna, bez obzira na jezik. Druga mana je to ovakvo oitavanje tastature oduzima procesorsko vrijeme. Stoga je razvijen sistem da pritisak na taster poziva potprogram (o tome u poglavlju o interaptima) i zatim se oznaka tastera zapamti, prevede u odgovarajue slovo prema izboru tastature i program nastavi. Prema pravilima operativnog sistema se kasnije oitavaju tako zapameni tasteri. 11. Linux poziv write (sys_write) write pise u file: ssize_t write(int fildes, const void *buf, size_t nbyte); Pise nbyte bytea iz buffera na ciji pocetak pokazuje buf u file ciji je file descriptor fildes. sys_write je sistemski poziv za ovu funkciju. 12. Uloga poruke WM_KEYDOWN Postoje dva osnovna tipa tastaturnih poruka. Tastatura se moe posmatrati kao skup tastera ili kao ureaj koji alje slova. Kada se pritisne taster, Windows alje poruku WM_KEYDOWN prozoru kada se taster pritisnuo. Prilikom otputanja tastera, Windows alje poruku WM_KEYUP. Pored ovoga, funkcija TranslateMessage konvertuje ove poruke u poruke WM_CHAR, uz koju se dobija i slovna oznaka tastera. Oznaka tastera, fizika (za WM_KEYDOWN, WM_KEYUP, koja se zove i Scan code), odnosno slovna (za WM_CHAR) nalazi se u wparam dijelu poruke. 13. Nain komunikacije s diskom na niskom nivou Floppy diskovi, IDE hard diskovi, SCSI diskovi i USB diskovi imaju dosta razliite principe pristupa, iako interna organizacija moe biti dosta slina. Svi oni imaju sloena integrirana kola na njima ili matinoj ploi raunara koji se zovu disk kontroleri. Na modernim diskovima oni su esto kompleksniji od centralnih procesora koritenih u prethodnim godinama. Prilikom otvaranja hard diska primjeuje se da se on sastoji od razliitih povrina i glava. Svaka povrina je logiki podijeljena na staze (kruna putanja), a staze su podijeljene na sektore. Skup istih staza na svim putanjama se zove cilindar. Bez operativnog sistema mogue je pristupiti podacima samo direktnim pristupom stazama I sektorima. Svaki disk interfejs, pa ak i razliiti diskovi na istom interfejsu ima svoj skup portova za upravljanje kontrolerom. Na primjer, najpopularniji sluaj, prvi IDE hard disk koristi portove izmeu 01f0h i 01F1h.

Kao i kod ostalih periferijskih ureaja, direktni pristup je nuno zlo, i koristi se prilikom pravljenja operativnog sistema. Ovdje je razliitost izmeu vrsta diskova samo jedan od problema. Pristup direktno sektorima onemoguava posjedovanje programa koji sluajno koriste isti dio diska. Na primjer, ako imamo dva programa koji su napisani da direktno piu u isti sektor, oni se ne mogu koristiti jer e pokretanjem jednog programa, podaci potrebni u drugom programu e biti obrisani. Jasno je da je nivo tete iz ovog daleko vei od pisanja u tui prozor na ekranu ili ovisnost rutine za tastaturu od jezika. Stoga, svi operativni sistemi, pa i oni najtrivijalniji imaju koncept datoteka. Datoteke omoguavaju uvanje podataka pod jedinstvenim imenom. 14. Windows API funkcija ReadFile Kada se dobila oznaka datoteke uz pomo CreateFile, dalje se moe koristiti ta oznaka u funkcijama ReadFile() i WriteFile(). Ostali parametri za ReadFile() i WriteFile() predstavljaju bafer za smjetanje podataka, broj bajtova koji se ita ili pie, pokaziva na DWORD vrijednost u koju se smjeta broj uspjeno upisanih ili proitanih bajtova. Navodi se i pokaziva na strukturu OVERLAPPED koja omoguava da se prijenos podataka izmeu memorije i diska obavlja bez zaustavljanja rada programa. Ako se eli da program saeka prijenos podataka, za ovaj parametar se prosljeuje NULL. Ove funkcije vraaju TRUE ili FALSE koje indiciraju da li se operacija uspjeno obavila. 15. Razlika izmeu 3 vrste prekida Hardverski interapti dolaze od fizikih ureaja u maini. Na primjer, kada se god pojavi bajt koji dolazi sa komunikacijskog porta, aktivira se hardverski interapt broj 0B ili 0C. Kada se zavri ulazno/izlazna operacija, takoer se pokree hardverski interapt. Ovo znai da kada se na primjer pritisne taster na tastaturi, kontroler tastature poalje IRQ1 kontroleru interapta, a onda se natjera procesor da izvri instrukciju INT 09. Ovo e pozvati odgovarajui potprogram koji smjeta pritisnuti taster u red neoitanih tastera. Softverski interapti se deavaju eksplicitnim pozivom INT nn instrukcije iz aplikacije. Aplikacije tipino koriste ovaj mehanizam da dobiju razliite usluge operativnog sistema. U operativnom sistemu DOS softverski interapti su bili izuzetno znaajni. Sav pristup disku, tastaturi, ekranu za dobro napisane programe je bio koritenjem neke INT nn instrukcije. Najee koritene su INT 10h (video servisi), INT 13h (direktni pristup disku), INT 14h (komunikacijski ure_aju), INT 16h (tastatura), INT 17h (funkcije tampaa), INT 21h (DOS funkcije), INT 27h (instaliranje drajvera i ostalih programa koji ostaju u memoriji), INT 33h (funkcije mia). Prije poziva se obino u AH registar stavi vrijednost koja oznaava podfunkciju, a u ostale registre dodatni parametri. Izuzeci (exceptions) se dogaaju unutar normalnih instrukcija procesora ako je neki dogaaj neuobiajen. Jedan takav primjer je unutar DIV instrukcije ako se dijeli sa nulom. Umjesto uvanja netanog rezultata, tada procesor izvri INT 0. Drugi primjer je pristup memorijskoj lokaciji koja je izvan doputenog podruja. U ovom sluaju procesor skae na potprogram koji moe da prekine glavni program (pokuaj ometanja drugog programa) ili proglasi lokaciju doputenim podrujem i eventualno uita njen sadraj sa

diska. Primjer izuzetka je i izvravanje instrukcije koja ne postoji. Tada se u okviru potprograma koji procesor izvri omogui izvravanje ekvivalentnog programskog koda (naravno sporije). Tipian primjer je izvravanje instrukcija koprocesora na 80386. 16. Kako processor rauna adresu prekidne rutine u realnom I zatienom reimu U zatienom reimu rada, interapti se obrauju na slian nain kao u realnom reimu. Tablica prekidnih deskriptora (Interrupt Descriptor Table - IDT) radi u principu ono to IVT radi u realnom reimu. IDT je niz 8-bajtnih deskriptora segmenta koji se zovu kapije (gates). Interrupt Descriptor Table Register (IDTR) sadri adresu i limit IDT. IDT mora postojati u fizikoj memoriji i nikada ne smije se prebaciti u virtualnu memoriju. Elementi ove tabele mogu biti tri tipa, interapt kapije, trap kapije i task kapije. Ovdje e biti spomenute interapt kapije. U okviru njih se nalazi vrijednost kodnog segmenta i pozicije u okviru njega za izvrenje ovog prekida, kao i nivo privilegije prekidnog deskriptora. Kada se desi prekid, nae se pozicija u IDT, sauvaju na steku EFLAGS, CS, i EIP i pozove adresa rutine navedena u IDT. Po zavretku rutine, treba izvesti IRET instrukciju za povratak kontroli. Zavisno od tipa prekida, oznaka greke se moe smjestiti na stek. Polje DPL u interapt kapiji kontrolie softverske interapte. Trenutni nivo prava aplikacije mora biti najmanje jednak vrijednosti DPL da bi se ovi softverski interapti mogli pozvati. Ako nije, tada se poziva General Protection Fault. Ovo omoguava operativnom sistemu da odreene softverske interapte zadri za sebe. Hardverski interapti i izuzeci se izvravaju bez obzira na trenutni nivo privilegije. 17. ta tipino radi rutina za obradu prekida Rutine koje se izvravaju za obradu hardverskih prekida treba da budu brze, kratke i sigurne. One se esto piu u asembleru, mada i jezici visokog nivoa kao to je C su takoer popularni. Na modernim operativnim sistemima rutine za obradu prekida su sastavni dio drajvera periferijskih ureaja. Nakon to se desi prekid, CPU nastavlja program u podruju memorije predvienom za operativni sistem u sluaju Windowsa ili Linuxa, odnosno u drugi segment u sluaju DOSa. Dobro napisana prekidna rutina obino radi sljedee: _ Sauva sve registre na stek ili neko drugo privatno memorijsko podruje _ Odradi glavni dio rutine _ Poalje ipu kontrolera interapta (na port 20h ili 0Ah) vrijednost 20h - EndOfInterrupt _ Vrati registre sa steka _ Vrati se iz potprograma koristei instrukciju IRET Ako je cilj glavne rutine da prima podatke sa ulaznog ureaja, nije preporuljivo da se previe vremena provede unutar rutine za obradu prekida. Bolje je samo podatke negdje zapamtiti, a njihovu obradu prepustiti programima izvan ove rutine, kako bi se vie vremena ostavilo korisnikim programima. 18. Za API funkciju CheckDlgButton odredite DLL kome pripada
User32.dll

19. Za API funkciju SetPixel odredite DLL kome pripada


Gdi32.dll

20. Za API funkciju CreateFile odredite DLL kome pripada


Kernel32.dll

IV DIO 1. Razlika izmedu prolaza i faze kompilacije Faza kompilacije nije isto to i prolaz. Broj prolaza govori koliko puta kompajler mora itati isti dio datoteke s izvornim programom (ili njene kopije u memoriji). Faza se odnosi na razliite akcije koje se deavaju nad ovim dijelom izvornog programa. Zavisno od kompleksnosti kompajlera, sama kompilacija se moe podijeliti u vie faza. Faze se dijele na povrinske i pozadinske. Povrinske faze su vezane vie za izvorni jezik i to su predprocesiranje, leksika analiza, sintaksna analiza (parsiranje) i semantika analiza. Pozadinske faze su vie vezane za odredini jezik i to su kompajlerska analiza, optimizacija i generisanje koda. 2. ta se radi u leksickoj a ta u sintaksnoj analizi Leksika analiza razbija izvorni kod u male komade koji se zovu tokeni. Svaki token je atomski dio jezika, na primjer kljuna rije, identifikator ili ime simbola. Sintaksa tokena je regularni jezik, pa se moe kreirati konani automat za njihovo prepoznavanje. Drugi naziv za ovu fazu je skaniranje, pa se ovaj dio kompajlera zove leksiki analizator ili skaner. Parsiranje ili sintaksna analiza je proces analize ulazne sekvence (itanje iz datoteke ili tastature) da se odredi da li se gramatka struktura slae s odgovarajom formalnom gramatikom. Dio kompajlera koji obavlja ovu fazu se zove parser ili sintaksni analizator. Postoje dva osnovna metoda sintaksne analize, LL I LR metod. 3. Razlika izmedu LL i LR parsiranja Postoje dva popularna algoritma za sintaksnu analizu, ili parsiranje. Jedan je baziran na principu odozgo na dolje. Kompajler kree od najkompleksnije jedinice (na primjer program) i oekuje glavne elemente ove jedinice. Na primjer, program u Pascalu mora poeti simbolomprogram praenim imenom programa i taka-zarezom. Nakon takazareza moe se nai jedna od kljunih rijei: var, type, const, label, begin. Ako se prepozna kljuna rije var, to znai da slijedi deklaracija varijabli i da se sada identifikator varijable oekuje, praen simbolima , ili :. Ovaj proces se moe nastaviti sve dok se ne dostigne kraj programa ili doe do situacije da je proitan neoekivani simbol, to rezultuje sintaksnom grekom. Ovakav algoritam je pogodan za runo pisane kompajlere i obino se naziva LL ili Recursive descent. On se najee realizuje potprogramima koji implementiraju sintaksne elemente. Druga varijanta je da se preuzme simbol i on poredi s najjednostavnijim sintaksnim elementom. Na primjer, kada

se preuzme simbol 554, on se prepozna kao numerika konstanta. Sintaksni analizator je sada u stanju prepoznata numerika konstanta Ali, numerika konstanta je ujedno i numeriki izraz, pa je sintaksni analizator je sada u stanju prepoznat numeri_ki izraz. Ako iza slijedi simbol + sada je sintaksni analizator u stanju numeriki izraz praen znakom +. Nai_e li nova numerika konstanta, moe se vratiti u stanje prepoznat numeriki izraz (jer je zbir numerikih izraza numeri_ki izraz), ali ako naie , npr, simbol $ prelazi se u stanje greke. Ovaj nain parsiranja se zove LR. On se realizuje uz pomo specijalnih tablica koje su generirali posebni programi, parser generatori (najpoznatiji se zove Yacc). LR omoguava realizaciju parsiranja nekih jezika koji se ne mogu realizovati preko LL algoritma. LL parseri su bri, razumljiviji i savreno prepoznaju prvu greku. LR parseri esto grijee u prepoznavanju prve greke, ali bolje prepoznaju ostale greke u odnosu na LL. Neke jezike koje je mogue parsirati LR parserima nije mogue parsirati LL parserima, dok se svaki jezik koji se moe parsirati LL parserom moe parsirati i LL parserom. 4. Uloga operatora > < # := u FILDZAN 32 > < # := Vee Manje Razliito Dodjeljivanje

5. Kako razlikujemo lokalnu, globalnu, karakter pointer i funkciju u FILDZAN 32 Postoje globalne, lokalne i parametarske varijable. Radi lakeg raspoznavanja imena varijabli poinju malim slovom, imena lokalnih varijabli poinju slovom l , imena parametara slovom p. Sve varijable su 32-bitni cijeli brojevi. Ta vrijednost moe uvati i pokazivae. Ako ime varijable poinje slovom c ona je globalna i ujedno pokaziva na niz znakova. Ako ime varijable poinje ostalim malim slovima, ona je globalna. Uvoenje vrijednosti varijable kao pokazivaa omoguava laku realizaciju nizova. 6. Na koji nacin se postie prioritet operatora u FILDZAN 32 kompajleru Razliiti nivoi prioriteta koji se nalaze unutar izraza mogu se lako realizovati uz pomo rekurzivnih funkcija, kojih treba da bude koliko i nivoa prioriteta. Operatori s najviim prioritetom se nalaze u sintaksnom elementu i funkciji Faktor . U ovoj funkciji se najprije provjeri da li je naredni simbol unarni operator. Ako jeste, funkcija Faktor poziva samu sebe, a onda se emituje odgovarajua instrukcija koja smjeta korektnu vrijednost u registar EAX. Unutar funkcije Clan vidi se da ona prvo poziva Faktor. Zatim se vidi da li slijedi neki od operatora mnoenja, dijeljenja ili ostatka pri dijeljenju. Ako slijedi, generie se PUSH EAX jer se EAX mora sauvati na steku, poto e se ponovo pozivati Faktor za dobivanje drugog faktora u izrazu koji takoer generie instrukcije koje meurezultat vraaju u registru EAX. Nakon poziva drugog faktora, generiu se instrukcije da se

vrijednost zapamena na steku vrati sa steka i dobije u registru EBX. Sada se jedan faktor nalazi u EAX, a drugi u EBX, te se generiu odgovarajue instrukcije mnoenja ili dijeljenja. Slino, Izraz se sastoji od lanova razdvojenih operatorima sabiranja, oduzimanja, konjunkcije, disjunkcije ili ekskluzivne disjunkcije. I ovdje se prvo pozove Clan, provjeri ima li oekivanog operatora, pa ako ima generie PUSH EAX, ponovo pozove Clan, generie POP instrukcija da se jedan argument nalazi u EAX, a drugi u EBX, i generie instrukcija koja obavlja operaciju Operatori dodjeljivanja i relacioni operatori su na najniem prioritetu, u okviru procedure IzrazDodjeljivanja. 7. Kako je realizovana kontrolna struktura "dok" Programske strukture : ako - inace, dok i asembler . Naredbe ako/inace i dok su ekvivalentne naredbama if/else i while u programskom jeziku C, osim to su zagrade {} obavezne za programski kod, ali zagrade ( ) za uslovni izraz nisu neophodne. Asemblerska sekvenca poinje kljunom rijeju assembler i zavravaju simbolom \ . Linije izmeu su u asemblerskom jeziku, tako da se mogu prevesti asemblerom NASM. 8. Kako je realizovana kontrolna struktura "ako" Programske strukture : ako - inace, dok i asembler . Naredbe ako/inace i dok su ekvivalentne naredbama if/else i while u programskom jeziku C, osim to su zagrade {} obavezne za programski kod, ali zagrade ( ) za uslovni izraz nisu neophodne. Asemblerska sekvenca poinje kljunom rijeju assembler i zavravaju simbolom \ . Linije izmeu su u asemblerskom jeziku, tako da se mogu prevesti asemblerom NASM. 9. Zato se parametri funkcije u FILDZAN 32 prosljeduju s MOV [ESP+nn],EAX umjesto PUSH EAX Stek se koristi i za uvanje parametara funkcija. Koritena je StdCall konvencija kako bi se programi lako mogli proiriti ogromnim blagom koje prua Win32 API. No, radi lakeg realiziranja redoslijeda parametara na steku koji zahtijeva StdCall konvencija, parametri se ne smjetaju naredbom PUSH EAX nego MOV [ESP+nn],EAX. 10. Uloga EAX i EBX registara u generisanom kodu u FILDZAN 32 kompajleru Prilikom rauna aritmetikog izraza, trenutni meurezultat (i konani rezultat) se nalazi u registru EAX, dok registar EBX slui kako adresa podatka (neophodna za operatore * i :=) i kao drugi argument prilikom aritmetikih operacija. Svaki put kada se oekuje sintaksni element koji e pokvariti sadraj registra, trenutna vrijednost registra se uva na steku. Ovo dovodi do dosta neoptimalnog koda, jer e se podatak uvati na steku i kada

se ne kvari njegov sadraj, ali dodavanje optimizacije koda bi uinilo kompajler znatno veim i manje razumljivim. 11. ta su to lijevo asocijativni, desno asocijativni i neasocijativni operatori Operatori dodjeljivanja i relacioni operatori su na najniem prioritetu, u okviru procedure IzrazDodjeljivanja. Veina operatora su tzv. lijevo asocijativni. Npr a*b*c znai da se a mnoi sa b, pa nakon toga taj proizvod mnoi sa c). Operator dodjeljivanja mora biti tzv. desno asocijativan (a:=b:=c mora dodijeliti varijablu c varijabli b a zatim varijablu b varijablu a). Stoga se viestruko ponavljanje operatora dodjeljivanja ne realizuje while petljom, nego rekurzijom. Relacioni operatori imaju smisla samo s dva operanda, pa nisu asocijativni, dakle sa njima nema ni petlji ni rekurzije. Operator dodjeljivanja je:=. Poto je to operator od dva znaka, on se provjerava funkcijom Slijedi, nakon to je prepoznat simbol :. Operator dodjeljivanja generie instrukcije koje smjetaju vrijednost registra EAX (ili AL u sluaju upisa karaktera) na adresu na koju pokazuje EBX. 12. Kojim redoslijedom linker spaja objektne datoteke u izvrnu Linkerov zadatak je da spoji OBJ datoteke u jedinstvenu izvrnu datoteku. Ipak, kada bi stvari bile tako jednostavne linker bi bio obi_ni program koji spaja gomile podataka. Komplikovani dio linkera je posao fiksiranja, o emu e biti rijei kasnije. Kao i asembler i linker obavlja zadatak u dva prolaza. U prvom prolazu linker sastavi skup pravila za povezivanje, a u drugom primjenjujui ta pravila upisuje izvrnu datoteku. Linker treba da stavi sav kod i podatke iz svake OBJ datoteke u izvrnu datoteku. Ako se linkeru proslijede tri OBJ datoteke tada se kod i podaci iz sve tri OBJ datoteke smjeta u EXE. Ali to se ne radi prostim lijepljenjem OBJ datoteka jedne na kraj druge. Umjesto toga linker spaja sve sekcije sa istim imenom u jedinstvenu. Na primjer, tri OBJ datoteke od kojih svaka ima jednu .text sekciju e se povezati u jedinstveni EXE sa jednom .text sekcijom, koja se sastoji od tri individualne .text sekcije kakve su bile u OBJ datoteci. Jedinstvena sekcija se formira spajanjem istoimenih sekcija u redoslijedu kako je proslijeeno kroz parametre linkeru. 13. REL32 i DIR32 popravka u linkovanju Popravka REL32 znai da nova adresa treba da se upie relativno od adrese na kojoj se vri popravka. U primjeru sa CALL naredbom treba zamijeniti ove etiri nule popravkom REL32. Ukoliko su se ove nule nalazile na adresi 1000, a nakon spajanja modula POTPROGRAM upadne na adresu 2530, umjesto nula upisuje se 1530. Potprogram se dakle poziva sa relativnom adresom i na taj nain je omoguena relokatibilnost. Ovaj tip popravke se ne upisuje u izvrnu datoteku. Popravka DIR32 je predvi_ena za popravku apsolutnih adresa. Pogledati sljedei primjer. MOV EAX,VRIJEDNOST VRIJEDNOST DD 43332 Neka se labela VRIJEDNOST nalazi na adresi 00002E03

Asembler e prevesti prvu instrukciju u apsolutnu adresiranje, npr. B8 03 2E 00 00. Uita li se program na adresu 00600000, i instrukcija MOV EAX se mora mijenjati, na primjer u B8 03 2E 40 00 jer je labela VRIJEDNOST sada na adresi 00602E03. Nova vrijednost koju linker upie nakon DIR32 popravke jednaka je zbiru podrazumijevane startne adrese programa i prethodne vrijednosti koja se nalazila na adresi koja se popravlja. Podrazumijevana startna adresa je 00400000h, pa linker treba u naem sluaju da primjeni sabiranje konstanti 00400000h I 00002E03h i upie adresu 00402E03h. Windowsov loader e, ukoliko postoji .reloc sekcija, obaviti ovaj zadatak jo jednom, ali samo ako se program uitava na nepodrazumijevanu adresu. Tada se za svaki DIR32 slog sabira vrijednost na adresi koju popravljamo sa razlikom izmeu podrazumijevane i stvarne adrese gdje je program uitan. 14. Kada dva programa koji koriste isti DLL dijele njegov kod i podatke a kada ne Programski kod unutar DLL se obino dijeli izmeu svih procesa koji koriste taj DLL; tj. zauzima jedinstveno mjesto u fizikoj memoriji. S druge strane, podaci unutar DLL-a su privatni. Svaka aplikacija koja pristupa podacima iz DLL-a ima razliitu kopiju ovih podataka. To znai da ako je jedna aplikacija postavila internu varijablu biblioteke na vrijednost 10, a druga na vrijednost 20, i jedna i druga aplikacija vide samo onu vrijednost te varijable koju je postavila(mada je mogue to promijeniti da svi programi dijele i podatke unutar DLL, no to ima i negativnu stranu jer se tada smanjuje izolovanost izmeu programa to predstavlja sigurnosnu rupu). Postoji, meutim sluaj kada DLLovi imaju odvojene kopije i koda, ne samo podataka. Ako je DLL kompajlirana tako da njene memorijske adrese dolaze u konflikt s memorijskim adresama drugih DLL biblioteka u nekim aplikacijama tada Windows mora da relocira tu biblioteku na drugu adresu. To je relativno spor proces i ponekad uzrok sporog startanja nekih aplikacija. Da bi se taj proces ubrzao, Microsoft je za sve svoje DLL biblioteke odredio vlastite meusobno razliite adrese 15. Implicitno i eksplicitno povezivanje DLL DLL datoteke se mogu eksplicitno uitati za vrijeme izvravanja glavnog programa. Tada se koriste tipino tri sistemske funkcije. Funkcijom LoadLibrary se uita biblioteka u memoriju, funkcijom GetProcAddress se sazna poziciji simbola unutar biblioteke (npr. na ovaj nain mogue je nai poetnu adresu nekog potprograma unutar biblioteke). Na kraju se poziva FreeLibrary za brisanje DLLa iz memorije. Drugi nain je implicitno povezivanje. U samom EXE programu je navedeno koje DLL biblioteke program koristi, koje potprograme iz njih i na kojem mjestu. Tada Windows loader obavi svo potrebno uitavanje biblioteka, pronalaenje pozicija potprograma i popravku izvrnog programa da pozivi potprograma iz dinamiki uitane biblioteke budu usmjereni na pravo mjesto. 16. Kako radi MAKE

Make je program koji posmatra koji su programi potrebni za prevoenje pojedinih datoteka i meuzavisnost datoteka. Ako je neka datoteka sa izvornim promijenjena, njeno sistemsko vrijeme se takoer promijeni. Ako su druge datoteke navedene da zavise od nje, i one se navode da budu prevedene. Ali one koje nisu mijenjane, niti ovise od promijenjenih, nee biti posebno prevedene. Meusobna ovisnost se smjeta u specijalnu datoteku koja se zove "Makefile". Datoteka makefile se sastoji od linija teksta koji definiu datoteke ili imena pravila koja zavise od skupa datoteka. Izlazne datoteke se navedu da ovise od izvornih. Nakon to je navedena lista vrijednosti moe se navesti serija linija uvuena tabovima koja definie kako se izvorna datoteka transformie u izlaznu, ako je izvorna modifikovana kasnije od izlazne. Osnovna struktura izgleda ovako
# komentari iza znaka hash cilj: uslovi komanda 1 komanda 2 . . . komanda n

Datoteka makefile takoer sadri i definicije varijabli i ukljuenje drugih makefile datoteka. Varijable u makefile datoteci se mogu promijeniti ako se programu make proslijede parametri u komandnoj liniji. Na primjer, varijabla CC se koristi za navoenje kompajlera i ovom varijablom se moe navesti alternativni kompajler. 17. Dvoprolazni asembler, princip rada U prvome prolazu asembler pretrauje tabelu simbola za svaki simbol i ako ne postoji ulaz u tabeli za dati simbol, ubacuje ga. U drugome prolazu za svaki se element uzima njegova referenca iz tabele simbola oformljena u prvome prolazu i razrjeava definisana operacija. 18. Jednoprolazni asembler, princip rada Asembliranje se moe obaviti i u jednom prolazu, mada nije najpraktinije. Prilikom prevoenja, svako referenciranje na labelu koja jo nije definisana se smjeta u tablicu popravki. Broja lokacija se uveava I kada se labela zaista definie, tada se njena vrijednost zna. Sada se proe kroz sve popravke, vrati na danu lokaciju generisanog koda na vrijednost koju treba popraviti i upie nova vrijednost labele. Ovakvi asembleri su bri, ali zahtijevaju vie memorije, nepraktini su za eksterne module i ne generiu najkrae instrukcije. Na primjer, JMP instrukcija na Intel x86 procesorima zauzima 2 do 5 bajtova zavisno od krajnje adrese. Jednoprolazni asembler pretpostavlja najgori sluaj, pa uvijek generie petobajtnu varijantu, premda nije neophodno. 19. Razlika izmedu kompajlera i interpretera

Za razliku od kompajlera, interpreteri ne prevode program u klasini mainski kod, nego ga analiziraju I izvravaju odgovarajue potprograme. Tipino treba vie vremena da se izvrava interpretirani program, nego da se izvrava kompajlirani, ali je ukupno vrijeme cijelog ciklusa potrebnog za kompajliranje I izvravanje programa ponekad vee od vremena potrebnog za izvravanja interpreterom. Stoga su interpreteri pogodnija varijanta u razvojnoj fazi programa. Interpretiranje je sporije nego izvravanje kompajliranog programa jer interpreter mora analizirati svaku naredbu u programu pri svakom njenom izvravanju i pokrenuti akciju dok kompajlirani kod samo pokree akciju. Sporiji je i pristup varijablama, jer mapiranje identifikatora s lokacijama se mora stalno raditi u vrijeme izvravanja. Postoje i kompromisne varijante. Neki interpreteri koriste kompaktniji format od ASCII izvornog koda koji se bre analizira. Interpreteri mogu da uvaju program u memoriji ili da ga stalno itaju sa diska, kakav je sluaj sa interpreterima skripti. 20. Uloga sekcije MS DOS header i Real mode program u EXE EXE program u PE formatu poinje istim zaglavljem kao i svaki MSDOS program. Ovo zaglavlje se prepoznaje slovima MZ na svom poetku. Ono pokazuje na izvrni program, koji je tipino izuzetno kratak. Taj program samo ispie poruku "This program cannot be run in DOS mode." i zavri svoje izvrenje. Svrha ovog programa je da eventualni start Windows EXE programa pod operativnim sistemom MS-DOS ne izazove krah. Postoje, meutim i programi koji imaju sloeniji program za izvrenje u DOS reimu rada, na primjer, mogue je spojiti DOS i Windows verziju nekog programa u jedinstveni program. 21. Cemu slue sekcije .text, .data, .rdata i .bss u EXE programu Mainske instrukcije programa smjetene su u sekciju .text. Sekcija .text takoer sadri ulaznu taku u program. U ovoj sekciji se nalazi i tablica uvezenih adresa Import Address Table (IAT) neposredno prije ulazne take. Ova tablica je smjetena u .text sekciju jer je ona serija jump instrukcija, gdje je adresa na koju se skae fiksna. Kada se Windows izvrni program uita u adresni prostor procesa IAT se popravlja s lokacijama fizikih adresa svake uvezene funkcije. Da bi pronaao IAT u .text sekciji, loader prosto locira ulaznu taku programa i zasniva se na injenici da se IAT nalazi odmah prije ulazne take. A poto je svaki element iste veliine, lako je kretati se unazad po ovoj tabeli da se nae njen poetak. Sekcija .bss predstavlja neinicijalizirane podatke, ukljuujui i statike varijable definisane unutar funkcije. Sekcija .rdata predstavlja podatke koji se samo itaju, kao to su tekstualni stringovi, konstante i neke debug informacije. Globalne varijable u programima se smjetaju u sekciju .data. 22. ta je to IAT i gdje se nalazi Pogledati prethodno pitanje!!! 23. Nacin pozivanja Linux sistemskih funkcija iz asemblera

Broj sistemskog poziva se smjeta u EAX. Argumenti se smjetaju u registre redom: EBX, ECX, EDX, ESI, EDI i EBP. Pozove se INT 80h. Rezultat poziva se dobija u EAX 24. Cetiri znacenja pojma Virtuelna maina Izvorno znaenje pojma virtualna maina, ponekad nazvana i hardverska virtualna maina je da se vie identinih izvrnih okruenja nalazi na istom raunaru, a svaka izvrava operativni sistem. To omoguava da aplikacije pisane za jedan operativni sistem rade na maini s drugim operativnim sistemom ili da se naprave kutije koje prave vei nivo izolacije izmeu procesa nego koji se postie kada se izvrava vie procesa pod istom instancom operativnog sistema. Korisnici imaju iluziju da posjeduju cijeli kompjuter, izolovan od drugih korisnika na jednoj privatnoj maini, izolovanoj od ostalih korisnika. Pokretanje virtualne maine je relativno brzo, jer je hardver ve inicijaliziran. Virtualne maine koje oponaaju hardver se rade na vie naina: Emulacija: virtualna maina oponaa kompletan hardver, omoguavajui da se nemodifikovani operativni sistem, za potpuno drugi procesor izvrava. Primjer su programi koji na PC raunarima omoguavaju pokretanje programa za raunare iz osamdesetih (ZX Spectrum, C64, Amstrad CPC, Amiga). Mana emulacije je to je sporija od drugih pristupa. Paravirtualizacija Virtualna maina ne simulira hardver, nego nudi specijalne funkcije koje zahtijevaju modifikaciju operativnog sistema koji se instalira. Primjer je izvravanje MSDOS aplikacija pod Windows operativnim sistemom. Verzija DOS-a koja se isporuuje uz Windows NT bazirane operativne sisteme je unekoliko modifikovana da bi se uklopila u operativni sistem. Prirodna virtualizacija virtualna maina samo parcijalno simulira dovoljno hardvera da se nemodifikovani operativni sistem izvrava u izolaciji, ali operativni sistem mora biti dizajniran za isti tip procesora. Najpoznatiji primjer ovakve maine je VMWare, koji omogu_ava da se istovremeno izvrava vie kopija Windows-a ili drugog operativnog sistema, bez gubitaka na performansama kakve zahtijeva emulacija. Drugo znaenje pojma virtualna maina je softver koji izoluje aplikaciju od raunara. Na ovaj nain se naprave virtualne maine razliitih verzija za pojedine raunare a aplikacije se piu za izvravanje na virtualnoj maini. Zatim se aplikacija izvrava interpreterom ili se prije izvrenja prevodi u mainski kod procesora na kojoj se izvrava. Najpoznatiji primjer je Sun Microsystem's Java Virtual Machine. 25. POSIX funkcija pthread_create Kreiranje niti nije pretjerano komplikovano. Argumenti za pthread_create su: thread je pokaziva na pthread_t tip, u koji pthread_create() smjeta identifikator novokreirane niti; attr je pokaziva na opcionalnu strukturu atributa niti, ili NULL ako se atributi ne navode; start_func je funkcija kojom se pokree nova nit, a arg je argument za tu funkciju.

Vano je rei da start_func mora biti funkcija koja uzima void pointer kao argument i vraa void pointer. Sloeniji tipovi podataka se mogu dobiti zaobilaenjem (type casting). Sve funkcije vraaju 0 ako su uspjeno zavrene. 26. Windows API funkcija CreateThread Win32 API podrava niti, i funkcije za podrku niti pozivaju Win32 direktno ili preko nekog omotaa koji opet poziva Win32. Evo Win32 funkcije koja kreira nit. Ona se zove CreateThread.
HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // pointer na sigurnosne atribute DWORD dwStackSize, // inicialna veli_ina steka za niti LPTHREAD_START_ROUTINE lpStartAddress, // pointer na funkciju niti LPVOID lpParameter, // argument za novu nit DWORD dwCreationFlags, // kreacijski flegovi LPDWORD lpThreadId // pointer da se primi oznaka niti );

27. Windows API funkcija WaitForSingleObject Pod Windowsom, muteks se kreira funkcijom CreateMutex koja ima tri parametra. Prvi parameter predstavlja sigurnosne atribute (koji se tipino postavljaju na NULL), drugi parametar ima vrijednost TRUE ako je muteks inicijalno zakljuan, FALSE ako je otkljuan. Trei parametar moe biti niz znakova koji predstavlja ime muteksa vidljivo izmeu razliitih procesa. Povratna vrijednost funkcije CreateMutex je oznaka muteksa. Ova oznaka se koristi kao prvi parametar u funkcijama WaitForSingleObject i ReleaseMutex. Funkcija WaitForSingleObject dohvata muteks ija je oznaka navedena kao prvi parametar I eka vrijeme navedeno u drugom parametru (moe i beskonano) dok se muteks ne oslobodi funkcijom ReleaseMutex. 28. Prednosti i nedostaci kasne i rane optimizacije Pobornici kasne optimizacije koriste 90/10 argument: 90% izvrenja programa se deava u 10% koda. Ako se pokua optimizovati svaki dio koda koji se pie, tj. optimizovati kod prije nego se uopte zna da je to potrebno, 90% truda je uzaludno. S druge strane, ako se kod pie na normalan nain, pa onda optimizuje, performanse programa se mogu popraviti s manje rada. Znai, uzimati u obzir normalnu brigu o performansama (npr. ako postoji izbor izmeu sporijeg i breg algoritma, odabira se bri), ali ne brinuti o ba svakoj instrukciji. Kada cijeli program radi, uloiti maksimalni trud da se optimizuje tih 10% koda (ako im se udvostrui brzina na 200%, itav program je ubrzan 190%). Ovaj argument je ubjedljiv. Optimizacija je teak i zahtjevan posao. Ponekad se ne zna unaprijed ta je bre, jedini nain je isprobati vie verzija i usporediti ih. Preveliki je posao raditi to na cijelom programu. Ali, limitiranje na 10% koda i optimiziranje njih, smanjuje rad za 90%. Drugi argument je da malo programera unaprijed zna koliko e se vremena provesti u funkcijama. Rjeenje je da se program napravi, proradi, vrijeme izmjeri, i ubrzaju spori dijelovi.

Problem s ovim argumentom je to u stvarnim programima ovih 10% programa to troi 90% vremena se ne nalazi na jednom mjestu u programu . Na jednom se mjestu dobije 1%, na drugom 0.5% , "ogromnih" 2.5% u jednoj funkciji itd. tovie, optimizacija 1% programa zahtijeva da se promijeni neki drugi dio koda. Na primjer, ubrzanje prosljeivanja parametara funkciji, zahtijeva modifikaciju funkcija koje je pozivaju. Efekat je da se mora popraviti mnogo vie od 10% koda da bi se ubrzalo 10% koji uzimaju 90% vremena. Drugi problem s 90/10 pravilom je to se on bazira na procentima, a procenti se mijenjaju pri optimizaciji. Zanemarivi prvi problem, neka je tih 10% koji troe 90% vremena u jednoj funkciji. Za primjer se uzima program ije vrijeme izvrenja iznosi 10000 sekundi i ako se ta funkcija ubrza 2 puta, tri puta ili devet puta , dobijaju se razliiti uinci. Pobornici rane optimizacije uoavaju manu procentualne ocjene i zakljuuju da e se na kraju opet optimizovati veina programa. Zato onda ne uraditi optimizaciju od poetka. Problem sa strategijom kasne optimizacije je to se na kraju doe do duplog dizajna i pisanja programa, prvi put da se dobije funkcionalan program, a drugi put da se dobije brz. Osim toga, iako programeri nisu dobri u odreivanju gdje se najvie vremena provodi, ima nekih oiglednih mjesta gdje e biti problema s performansama. Zato ekati da se otkrije oigledno? Bolje je te probleme rijeiti ranije kako bi se manje vremena provelo u mjerenju I optimizovanju koda. Dalje, u projektu u kome je definirano da se dizajnira savren program bez brige o performansama, programeri e pisati spor kod, jer je tako jednostavnije. Pa i ako je vrijeme tog dijela od 10% programa kasnije ubrzano stotinu puta, onih 90% program e i dalje biti katastrofalno sporo. Mane rane optimizacije su to se moe desiti da program zbog brige o optimizaciji cijelog programa ne bude gotov u predvienom roku, ili da bude toliko neitljiv, pun greaka i teak za odravanje. Optimizacije obino kvare koncept oiglednog koda, i uvode neke greke kojih nema u neoptimizovanom programu. Pogrean program je gori od sporog programa, pa je ovo glavni argument protiv rane optimizacije. 29. Cetiri tehnike traenja sporog koda u programu Postoje etiri tehnike: Metoda uzaludnih pokuaja, Optimizacija svega, Analiza programa i upotreba profajlera i drugih mjera_a performansi. Nakon uoavanja dijela, programer moe analizirati tu sekciju. Metoda uzaludnih pokuaja je, naalost, najea strategija. Programer ubrzava razliite dijelove programa, pravei procjene gdje program provodi najvie vremena. Ako je programer pravilno pogodio, program e se izvravati znatno bre nakon optimizacije. Iskusni programeri esto koriste ovu tehniku da brzo lociraju i optimiziraju program. Naalost, veina programera pravi pogrene procjene i zavrava u optimizaciji pogrenih dijelova programa. Ovakav trud postaje uzaludan, jer optimizacija pogrenih 10% nee poboljati performanse. Jedan od glavnih razloga zato ova tehnika pada je to je ona prvi izbor neiskusnih programera koji ne mogu lako prepoznati spor kod. Naalost, oni vjerovatno ne znaju za druge tehnike, pa umjesto pokuaja sistematskog pristupa, prave nedefinirane pokuaje.

Drugi pristup ubrzanju sporog dijela programa je optimizacija svega. Naravno, ova tehnika je neupotrebljiva za velike programe, ali za krae dijelove ona radi razumno dobro. S ovom metodom se tedi na vremenu mjerenja performansi, jer je spori dio kod popravljen optimizacijom okoline. Metoda analize je najtea od ova etiri. S ovom metodom se analizira program i odredi gdje e on provesti veinu svog vremena na bazi podataka koji se oekuju da budu obraeni. U teoriji ovo je najbolja tehnika. U praksi, ljudi ne vole ovakav rad, ili nemaju dovoljno iskustva. Svejedno, ovo je tehnika koja se treba prva koristiti. Na primjer, veina programa najvie vremena izvode u tijelu petlje ili rekurzivnog poziva. Stoga, treba locirati sve rekurzivne pozive i tijela petlji (naro_ito ugnije_enih). Velike su anse da e program provesti najvie vremena u tim podrujima. Premda analitika metoda daje dobar nain za lokaciju sporog koda u programu, analiza programa je spor i dosadan proces. Lako je propustiti najsporiji dio programa, pogotovo kada ima rekurzivnih poziva funkcije. Mogu se propustiti i ugnijeene petlje. Na primjer ako se unutar funkcije nalazi jednostruka petlja, moda je ta funkcija pozivana iz tijela neke druge petlje, ime petlja postaje implicitno ugnijeena.. Proces analize se moe automatizovati. To rade programi koji se zovu profajleri. Profajler je mali program koji mjeri koliki dio koda se provodi u nekom dijelu programa. To se tipino radi prekidanjem programa u pravilnim intervalima i itanjem povratne adrese. Iz liste povratnih adresa se sazna koliko je vremena program proveo u kojoj rutini. 30. Cemu slue i koji su problemi s benchmark programima Benchmark programi su programi koji mjere vrijeme potrebno da se izvri neka aktivnost. Ovakvi benchmark programi ponekad tjeraju projektante kompajlera i mikroprocesora da ubrzavaju generisani kod da bre izvrava benchmark programe ak i ako se drugi programi izvravaju sporo. Stoga su esto benchmark programi gubili smisao. Zato su esti su i klasi_ni programi u upotrebi za benchmarke. Na primjer, esto se koristi igra Quake da se vidi koliko ekrana u sekundi moe da iscrta ili koliko je potrebno u programu MS Word vremena da se zamijeni rije u dugakom tekstu. 31. Tehnike optimizacije izlaza iz kompajlera Generisani mainski ili asemblerski kod koji proizvode kompajleri se veoma esto optimizuje. Optimizacija izlaza iz kompajlera je usmjerena na to da generisani program bude to krai, to bri ili po mogunosti oboje. Postoji vie naina optimizacije, zavisno od faze kompajliranja u kojoj se koristi. Registarska alokacija pretpostavlja da se neke varijable uvaju u registrima umjesto u memorijskim lokacijama. Tipini kandidati su cjelobrojne lokalne varijable koje se unutar funkcije najee koriste, a nad kojim se ne koristi operator adrese. Jezik C ima i kljunu rije register kojom se kompajleru preporuuje da navedene varijable dri u registrima. Eliminacija mrtvog koda prosto preskae dio programa koji ne obavlja nikakvu funkciju. Na primjer u rutini
void proba() { int a=2,i;

for (i=1;i<20;i++) a=a*a; }

vrijednost varijabli koje mijenja petlja (a,i) se uopte ne koristi, tako da ova petlja nee uticati na izvrenje programa ak i ako se potpuno ukloni. Ova vrsta optimizacije zahtijeva praenje meuzavisnosti dijelova programa, to topoloki predstavlja graf. Odmotavanje petlji je jedna od optimizacija koje poveavaju brzinu ali i veliinu koda. Npr, petlja for (i=1;i<3;i++) a++ se prevodi kao tri puta ponovljena instrukcija INC [lokacijavarijablea], jer je to bre nego da se uveava i provjerava broja. Peephole optimizacija je najei nain optimiziranja izlaznog koda. Prilikom generisanja koda posmatra se okolina mainske instrukcije koja se treba generisati i dobijena grupacija instrukcija se zamijeni jednostavnijom ili brom. Bulova optimizacija pri raunanju logikih izraza sa operatorima (u C-u && i ||) se bazira na prekidu raunanja izraza ako je ve iz prvog dijela rezulta jasan. Npr a=(b==1) && (c==1). Ukoliko je b bilo razliito od 1, rezultat izraza e biti 0, bez obzira na vrijednost varijable c. Stoga se taj dio rauna moe preskoiti. Optimizacija duplih stringova. Ako se u programu dva ili vie puta spominje isti niz znakova (npr u dijelu programa: if (dos) puts(Hello!) else messageBox(0,Hello!,Hello!,1); poruka Hello se ponavlja tri puta, pa je dovoljno smjestiti je u memoriju na samo jedno mjesto. 32. Uloga tabela komande i akcije u verziji FILDZAN 32 s optimizacijom Asemblerske instrukcije koje FILDZAN 32 kompajler generie navedene su u tabeli komande. Ako neka od ovih instrukcija sadri promjenjivi tekst (npr. numeriki parametar ili ime labele) njegovo mjesto je oznaeno sa %s ili %d, to se lako parsira funkcijom sscanf. Ovi promjenjivi tekstovi smjetaju se u tabelu parametri i cjelobrojnu varijablu t. Tabela akcije oznaava ta se treba promijeniti. Ova tabela sadri naizmjenino zakodirane traene I zamjenjujue sekvence. Broj 99 predstavlja kraj pojedine sekvence. U svakoj sekvenci se u najnioj cifri kodira nain pamenja parametra, dok vie cifre predstavljaju redni broj u tabeli komande.

You might also like