konstrukcija asemblera

Upload: danilo-vidovic

Post on 09-Oct-2015

141 views

Category:

Documents


3 download

DESCRIPTION

sistemsko programiranje

TRANSCRIPT

  • *Konstrukcija asemblera

  • *Ulaz i izlaz asembleraAsemblermyprog.smyprog.o Asembler (as), prevodi main.s u relokativni objektni fajl main.o:as [other arguments] -o myprog.o myprog.s

  • emu slui objektni fajl?

    da se program moe pisati u odvojenim celinama modulimada se u programu mogu koristiti biblioteke gotovih, prevedenih modulada se program moe uitati na lokaciji koja se odreuje neposredno pre izvravanja (zbog postojanja operativnog sistema i drugih programa u izvravanju).

    *

  • ta sadri objektni program?Objektni program sadri sledee vrste informacija: Zaglavlje: opte informacije o fajlu, kao to je veliina koda, ime izvornog fajla od koga je nastao prevoenjem, datum kreiranja itd. Mainski kod: Binarne instrukcije i podaci generisani kompajlerom ili asemblerom. Relokacione informacije: Lista mesta u objektnom kodu koja treba da se auriraju kada linker menja adrese objektnog koda. Simboli: Lista globalnih simbola definisanih u posmatranom modulu, simboli koji treba da se uvezu iz drugih modula ili oni koje je definisao linker. Informacije za debagovanje: Ostale informacije o objektnom kodu koje nisu potrebne linkeru ali jesu debageru. To ukljuuje informacije o izvornom fajlu i brojevima linija izvornog koda, lokalne simbole, opise sruktura podataka koje koristi objektni kod, kao to su, na primer, definicije struktura u Cu.*

  • Vrste objektnih fajlovaObjektni fajlovi javljaju se u tri oblika:Relokativni objektni fajl. Sadri binarni kod i podatke u obliku koji se moe kombinovati sa drugim relokativnim objektnim fajlovima u procesu povezivanja da bi se stvorio izvrni objektni fajl (skraeno izvrni fajl). .o na Linuxu, .obj na WindowsuIzvrni objektni fajl. Sadri binarni kod i podatke u obliku koji se moe direktno kopirati u memoriju i izvravati.Bez ekstenzije na Linuxu, .exe na WindowsuDeljeni objektni fajl.Poseban tip relokativnog objektnog fajla koji se moe uitati u memoriju i povezati dinamiki, u vreme punjenja ili u vreme izvravanja..so na Linuxu, .dll na WindowsuKompajleri i asembleri generiu relokativne objektne fajlove (ukljuujui deljene objekata fajlova). Linkeri generiu izvrne objektne fajlove, kao i deljene.

    *

  • Standardni objektni formatiU dananje vreme, najvaniji standardi za objektne formate su:Portable Executable (PE) (na Microsoft Windows-u). PE je baziran na Common Object File Formatu (COFF) koji se koristio na Unix-u pre ELF, a jo se koristi u nekim embedded sistemima.Executable and Linkable Format (ELF) (na Linux-u i drugim verzijama Unix-a) iMach-O (on Mac OS X). *

  • *Opti format ELF fajlovaELF je Unix format za objektne i izvrne fajloveIzlaz iz asembleraUlaz i izlaz linkeraOpciono za .o fajloveOpciono za izvrne fajlove

  • Opti format ELF fajlovaELF zaglavlje poinje 16-bajtnim nizom koji opisuje veliinu mem. rei i redosled bajtova u rei sistema koji je generisao fajl. Ostatak ELF zaglavlja sadri informacije koje omoguavaju linkeru i puniocu da analiziraju i tumae sadraj fajla.Ovo ukljuuje veliinu ELF zaglavlja, tip objektnog fajla (relokativni, izvrni, odnosno deljeni), tip maine (npr. IA32), poziciju u fajlu tabele sa zaglavljima sekcija i veliinu zapisa i njihov broj u toj tabeli. Tabela programskih zaglavlja od znaaja je samo za izvrne programe i deljene objekte i sadri opise segmenata kada se program uita u memoriju za izvravanje (nema u izlazu asemblera).Lokacije i veliine razliitih sekcija su opisane u tabeli zaglavlja sekcija, koji sadri zapis za svaku sekciju u objektnom fajlu.Izmeu ELF zaglavlja i tabele sa zaglavljima sekcija su smetene same sekcije.Sadraj ELF fajla moe se pogledati programima objdump ili readelf*

  • Relokativni objektni fajl po ELF formatu* Izlaz iz asemblera, ulaz u linker

  • Relokativni objektni fajl po ELF formatuTipian ELF relokativni objektni fajl sadri sledee sekcije:.text: Binarni mainski kod programa..rodata: Podaci samo za itanje, npr. format stringovi u printf.data: inicijalizovane globalne C promenljive (definisane izvan funkcija). Lokalne C promenljive (unutar funkcija) se pamte na steku u vreme izvravanja, pa se ne pojavljuju ni u .data ni u .bss sekciji..bss: neinicijalizovane globalne C promenljive. Ova sekcija ne zauzima nikakav prostor u objektnom fajlu.*

  • Relokativni objektni fajl po ELF formatu.symtab: tabela simbola sa informacijama o funkcijama i globalnim promenljivim koje su definisane ili referencirane u programu. Ovaj sadraj postoji ak i kada se program ne prevodi sa g opcijom (ukljuivanje debug informacija u objektni fajl). Jedino se u njoj ne pojavljuju lokalni simboli funkcija.Panja: U Cu postoje globalni simboli sa spoljnim (globalnim) povezivanjem (gsim1) i globalni simboli sa internim (lokalnim) povezivanjem (gsim2) i lokalni simboli (lsim).

    *int gsim1;static float gsim2=0.0;main() {char lsim;}

  • Struktura ulaza .symtab sekcijeABS je za apsolutne simbole kojima ne treba relokacija. UNDEF je za nedefinisane (korieni u ovom modulu, definisani u nekom drugom). COMMON je za neinicijalizovane podatke koji jo nisu alocirani.

    *

  • Primer ELF tabele simbola$ gcc c lekcija.c o lekcija.o$ readelf --symbols lekcija.o

    Symbol table '.symtab' contains 11 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 00000000 0 FILE LOCAL DEFAULT ABS lekcija.c 2: 00000000 0 SECTION LOCAL DEFAULT 1 (.text) 3: 00000000 0 SECTION LOCAL DEFAULT 2 (.data) 4: 00000000 0 SECTION LOCAL DEFAULT 3 (.bss) 5: 00000000 4 OBJECT LOCAL DEFAULT 3 gsim2 6: 00000000 0 SECTION LOCAL DEFAULT 5 7: 00000000 0 SECTION LOCAL DEFAULT 6 8: 00000000 0 SECTION LOCAL DEFAULT 4 9: 00000004 4 OBJECT GLOBAL DEFAULT COM gsim1 10: 00000000 5 FUNC GLOBAL DEFAULT 1 main*int gsim1;static float gsim2=0.0;main() {char lsim;}

  • Relokativni objektni fajl po ELF formatu.rel.text: relokacione informacije za .text sekciju. To je spisak lokacija koje e morati da se menjaju kada linker bude spojio ovaj objektni fajl sa drugima. U principu, svaka instrukcija koja poziva eksternu funkciju ili referie globalnu promenljivu e morati da se menja. Relokacione informacije nisu neophodne u izvrnim fajlovima i obino se izostavljaju ukoliko korisnik izriito ne naloi linkeru da ih ukljui..rel.data: Relokacione informacije za .data sekciju. U principu, svaki inicijalizovana globalna promenljiva ija je poetna vrednost adresa neke globalne promenljive ili eksterno definisane funkcije e morati da se menja.*

  • Relokativni objektni fajl po ELF formatu.debug: tabela simbola za debagovanje sa stavkama za lokalne promenljive i typedef-ove definisanih programa, globalne promenljive definisane i navedene u programu, kao i ime originalnog C izvornog fajla. Ova sekcija je prisutna samo ako se program prevodi sa -g opcijom..line: mapiranje izmeu brojeva linija u izvornom programu i mainskog koda u .text sekciji. Prisutno samo ako se prevodi sa g opcijom..strtab: tabela stringova za tabele simbola u .symtab i .debug sekcijama i za imena sekcija u zaglavljima sekcija. Radi se o sekvenci stringova terminisanih null .*

  • *Glavne funkcije asembleraPrevoenje instrukcija iz simbolikog oblika (asemblera) u binarni mainski kod

    Obrada referenci u instrukciji na druge instrukcije i podatke:Skokovi na druge lokacije u kodu Pristup globalnim promenljivama preko simbolikih imena dodeljenih njihovim memorijskim lokacijamaPozivanje i povratak iz funkcija definisanim na drugim mestima u kodumain: push ebp mov ebp, esp call getchar cmp eax, 'A' jne skip push offset msg call printf add esp, 4skip: mov eax, 0 mov esp, ebp pop ebp ret

  • *Prevoenje instrukcijaPrimer IA-32 mainskog jezika (80386+)Teko je generalizovati IA-32 format instrukcijeIma puno izuzetaka u odnosu na opte pravilo kodiranja instrukcijaNaveemo neto to se smatra kao opte pravilo kodiranja IA-32 instrukcije i ilustrovati sa dva konkretna primera

  • *Opti format IA-32 instrukcijeInstructionprefixesOpcodeModR/MSIBDisplacementImmediateUp to 4 prefixes of 1 byte each(optional)1, 2, or 3 byte opcode1 byte(if required)1 byte(if required)0, 1, 2, or 4 bytes0, 1, 2, or 4 bytesModReg/ OpcodeR/M7 6 5 3 2 0ScaleIndexBase7 6 5 3 2 0Opcioni instrukcijski prefiksPrefiks ponavljanja string instrukcje, prefiks veliine operanda

  • *Opti format IA-32 instrukcijeInstructionprefixesOpcodeModR/MSIBDisplacementImmediateUp to 4 prefixes of 1 byte each(optional)1, 2, or 3 byte opcode1 byte(if required)1 byte(if required)0, 1, 2, or 4 bytes0, 1, 2, or 4 bytesModReg/ OpcodeR/M7 6 5 3 2 0ScaleIndexBase7 6 5 3 2 0Operacioni kodOdreuje koja operacija treb da se izvriNpr. add, move, call, ....

  • *Opti format IA-32 instrukcijeInstructionprefixesOpcodeModR/MSIBDisplacementImmediateUp to 4 prefixes of 1 byte each(optional)1, 2, or 3 byte opcode1 byte(if required)1 byte(if required)0, 1, 2, or 4 bytes0, 1, 2, or 4 bytesModReg/ OpcodeR/M7 6 5 3 2 0ScaleIndexBase7 6 5 3 2 0ModR/MOdreuje vrste operanada (neposredni, registarski, memorijski)Odreuje veliine operanada (byte, word, long)Ponekad oznaava oredeni registar: 000 = EAX/AL; 011 = EBX/BL; 001 = ECX/CL; 010 = EDX/DL; 110 = ESI/DH; 111 = EDI/BH; 101 = EBP/CH; 110 = ESP/AH Ponekad sadri dodatak operacionom kodu

  • *Opti format IA-32 instrukcijeInstructionprefixesOpcodeModR/MSIBDisplacementImmediateUp to 4 prefixes of 1 byte each(optional)1, 2, or 3 byte opcode1 byte(if required)1 byte(if required)0, 1, 2, or 4 bytes0, 1, 2, or 4 bytesModReg/ OpcodeR/M7 6 5 3 2 0ScaleIndexBase7 6 5 3 2 0SIBKoristi se kada je jedan od operanadai koristi faktor skaliranja, indeksni registar, i/ili bazni registar

  • *Opti format IA-32 instrukcijeInstructionprefixesOpcodeModR/MSIBDisplacementImmediateUp to 4 prefixes of 1 byte each(optional)1, 2, or 3 byte opcode1 byte(if required)1 byte(if required)0, 1, 2, or 4 bytes0, 1, 2, or 4 bytesModReg/ OpcodeR/M7 6 5 3 2 0ScaleIndexBase7 6 5 3 2 0OfsetKoristi se u instrukcijama jump i callOznaava Ofset izmeu odredita skoka i instrukcije koja sledi jump/call[adr odredine instr] [adr instr koja sledi jump/call]Koristi little-endian redosled

  • *Opti format IA-32 instrukcijeInstructionprefixesOpcodeModR/MSIBDisplacementImmediateUp to 4 prefixes of 1 byte each(optional)1, 2, or 3 byte opcode1 byte(if required)1 byte(if required)0, 1, 2, or 4 bytes0, 1, 2, or 4 bytesModReg/ OpcodeR/M7 6 5 3 2 0ScaleIndexBase7 6 5 3 2 0Neposredna vrednostSpecifikuje neposredan operandKoristi se little-endian redosled

  • *Primer: Potiskivanje na Stek Asemblerska oznaka push edxMainski kod:IA32 ima posedne opkodove za svaki registarski operand50: push eax51: push ecx52: push edxRezultuje jednobajtnom instrukcijomPrimetimo da ponekad jedan asemblerski mnemonik moe da se mapira na grupu razliitih opkodova (malo komplikuje konstrukciju asemblera)0101 0010

  • *Drugi primer: Load Effective AddressAsemblerska oznaka: lea eax, [eax+eax*4]

    Mainski kod:

    1. bajt: 8D (opkod za load effective address)

    2. bajt: 04 (odredite eax, sa SIB bajtom)

    3. bajt: 80 (scale=4, index=eax, base=eax)1000 11010000 01001000 0000U registar eax ide vrednost izraza eax + 4 * eax

  • *Reference na druge instrukcije/podatkeMnoge instrukcije mogu se prevesti izolovano od drugihpush edxlea eax, [eax+eax*4]mov eax, 0add ecx, ebxAli, neke se referiu na druge delove programa ili podatkejne skippush offset msgcall printfPotrebno je razreiti (odrediti vrednost) ovih referenci da bi se generisao mainski kod

  • *Problem referisanja unapredProblem

    U trenutku kada asembler treba da generie mainski kod za jmp myLabela, nije jo obradio definiciju simbola myLabelaInstrukcija skoka sadri referencu unapred na myLabela

    Reenje ovog problema je da asembler napravi dva sekvencijalna prolaza kroz programski kod: u prvom prolazu gleda definicije simbola, a u drugom prolazu (kada poznaje vrednost myLabela) izvri generisanje mainskog koda jmp myLabela myLabela: Simbol myLabela se koristi pre definisanja

  • *Konstrukcija dvoprolaznog asembleraPrvi prolazAsembler prolazi kroz asemblerski kod programa da napravi:Tabelu simbolaKlju: naziv simbolaOstali atributi simbolaTip Labele, u kojoj sekciji, koji pomeraj unutar sekcije, Drugi prolazAsembler prolazi kroz asemblerski kod ponovo da napravi:RODATA sekcijuDATA sekcijuBSS sekcijuTEXT sekcijuSekciju relokacionih zapisaSvaki relokacioni zapis oznaava deo koda koji linker mora da zakrpiKreira objektni fajl

  • *Primer asemblerske obrade Programski primer

    C ekvivalent:

    Razmotriemo obradu ovog programa od strane asemblera .section ".rodata"msg: .asciz "Hi\n" .section ".text" .globl mainmain: push ebp mov ebp, esp call getchar cmp eax, 'A' jne skip push offset msg call printf add esp, 4skip: mov eax, 0 mov esp, ebp pop ebp ret#include int main(void) { if (getchar() == 'A') printf("Hi\n"); return 0;}

  • *Strukture podataka asemblera (1)Tabela simbola

    Relokacioni zapisi

    RODATA Sekcija (location counter: 0)

    TEXT Sekcija (location counter: 0)Nema DATA ni BSS sekcija u primeruInicijalno sve sekcije su prazne

    LabelaSekcijaOfsetLokal?R.Br

    SekcijaOfsetTip relokacijeR.Br

    OfsetSadrajObjanjenje

    OfsetSadrajObjanjenje

  • .section ".rodata"msg: .asciz "Hi\n" .section ".text" .globl mainmain: push ebp mov ebp, esp call getchar cmp eax, 'A' jne skip push offset msg call printf add esp, 4skip: mov eax, 0 mov esp, ebp pop ebp ret*Prvi prolaz asembleraAsembler ubacuje msg u tabelu simbolaAsembler evidentira da je tekua sekcija RODATA

  • *Strukture podataka asemblera (2)Tabela simbola

    Relokacioni zapisi(bez promene)RODATA sekcija (location counter: 0)(bez promene)TEXT sekcija (location counter: 0)(bez promene)msg je lokacija u RODATA sekciji sa pomerajem 0msg je lokalna labelaRedni broj msg je 0

    LabelaSekcijaOfsetLokal?R.BrmsgRODATA0local0

  • .section ".rodata"msg: .asciz "Hi\n" .section ".text" .globl mainmain: push ebp mov ebp, esp call getchar cmp eax, 'A' jne skip push offset msg call printf add esp, 4skip: mov eax, 0 mov esp, ebp pop ebp ret*Prvi prolaz asemblera (nastavak)Asembler uveava location counter RODATA sekcije za 4(broj bajtova u stringu)

  • *Strukture podataka asemblera (3)Tabela simbola

    Relokacioni zapisi(bez promene)RODATA sekcija (location counter: 4)(bez promene)TEXT sekcija (location counter: 0)(bez promene)RODATA location counter sada iznosi 4Da je bila jo neka labela u ovoj taki programa, oznaavala bi adresu u RODATA sekciji sa pomerajem 4

    LabelaSekcijaOfsetLokal?R.BrmsgRODATA0local0

  • .section ".rodata"msg: .asciz "Hi\n" .section ".text" .globl mainmain: push ebp mov ebp, esp call getchar cmp eax, 'A' jne skip push offset msg call printf add esp, 4skip: mov eax, 0 mov esp, ebp pop ebp ret*Prvi prolaz asemblera (nastavak)Asembler evidentira daje tekua sekcija TEXTAsembler ne radi nitau prvom prolazuAsembler ubacuje simbol main u tabelu simbola

  • *Strukture podataka asemblera (4)Tabela simbola

    Relokacioni zapisi(bez promene)RODATA sekcija (location counter: 4)(bez promene)TEXT sekcija (location counter: 0)(bez promene)main oznaava adresu u TEXT sekciji sa pomerajem 0main je lokalna labela (asembler e to aurirati tek u 2. prolazu)main ima redni broj 1

    LabelaSekcijaOfsetLokal?R.BrmsgRODATA0local0mainTEXT0local1

  • .section ".rodata"msg: .asciz "Hi\n" .section ".text" .globl mainmain: push ebp mov ebp, esp call getchar cmp eax, 'A' jne skip push offset msg call printf add esp, 4skip: mov eax, 0 mov esp, ebp pop ebp ret*Prvi prolaz asemblera (nastavak)Asembler uveavabroja lokacija TEXT sekcije duinom svake instrukcije(van toga ne obrauje instrukcije)

  • *Strukture podataka asemblera (5)Tabela simbola

    Relokacioni zapisi(bez promene)RODATA sekcija (location counter: 4)(bez promene)TEXT sekcija (location counter: 26)(bez promene)TEXT location counter sada iznosi 26

    LabelaSekcijaOfsetLokal?R.BrmsgRODATA0local0mainTEXT0local1

  • .section ".rodata"msg: .asciz "Hi\n" .section ".text" .globl mainmain: push ebp mov ebp, esp call getchar cmp eax, 'A' jne skip push offset msg call printf add esp, 4skip: mov eax, 0 mov esp, ebp pop ebp ret*Prvi prolaz asemblera (nastavak)Asembler ubacuje skipu tabelu simbola

  • *Strukture podataka asemblera (6)Tabela simbola

    Relokacioni zapisi(bez promene)RODATA sekcija (location counter: 4)(bez promene)TEXT sekcija (location counter: 26)(bez promene)skip oznaava lokaciju u TEXT sekciji sa pomerajem 26skip je lokalna labelaskip ima redni broj 2

    LabelaSekcijaOfsetLokal?R.BrmsgRODATA0local0mainTEXT0local1skipTEXT26local2

  • .section ".rodata"msg: .asciz "Hi\n" .section ".text" .globl mainmain: push ebp mov ebp, esp call getchar cmp eax, 'A' jne skip push offset msg call printf add esp, 4skip: mov eax, 0 mov esp, ebp pop ebp ret*Prvi prolaz asemblera (nastavak)Asembler uveavabroja lokacija TEXT sekcije duinom svake instrukcije

  • *Strukture podataka asemblera (7)Tabela simbola

    Relokacioni zapisi(bez promene)RODATA sekcija (location counter: 4)(bez promene)TEXT sekcija (location counter: 35)(bez promene)TEXT location counter sada iznosi 35

    LabelaSekcijaOfsetLokal?R.BrmsgRODATA0local0mainTEXT0local1skipTEXT26local2

  • *Kraj prvog prolaza asm, poinje drugi

    Kraj prvog prolazaAssembler je (delimino) kreirao tabelu simbolaAsembler sada zna vrednosti svakog lokalno definisanog simbola

    Poetak drugog prolazaAsembler postavlja na 0 sve brojae lokacija svih sekcija

  • *Strukture podataka asemblera (8)Tabela simbola

    Relokacioni zapisi(bez promene)RODATA sekcija (location counter: 0)(bez promene)TEXT sekcija (location counter: 0)(bez promene)Brojai lokacija postavljeni na 0

    LabelaSekcijaOfsetLokal?R.BrmsgRODATA0local0mainTEXT0local1skipTEXT26local2

  • .section ".rodata"msg: .asciz "Hi\n" .section ".text" .globl mainmain: push ebp mov ebp, esp call getchar cmp eax, 'A' jne skip push offset msg call printf add esp, 4skip: mov eax, 0 mov esp, ebp pop ebp ret*Drugi prolaz asembleraAsembler ne radi nitaAsembler evidentira da je tekua sekcija RODATAAsembler generie bajtove u RODATA sekciji i uveava location counter

  • *Strukture podataka asemblera (9)Tabela simbola(bez promene)Relokacioni zapisi(bez promene)RODATA sekcija (location counter: 4)

    TEXT sekcija (location counter: 0)(bez promene)Location counter uvean za 4RODATA sekcija sadri bajtove datog stringa

    OfsetSadraj (hex)Objanjenje048ASCII kod za H169ASCII kod za i20AASCII kod za \n300ASCII kod za null znak

  • .section ".rodata"msg: .asciz "Hi\n" .section ".text" .globl mainmain: push ebp mov ebp, esp call getchar cmp eax, 'A' jne skip push offset msg call printf add esp, 4skip: mov eax, 0 mov esp, ebp pop ebp ret*Drugi prolaz asemblera (nastavak)Asembler aurira atributLokal? za main u tabelisimbolaAsembler evidentira da je tekua sekcija TEXT

  • *Strukture podataka asemblera (10)Tabela simbola

    Relokacioni zapisi(bez promene)RODATA sekcija (location counter: 4)(bez promene)TEXT sekcija (location counter: 0)(bez promene)main je globalni simbol

    LabelaSekcijaOfsetLokal?R.BrmsgRODATA0local0mainTEXT0global1skipTEXT26local2

  • .section ".rodata"msg: .asciz "Hi\n" .section ".text" .globl mainmain: push ebp mov ebp, esp call getchar cmp eax, 'A' jne skip push offset msg call printf add esp, 4skip: mov eax, 0 mov esp, ebp pop ebp ret*Drugi prolaz asemblera (nastavak)Asembler ne radinitaAsembler generiemainski kod utekuoj (TEXT) sekciji

  • *Strukture podataka asemblera (11)Tabela simbola(bez promene)Relokacioni zapisi(bez promene)RODATA sekcija (location counter: 4)(bez promene)TEXT sekcija (location counter: 1)

    OfsetSadraj Objanjenje055push ebp 01010101 Mainski kod push ebp instrukcije

  • .section ".rodata"msg: .asciz "Hi\n" .section ".text" .globl mainmain: push ebp mov ebp, esp call getchar cmp eax, 'A' jne skip push offset msg call printf add esp, 4skip: mov eax, 0 mov esp, ebp pop ebp ret*Drugi prolaz asemblera (nastavak)Assembler generatesmainski kodcode u tekuoj(TEXT) Sekcija

  • *Strukture podataka asemblera (12)Tabela simbola(bez promene)Relokacioni zapisi(bez promene)RODATA sekcija (location counter: 4)(bez promene)TEXT sekcija (location counter: 3)

    OfsetSadrajObjanjenje1-289 E5mov ebp,esp 10001001 11 100 101 Ovo je mov instrukcija iji izvorini operand je registar Polje M oznaava registar Izvorini registar je ESP Oredini registar je EBP

  • .section ".rodata"msg: .asciz "Hi\n" .section ".text" .globl mainmain: push ebp mov ebp, esp call getchar cmp eax, 'A' jne skip push offset msg call printf add esp, 4skip: mov eax, 0 mov esp, ebp pop ebp ret*Drugi prolaz asemblera (nastavak)Asembler generiemainski kodu tekuoj(TEXT) sekciji

  • *Strukture podataka asemblera (12)Tabela simbola(bez promene)Relokacioni zapisi(bez promene)RODATA sekcija (location counter: 4)(bez promene)TEXT sekcija (location counter: 8)

    Asembler gleda u tabelu simbola da nae ofset getchar-agetchar nije u tabeli simbolaAsembler ne moe da izrauna pomeraj koji treba smestiti na ofsetu 4 TEXT sekcije

    OfsetSadrajObjanjenje3-7E8 ????????call getchar 11101000 ???????????????????????????????? Ovo je call instrukcija sa 4-bajtnim displacement operandom (relativna adresa skoka)

  • *Strukture podataka asemblera (13)Tabela simbola

    Relokacioni zapisi(bez promene)RODATA sekcija (location counter: 4)(bez promene)TEXT sekcija (location counter: 8)(bez promene)

    Asembler dodaje getchar u tabelu simbolaPotom

    LabelaSekcijaOfsetLokal?R.BrmsgRODATA0local0mainTEXT0global1skipTEXT26local2getchar??global3

  • *Strukture podataka asemblera (14)Tabela simbola(bez promene)Relokacioni zapisi

    RODATA sekcija (location counter: 4)(bez promene)TEXT sekcija (location counter: 8)(bez promene)

    Asembler generie relokacioni zapis, ime nalae linkeru da zakrpi kodLinkeru se nalae da izmeni sadraj TEXT sekcije na ofsetu 4. Radi se o PC relativnoj 32 bitnoj adresi simbolarednog broja 3 (getchar).

    SekcijaOfsetTip relokacijeR.BrTEXT4R_386_PC323

  • .section ".rodata"msg: .asciz "Hi\n" .section ".text" .globl mainmain: push ebp mov ebp, esp call getchar cmp eax, 'A' jne skip push offset msg call printf add esp, 4skip: mov eax, 0 mov esp, ebp pop ebp ret*Drugi prolaz asemblera (nastavak)Asembler generiemainski kod u tekuoj(TEXT) sekciji

  • *Strukture podataka asemblera (15)Tabela simbola(bez promene)Relokacioni zapisi(bez promene)RODATA sekcija (location counter: 4)(bez promene)TEXT sekcija (location counter: 11)

    OfsetSadrajObjanjenje8-1083 F8 41cmp eax, 'A' 10000011 11 111 000 01000001 Instrukcija ima jednobajtni neposredni operand Polje M oznaava registar Radi se o cmp instrukciji Odredini registar je EAX Neposredni operand je A

  • .section ".rodata"msg: .asciz "Hi\n" .section ".text" .globl mainmain: push ebp mov ebp, esp call getchar cmp eax, 'A' jne skip push offset msg call printf add esp, 4skip: mov eax, 0 mov esp, ebp pop ebp ret*Drugi prolaz asemblera (nastavak)Asembler generiemainski kodu tekuoj(TEXT) sekciji

  • *Strukture podataka asemblera (16)Tabela simbola(bez promene)Relokacioni zapisi(bez promene)RODATA sekcija (location counter: 4)(bez promene)TEXT sekcija (location counter: 13)

    Asembler gleda u tabelu simbola da nae ofset skip (26)Asembler oduzima ofset sledee instrukcije (13)Rezultujui pomeraj je 13

    OfsetSadrajObjanjenje11-1275 0Djne skip 01110101 00001101 Ovo je jne instrukcija koja ima 1 bajtni operand Pomeraj izmeu odredine instrukcije i sledee instrukcije je 13

  • .section ".rodata"msg: .asciz "Hi\n" .section ".text" .globl mainmain: push ebp mov ebp, esp call getchar cmp eax, 'A' jne skip push offset msg call printf add esp, 4skip: mov eax, 0 mov esp, ebp pop ebp ret*Drugi prolaz asemblera (nastavak)Asembler generiemainski kodu tekuoj(TEXT) sekciji

  • *Strukture podataka asemblera (16)Tabela simbola(bez promene)Relokacioni zapisi(bez promene)RODATA sekcija (location counter: 4)(bez promene)TEXT sekcija (location counter: 18)

    Asembler zna ofset za msg (0) u okviru RODATA sekcijeAli ne zna lokaciju RODATA sekcije, tako da ne zna flat adresu za msgPotom

    OfsetSadrajObjanjenje13-1768 ????????push offset msg 001101000 ???????????????????????????????? Ovo je push instrukcija sa 4 bajtnim immediate operandom podatak koji treba da ide na stek

  • *Strukture podataka asemblera (17)Tabela simbola(bez promene)Relokacioni zapisi

    RODATA sekcija (location counter: 4)(bez promene)TEXT sekcija (location counter: 18)(bez promene)

    Asembler generie relokacioni zapis, nalaui linkeru da popravi kodLinker treba da popravi TEXT sekciju na ofsetu 14. Radu se o apsolutnoj 32bitnoj adresi simbola rednog broja 0 (msg).

    SekcijaOfsetTip relokacijeR.BrTEXT14R_386_320

  • .section ".rodata"msg: .asciz "Hi\n" .section ".text" .globl mainmain: push ebp mov ebp, esp call getchar cmp eax, 'A' jne skip push offset msg call printf add esp, 4skip: mov eax, 0 mov esp, ebp pop ebp ret*Drugi prolaz asemblera (nastavak)Asembler generiemainski kodu tekuoj (TEXT) sekciji

  • *Strukture podataka asemblera (18)Tabela simbola(bez promene)Relokacioni zapisi(bez promene)RODATA sekcija (location counter: 4)(bez promene)TEXT sekcija (location counter: 23)

    Asembler gleda u tabelu simbola da nae ofset za printfprintf nije u tabeli simbolaAsembler ne moe da izrauna pomeraj koji treba upisati na ofsetu 19 TEXT sekcijePotom

    OfsetSadrajObjanjenje18-22E8 ????????call printf 11101000 ???????????????????????????????? Ovo je call instrukcija sa 4-bajtnim operadnom Ovo je displacement (relat. Adr. Skoka)

  • *Strukture podataka asemblera (19)Tabela simbola

    Relokacioni zapisi(bez promene)RODATA sekcija (location counter: 4)(bez promene)TEXT sekcija (location counter: 23)(bez promene)

    Asembler dodaje printf u tabelu simbolaPotom

    LabelaSekcijaOfsetLokal?R.BrmsgRODATA0local0mainTEXT0global1skipTEXT26local2getchar??global3printf??global4

  • *Strukture podataka asemblera (20)Tabela simbola(bez promene)Relokacioni zapisi

    RODATA sekcija (location counter: 4)(bez promene)TEXT sekcija (location counter: 8)(bez promene)

    Asembler generie relokacioni zapis, nalaui linkeru da ispravi kodLinker treba da popravi TEXT sekciju na ofsetu 19. Radi se o PC relativnoj 32bitnoj adresi simbola rednog broja 4 (printf).

    SekcijaOfsetTip relokacijeR.BrTEXT19R_386_PC324

  • Kako videti generisane relokacije?$ objdump -d -r main2.o00000000 : 0:55 push %ebp 1:89 e5 mov %esp,%ebp 3:e8 fc ff ff ff call 4 4: R_386_PC32getchar 8:83 f8 41 cmp $0x41,%eax b:75 0d jne 1a d:68 00 00 00 00 push $0x0e: R_386_32.rodata 12:e8 fc ff ff ff call 13 13: R_386_PC32printf 17:83 c4 04 add $0x4,%esp

    0000001a : 1a:b8 00 00 00 00 mov $0x0,%eax 1f:89 ec mov %ebp,%esp 21:5d pop %ebp 22:c3 ret *

  • .section ".rodata"msg: .asciz "Hi\n" .section ".text" .globl mainmain: push ebp mov ebp, esp call getchar cmp eax, 'A' jne skip push offset msg call printf add esp, 4skip: mov eax, 0 mov esp, ebp pop ebp ret*Drugi prolaz asemblera (nastavak)Asembler generiemainski kodu tekuoj (TEXT) sekcijiAsembler ne radi nita

  • *Strukture podataka asemblera (21)Tabela simbola, Relokacioni zapisi, RODATA sekcija(bez promene)TEXT sekcija (location counter: 31)

    OfsetSadrajObjanjenje23-2583 C4 04add esp, 4 10000011 11 000 100 00000100 Ovo je instrukcija sa 1-bajtnim operadnom Polje M oznaava registar Radi se o add instrukciji Odredini registar je ESP Neposredni operand je 426-30B8 00000000mov eax, 0 10111000 00000000000000000000000000000000 Ovo je mov instrukcija sa 4-bajtnim operadnom Neposredni operand je 0

  • *Strukture podataka asemblera (22)Tabela simbola, Relokacioni zapisi, RODATA sekcija(bez promene)TEXT sekcija (location counter: 35)

    OfsetSadrajObjanjenje31-3289 ECmov esp,ebp 10001001 11 101 100 Ovo je mov instr. sa registrom kao izvoritem Polje M oznaava registar Izvorini registar je EBP Odredini registar je ESP335Dpop ebp 01011101 Ovo je pop ebp instrukcija34C3ret 11000011 Ovo je ret instrukcija

  • Konstrukcija jednoprolaznog asembleraglavni razlog postojanja drugog prolaza je potreba da se razrei obraanje unapred, to jest, korienje labela pre njihovog definisanjamogue je napraviti i jednoprolazni asembler, uz modifikaciju u strukturama podatakamodifikujemo tabelu simbola (asemblera, a bez izmena u ELF fajlu) uvoenjem polja defined (da li je labela definisana) i flink koje e ukazivati na jedan ulaz novouvedene tabele obraanja unapred (engl. forward reference table):

    *

  • Konstrukcija jednoprolaznog asembleraPromene u tabeli simbola (opis jednog ulaza tabele simbola) struct ST_entries { char *name; int size; int value; . . . bool defined; // true kada se naie na definiciju ST_forwardrefs *flink;// poetak liste obraanja unapred };

    Lista obraanja unapred (struktura jednog ulaza liste) struct ST_forwardrefs { // obraanja identifikatorima // pre njihove definicije int patch; // adresa u programu za izmenu ST_forwardrefs *nlink;// pokaziva na sledei zapis };

    *

  • Algoritam obrade labela u jednom prolazuKada se u adresnom polju instrukcije naie na neku labelu, pretrauje se tabela simbola za taj identifikator. Nekoliko ishoda pretrage su mogui: Ako je labela ve definisana, bie naena u tabeli simbola, polje defined bie true, pa se odgovarajua vrednost moe odmah proitati iz polja value. Ako labela nije naena u tabeli simbola, bie kreiran novi ulaz za nju, postavljeno polje name i polje defined = false. Polje flink se postavlja da pokazuje na novo kreirani ulaz u tabeli obraanja unapred. U tom novom ulazu u polje byte upisuje se tekua vrednost brojaa lokacija LC tj. adresa u mainskom kodu koja odgovara adresnom polju tekue instrukcije.

    *

  • Algoritam obrade labela u jednom prolazuZa nedefinisani simbol usvaja se vrednost 0 pri raunanju vrednosti adresnog polja instrukcije. Ako je u pitanju relativno adresiranje (skokovi), to znai da se u adresno polje razlika 0 vrednost Location brojaa za sledeu instrukciju.

    Ako se labela nalazi u tabeli i pri tome je defined == false, onda se u tabelu obraanja unapred dodaje novi ulaz, isto kao u prethodnoj taki.

    na kraju prolaza, kada su sve labele (u normalnoj situaciji kada nema greaka) definisane, potrebno je proi kroz sve neprazne liste obraanja unapred i dodati poznatu vrednost simbola na adrese navedene u polju byte u zapisu ST_forwardrefs. Taj postupak se naziva backpatching koda

    *

  • Primer (nije u gnu sintaksi)0000 BEG ; count the bits in a number0000 E4 00 IN AL, 0 ; Read(A)0002 LOP ; REPEAT0002 C0 E8 01 SHR AL, 1 ; A := A DIV 20005 0F 83 F5 FF FF FF JNC EVN ; IF A MOD 2 # 0000B 88 05 00 00 00 00 MOV TEMP, AL ; TEMP := A0011 8A 05 00 00 00 00 MOV AL, BITS 0017 FE C0 INC AL 0019 88 05 00 00 00 00 MOV BITS, AL ; BITS:=BITS+1001F 8A 05 00 00 00 00 MOV AL, TEMP ; A := TEMP0025 84 C0 TEST AL, AL ; Z := (A == 0)0027 0F 85 D5 FF FF FF EVN JNZ LOP ; UNTIL A == 0002D 8A 05 00 00 00 00 MOV AL, BITS ;0033 E6 00 OUT 0, AL ; Write(BITS)0035 F4 HLT ; terminate prog.0036 ?? TEMP DS 5 ; VAR TEMP : BYTE003B 00 BITS DB 0 ; BITS : BYTE003C END*

  • Primer izgled tabele simbola i tabele obraanja unapred posle obrade instrukcije na adresi 19: Symbol TableBITS --- undefinedFLINK: 001b 0013TEMP --- undefinedFLINK: 000dEVN --- undefinedFLINK: 0007LOP DWORD PTR 00000002 FLINK:

    izgled ovih tabela posle prolaska kroz ceo program:Symbol TableBITS BYTE PTR 0000003bFLINK: 002f 001b 0013TEMP BYTE PTR 00000036FLINK: 0021 000dEVN DWORD PTR 00000027FLINK: 0007LOP DWORD PTR 00000002FLINK:

    *

  • *ZakljuakAsembler: ita asemblerski program1. prolaz: Generie tabelu simbolaTS sadri informacije o labelama u programu2. prolaz: Koristi tabelu simbola da generie kodTEXT, RODATA, DATA, BSS Sekcijerelokacioni zapisiKreira objektni fajl (po ELF formatu)Jednoprolazni asembler radi backpatching tehnikuLinkeru je ostavljeno:Razreavanje simbola: Razreava reference na uvezene simboleRelokacija: Uses Tabela simbola and Relokacioni zapisi to patch codePravljenje izvrnog fajla (po ELF formatu)

    ***********************************************************