13
LEKCIJE IZ SISTEMSKOG PROGRAMIRANJA Sakupio: Ribić Samir Četvrta verzija (septembar 2009) 1

PrvoPredavanje

Embed Size (px)

DESCRIPTION

hr

Citation preview

Page 1: PrvoPredavanje

LEKCIJE IZSISTEMSKOG PROGRAMIRANJA

Sakupio: Ribić Samir

Četvrta verzija

(septembar 2009)

1

Page 2: PrvoPredavanje

1. Programerov pogled na organizaciju procesora 7

1.1. Centralna Procesorska Jedinica 7

1.2. Dizajn procesora prema skupu instrukcija 7

1.3. Memorija 7

1.4. Dizajn procesora prema memorijskom pristupu 81.4.1. Trodresne mašine 81.4.2. Dvoadresne mašine 81.4.3. Jednoadresne mašine (akumulatorske) 91.4.4. Jednoadresne mašine sa više registara 91.4.5. Nula adresne mašine (stekovne) 9

1.5. 80x86 familija mikroprocesora 10

2. Adresiranje podataka na sistemskom nivou 12

2.1. Registri 122.1.1. 8086 16-bitni registri 122.1.2. 80386 32-bitni registri 12

2.2. Dobijanje fizičke memorijske adrese na PC procesorima 132.2.1. Realni režim 132.2.2. 16-bit zaštićeni režim 132.2.3. 32-bitni zaštićeni režim 14

2.3. Instrukcijski operandi 14

2.4. Indirektno adresiranje 142.4.1. Napredno indirektno adresiranje 15

2.5. Predstavljanje cijelih brojeva 152.5.1. Znak i vrijednost 152.5.2. Prvi komplement 152.5.3. Drugi komplement 162.5.4. Smanjenje veličine podataka 172.5.5. Povećanje veličine podataka 17

2.6. Brojevi u pokretnom zarezu 172.6.1. Necijeli binarni brojevi 172.6.2. IEEE predstavljanje pokretnog zareza 19

2.7. Stek 19

3. Mašinski kod i njegovo generisanje 20

3.1. Mašinski jezik 20

3.2. Asemblerski jezik 20

3.3. Osnovne instrukcije 20

3.4. Direktive 213.4.1. Direktiva equ 213.4.2. Direktiva %define 213.4.3. Direktive podataka 22

3.5. Prvi program 233.5.1. Kompajlerske specifičnosti 253.5.2. Asembliranje programa 253.5.3. Kompajliranje C programa 263.5.4. Linkovanje objektnih programa 263.5.5. Razumijevanje asemblerskog listinga 263.5.6. Big i Little Endian predstavljanje 273.5.7. Uzorak za pisanje programa 27

3.6. Instrukcije za proširenje veličine podataka 28

3.7. Aritmetičke instrukcije 29

2

Page 3: PrvoPredavanje

3.7.1. Primjer program 303.7.2. Instrukcije proširene tačnosti 31

3.8. Kontrolne strukture 323.8.1. Poređenja 323.8.2. Instrukcije grananja 323.8.3. Instrukcije petlji 35

3.9. Operacije pomijeranja bitova 353.9.1. Logičko pomijeranje 353.9.2. Upotreba pomijeranja 363.9.3. Aritmetičko pomijeranje 363.9.4. Rotiranje bitova 363.9.5. Primjer upotrebe instrukcija za pomijeranje i rotiranje 373.9.6. Bulove bit operacije 373.9.7. AND operacija 373.9.8. OR operacija 373.9.9. XOR operacija 383.9.10. NOT operacija 383.9.11. TEST instrukcija 383.9.12. Upotreba bit operacija 39

3.10. Izbjegavanje uslovnih skokova 39

3.11. Instrukcije zamjene podataka 40

3.12. Potprogrami 403.12.1. Manipulacija stekom 403.12.2. Instrukcije CALL i RET 40

4. Generisanje koda radi implementiranja programskih jezika visokog nivoa 41

4.1. Prevođenje standardnih kontrolnih struktura 414.1.1. If naredba 414.1.2. While petlja 414.1.3. Do while petlja 41

4.2. Potprogrami 424.2.1. Konvencije poziva 424.2.2. Prosljeđivanje parametara na steku 424.2.3. Lokalne varijable na steku 454.2.4. Višemodulni programi 47

4.3. Povezivanje asemblera i C-a 484.3.1. Čuvanje registara 494.3.2. Oznake funkcija 494.3.3. Redoslijed prosljeđivanje parametara 494.3.4. Računanje adrese lokalnih varijabli 504.3.5. Povratne vrijednosti 504.3.6. Druge konvencije poziva 504.3.7. Poziv C funkcija iz asemblerskog programa 534.3.8. Ponovno pozivljivi i rekurzivni potprogrami 544.3.9. Rekurzivni potprogrami 544.3.10. Tipovi varijabli u C-u 55

4.4. Nizovi 554.4.1. Definisanje nizova 564.4.2. Definisanje nizova kao lokalne varijable na steku 564.4.3. Pristup elementima niza 564.4.4. Druge primjene instrukcije LEA 584.4.5. Višedimenzionalni nizovi 584.4.6. Dvodimenzionalni nizovi 584.4.7. Dimenzije iznad dva 594.4.8. Prosljeđivanje višedimenzionalnih nizova kao parametara u C 59

4.5. Instrukcije za rad s nizovima i stringovima 604.5.1. Čitanje i pisanje memorije 604.5.2. REP instrukcijski prefiks 614.5.3. String instrukcije za poređenje 62

3

Page 4: PrvoPredavanje

4.5.4. Instrukcijski prefiksi REPx 62

4.6. Pokretni zarez 634.6.1. Numerički koprocesor 634.6.2. Učitavanje i smještanje 644.6.3. Osnovne aritmetičke operacije 644.6.4. Razne instrukcije 67

4.7. Strukture 67

5. Ulaz i izlaz 69

5.1. Memorijski i U/I mapirani uređaji 69

5.2. Video 705.2.1. Video na niskom nivou 705.2.2. Video na nivou Windowsa 725.2.3. Video na nivou Linuxa 76

5.3. Tastatura 765.3.1. Tastatura na niskom nivou 765.3.2. Tastatura na nivou Windowsa 775.3.3. Tastatura na nivou Linuxa 77

5.4. Disk 775.4.1. Disk na niskom nivou 775.4.2. Disk na nivou Windowsa 785.4.3. Disk na nivou Linuxa 79

6. Prekidi 81

6.1. Šta je to prekid? 816.1.1. Hardverski interapti 816.1.2. Softverski interapti - trapovi 826.1.3. Izuzeci 82

6.2. Obrada prekida u realnom režimu 82

6.3. Obrada prekida u zaštićenom režimu 82

6.4. Kako izgleda tipična rutina za obradu prekida 83

7. Kompajleri 84

7.1. Prolazi 84

7.2. Glavne faze kompilacije 847.2.1. Predprocesiranje 847.2.2. Leksička analiza 847.2.3. Parsiranje, sintaksna analiza 857.2.4. Semantička analiza 857.2.5. Kompajlerska analiza 857.2.6. Optimizacija 857.2.7. Generisanje koda 85

7.3. LL i LR parsiranje 85

7.4. Sintaksni dijagrami i sintaksne procedure kroz primjer kompajlera 867.4.1. Jezici 867.4.2. Opis kompajlera 877.4.3. Osnovni principi 877.4.4. Sintaksni dijagrami i listing kompajlera 887.4.5. Ulaz, izlaz i dohvatanje simbola 927.4.6. Numeričke i alfanumeričke konstante 927.4.7. Varijable i nizovi 927.4.8. Izrazi 937.4.9. Kontrolne strukture 947.4.10. Funkcije 947.4.11. Uvodni i završni dio 947.4.12. Testni primjer i upotreba kompajlera 95

4

Page 5: PrvoPredavanje

8. Drugi razvojni alati 98

8.1. Linker 988.1.1. Linkerova pravila 988.1.2. Fiksiranja i relokacije 998.1.3. Biblioteke 100

8.2. Dinamičke biblioteke 1008.2.1. Dinamičke bibilioteke 1008.2.2. Upravljanje memorijom u DLL 1018.2.3. Eksplicitno i implicitno povezivanje DLL 1018.2.4. Primjer pravljenja DLL i poziva sa implicitnom i eksplicitnom varijantom. 102

8.3. Make 1038.3.1. Makefile struktura 1038.3.2. Primjer makefile 103

8.4. Asembleri 1048.4.1. Dvoprolazni asembler 1048.4.2. Jednoprolazni asembler 105

8.5. Interpreteri 105

8.6. Komandne linije, Integrirana okruženja i vizualna razvojna okruženja 107

9. Izvršno okruženje 110

9.1. Windowsov izvršni format datoteke 1109.1.1. MS-DOS zaglavlje i osnovni program u realnom režimu 1109.1.2. PE signatura, PE zaglavlje i opcionalno zaglavlje 1109.1.3. Standardne sekcije 1119.1.4. Sekcija s izvršnim programom, .text 1119.1.5. Sekcije podataka, .bss, .rdata, .data 1119.1.6. Resursna sekcija, .rsrc 1119.1.7. Sekcija izvezenih podataka .edata i uvezenih podataka .idata 1119.1.8. Sekcija debagerskih informacija .debug 1119.1.9. Linux ELF izvršni format 111

9.2. Loader (Punilac) 112

9.3. Windowsove sistemske funkcije 1129.3.1. Windows API 1129.3.2. Osnovne usluge 1129.3.3. Grafičke funkcije (GDI) 1129.3.4. Korisnički interfejs 1139.3.5. Mrežni servisi 1139.3.6. Web API funkcije 1139.3.7. Multimedijalni APIji 1139.3.8. API za interakciju između programa 1139.3.9. Prirodni API 1139.3.10. Omotači oko API-ja 1139.3.11. Pozivanje API funkcija 1149.3.12. Lista funkcija 114

9.4. Linuxove sistemske funkcije 125

9.5. Virtualne mašine 1259.5.1. Virtualne mašine koje omogućavaju istovremeno izvršavanje više operativnih sistema 1269.5.2. Aplikacijska virtualna mašina 1269.5.3. Virtualno okruženje 1269.5.4. Spajanje fizičkih mašina u virtualnu mašinu 127

10. Uvod u konkurentno programiranje 128

10.1. Zašto su potrebne niti 128

10.2. Niti (thread) 128

10.3. Kreiranje niti pod Linuxom 12910.3.1. Kreiranje niti 129

5

Page 6: PrvoPredavanje

10.3.2. Čekanje na završetak niti 129

10.4. Niti pod Windowsom 130

10.5. Problem konkurentnosti 13110.5.1. Uzajamno isključivanje 13110.5.2. Bibliotečne funkcije i niti 132

11. Optimizacija koda i perfomanse 133

11.1. Kada optimizovati, kada ne 13311.1.1. Kasna optimizacija 13311.1.2. Rana optimizacija 13411.1.3. Optimizacija u pravom vremenu 134

11.2. Kako se traži spori kod u programima? 13411.2.1. Profajleri 135

11.3. Da li je optimizacija neophodna? 135

11.4. Tri tipa optimizacije 13611.4.1. Bolji algoritam 13611.4.2. Bolja implementacija 13611.4.3. Brojanje ciklusa 136

11.5. Benchmark programi 137

11.6. Optimizacija izlaza kompajlera 137

11.7. Proširenje kompajlera Fildzan32 optimizatorom 138

12. Prilog: Instrukcijski set Pentiuma II 141

12.1.1. Operacioni kodovi, opis 14112.1.2. Primjeri kodiranja kompletnih instrukcija 143

6

Page 7: PrvoPredavanje

1. Programerov pogled na organizaciju procesora

1.1.Centralna Procesorska Jedinica

Centralna procesorska jedinica (CPU) je fizički uređaj koji izvršava instrukcije. Instrukcije koje CPU obavlja su uglavnom veoma jednostavne. Instrukcije mogu zahtijevati podatke s kojim rade da se nalaze u specijalnim lokacijama unutar samog CPU, koje se zovu registri. CPU može pristupati podacima u registrima daleko brže nego u memoriji. Ipak, broj registara u CPU je ograničen, pa programer mora biti pažljiv tako da čuva u registrima samo trenutno korištene podatke.

Instrukcije koje CPU izvršava predstavljaju njegov mašinski jezik. Mašinski programi imaju mnogo jednostavniju strukturu nego programi u jeziku visokog nivoa. Mašinski programi su kodirani kao sirovi brojevi, a ne u razumljivom tekstualnom formatu. CPU mora biti u stanju da dekodira namjenu instrukcije veoma brzo da bi se radilo efikasno. Mašinski jezik je stoga dizajniran s tim ciljem u vidu, a ne da bude lako razumljiv ljudima. Programi pisani u drugim jezicima se moraju konvertirati u prirodni jezik procesora da bi se izvršavali na računaru. Kompajler je program koji prevodi program napisan u nekom programskom jeziku u mašinski jezik odgovarajuće računarske arhitekture. Generalno, svaki tip procesora ima svoj vlastiti mašinski jezik. To je jedan od razloga zašto programi za Mekintoš ne mogu da rade na IBM-PC računarima.

Računar koristiti sat da uskladi izvršavanje date naredbe. Sat otkucava na fiksnoj frekvenciji ( poznatoj kao brzina sata). Ako ste kupili 2 GHz kompjuter, 2 GHz je frekvencija ovog sata. Sat ne prati minute i sekunde On prosto otkucava konstantnim ritmom. Elektronika procesora koristi otkucaje da izvršava svoje operacije korektno, slično kao što otkucaji metronoma omogućavaju sviranje muzike korektnim ritmom. Broj otkucaja (ili kako se obično zovu ciklusa) koju instrukcija zahtijeva zavisi od generacije procesora i modela. Broj ciklusa koliko traje instrukcija zavisi prije svega od samih instrukcija, ali i od drugih faktora.

1.2.Dizajn procesora prema skupu instrukcija

Postoje dva pristupa dizajnu računara : - RISC: Računar s reduciranim skupom instrukcija. Samostalne instrukcije obavljaju jednu, dobro

definiranu operaciju. RISC pristup pretpostavlja da će se većina programiranja obavljati u jezicima visokog nivoa. Ovaj pristup povećava broj instrukcija koje je potrebno upotrebiti u programu, ali pojednostavljuje strukturu procesora.

- CISC: Računar s kompleksnim skupom instrukcija. Jedna instrukcija obavlja više operacija. Jednostavnije je pisati programe u mašinskom i asemblerskom jeziku, ali se kompleksnost procesora povećava.

1.3.Memorija

Osnovna jedinica memorije je bajt. Računar sa 32 megabajta memorije može sadržavati približno 32 miliona bajtova podataka. Svaki bajt u memoriji je označen jedinstvenim brojem koji se zove adresa ( slika 1). Mikroprocesor čita kodove instrukcija i podatke iz memorije pristupajući njihovim adresama.

Lokacija 0 1 2 3 4 5 6 7

Vrijednost 2E 3A 4C 88 72 26 83 9F

Sl. 1 Memorijske Adrese

7

Page 8: PrvoPredavanje

Često se memorija koristi u većim komadima od pojedinačnih bajtova. Na PC arhitekturi, data su imena i većim sekcijama memorije. Memorija se mjeri u kilobajtima ( 1024 bajta), megabajtima (1 048 576 bajtova) i gigabajtima ( 1073741824 bajta). Četvorobitni broj se zove nibl. Stoga, svaka heksadekadna cifra predstavlja nibl. Dva nibla čine bajt, pa se bajt predstavlja dvocifrenim heksadekadnim brojem. Vrijednost bajta varira između 0 i 11111111 u binarnom sistemu, 0 i FF u heksadekadnom te 0 to 255 u dekadnom.

Riječ (word) 2 bajtaDupla riječ 4 bajtaČetverostruka riječ 8 bajtovaparagraf 16 bajtova

Sl. 2 Jedinice memorije

Svi podaci u memoriji su numerički. Znakovi se smještaju korištenjem kodova koji mapiraju brojeve u znakove. Jedan od najčešćih kodova znakova je poznat pod imenom ASCII (American Standard Code for Information Interchange). Postoji i noviji, veći način kodiranja znakova koji ponekad zamjenjuje ASCII pod imenom Unicode. Glavna razlika između ova dva načina je što ASCII koristi jedan bajt za kodiranje znaka, a Unicode koristi dva bajta (ili riječ) po znaku. Na primjer, ASCII mapira bajt 4116 (6510) u znak A; Unicode mapira riječ 004116 u isto slovo. Pošto ASCII koristi bajt, ograničen je na samo 256 različitih znakova . Unicode proširuje ASCII vrijednosti na 16 bitne riječi i tako dopušta predstavljanje više znakova. To je važno za predstavljanje znakova svih jezika svijeta.

1.4.Dizajn procesora prema memorijskom pristupuSvaka naredba treba da obavi neku operaciju. Kompleksne operacije se realizuju kao kombinacija prostih operacija. Na primjer iskaz pridruživanja se sastoji od prostih operacija sabiranja, množenja, ostatka pri dijeljenju, smještanja u memoriju i čitanja iz memorije :

a = (b * c ) % (d + f );

Ove proste operacije se mogu realizovati na različite načine. Na primjer, sabiranje dva broja zahtijeva dva broja koja želimo sabrati i treba da vrati kao rezultat treći broj, ali to ne znači da se sva tri broja moraju nalaziti na memorijskim lokacijama. Prema broju memorijskih operanada , procesori se dijele na nula adresne , jednoadresne , dvoadresne i troadresne mašine.

1.4.1.Trodresne mašineSvi tri operanda su eksplicitno navedeni u većini instrukcija. * ADD dest, src1, src2: M[dest] = M[src1] + M[src2] * MULT dest, src1, src2: M[dest] = M[src1] * M[src2]

Mada ovaj pristup izgleda vrlo moćan , ima svojih loših strana. Instrukcije zahtijevaju mnogo pristupa RAM memoriji, što je znatno sporije nego instrukcije unutar procesora. Najpopularnija 3-adresna mašina je bio računar VAX 11. Primjer troadresne instrukcije na ovom procesoru (ne mikroprocesoru) jeaddl3 (R2),(R3),(R4) koja sabira vrijednosti na lokacijama koje pokazuju registri R2 i R3 i upisuje rezultat na adresu na koju pokazuje registar R4.

1.4.2.Dvoadresne mašineU 2-adresnoj mašini, instrukcije imaju samo dvije eksplicitne adrese. Jedna od njih ima dvije uloge: adresa izvornog operanda i adresa odredišta.

* ADD dest, src: M[dest] = M[dest] + M[src] * MULT dest, src: M[dest] = M[dest] * M[src] * MOVE dest, src: M[dest] = M[src]

8

Page 9: PrvoPredavanje

Najpopularnija 2-adresna mašina je mikroprocesor Motorola 68000. Primjer dvoadresne instrukcije za ovu arhitekturu je sub.l (A1),(A2) , koja oduzima vrijednost na adresi na koju pokazuje registar A1 od vrijednosti na adresi koju pokazuje A2 i rezultat smješta na adresu na koju pokazuje A2.

1.4.3.Jednoadresne mašine (akumulatorske)U jednoadresnoj mašini ili akumulatorskoj mašini, akumulator ima ulogu odredišnog i jednog od izvornih operanada. Potrebno je navesti samo adresu drugog izvornog operanda. Specifična je jedino STORE instrukcija, u kojoj je akumulator izvorni operand, a odredište je na memorijskoj lokaciji koja se eksplicitno navodi. Akumulator je registar u akumulatorskoj mašini. Akumulator se nalazi unutar CPU.

* ADD addr: accum = accum + M[addr] * MULT addr: accum = accum * M[addr] * LOAD addr: accum = M[addr] * STORE addr: M[addr] = accum

Evo kako se koriste gornje instrukcije za izračunavanje naredbe a = a * b + c * d * e. Pretpostavimo da se varijable a, b, c, d, e nalaze na memorijskim lokacijama 100, 104, 108, 112 i 116, u navedenom redu.

LOAD 100 ; acc = aMULT 104 ; acc *= bSTORE 100 ; a = accLOAD 108 ; acc = cMULT 112 ; acc *= dMULT 116 ; acc *= eADD 100 ; acc += aSTORE 100 ; a = acc

Najpopularniji procesor iz ove kategorije je Mos technology 6502, koji je ugrađivan u računare Apple II i Commodore 64. Primjer instrukcije na ovom mikroprocesoru je LDA 1000 koja prenosi vrijednost s lokacije 1000 u akumulator.

1.4.4.Jednoadresne mašine sa više registara

Mnoge moderne mašine (npr. CPU u svakom PC računaru) prihvatile su ideju jedne adrese, ali umjesto jednog akumulatora koriste više različitih internih registara. To ubrzava neke operacije. Na primjer, za izračun prethodnog primjera na 8086 imat ćemo

MOV AX,[100]MUL WORD [104]MOV BX,AXMOV AX,[108]MUL WORD [112]MUL WORD [116]ADD AX,BXMOV [100],AX

1.4.5.Nula adresne mašine (stekovne)Moguć je i pristup da se operandi nalaze na internom mjestu u memoriji ili procesoru. Jedan takav pristup je preko steka (o njemu više u posebnom poglavlju). Kod 0 adresne mašine operacije uzimaju vrijednosti sa steka i smještaju rezultate takođe na stek. Za prijenos podataka između memorijskih ćelija i stek koriste se

9

Page 10: PrvoPredavanje

specijalne operacije PUSH i POP. Mali dio steka je unutar procesora, ostatak je u memoriji. Ovakav koncept ima matematički koprocesor 8087, do procesora 486 pravljen kao poseban čip. Broj bajtova na steku (dubina steka) utiču na vrijeme izvršenja programa. Evo nekih instrukcija hipotetičke 0 adresne mašine.

* ADD: push ( pop + pop ) * MULT: push ( pop + pop ) * PUSH addr: push ( M[addr] ) * POP addr: M[addr] = pop

Pokazaće se kako se mogu koristiti gornje instrukcije da se izračuna naredba a = a * b + c * d * e. Pretpostavlja se da se varijable a, b, c, d, e nalaze na memorijskim lokacijama 100, 104, 108, 112, i 116, respektivno.

PUSH 100 ; aPUSH 104 ; a bMULT ; (a * b)PUSH 108 ; (a * b) cPUSH 112 ; (a * b) c dMULT ; (a * b) (c * d)PUSH 116 ; (a * b) (c * d) eMULT ; (a * b) (c * d * e)ADD ; (a * b + c * d * e)POP 100

1.5.80x86 familija mikroprocesora

Svaki IBM PC kompatibilni računar koristi procesor iz familije Intel 80x86 (ili srodan procesor drugog proizvođača). Procesori u ovoj familiji imaju neke zajedničke karakteristike, uključujući osnovni mašinski jezik. Ipak, novije verzije procesora imaju znatno veće mogućnosti.

8088,8086: Ovi procesori sa programerske tačke gledišta su identični. To su bili procesori korišteni u najranijim PC računarima. Oni imaju sljedeće 16 bitne registre: AX, BX, CX, DX, SI, DI, BP, SP, CS, DS, SS, ES, IP, FLAGS. Podržavaju samo do jednog megabajta memorije i rade samo u realnom režimu rada. U tom režimu program može pristupiti bilo kojoj memorijskoj adresi, pa čak i memoriji dodijeljenoj drugim programima. To čini ispravljanje grešaka i sigurnost veoma otežanim. Također, programska memorija se mora dijeliti u segmente koji ne mogu biti veći od 64K.

80286: Ovaj procesor je korišten u AT klasi PC računara. On dodaje neke nove instrukcije osnovnom mašinskoj jeziku procesora 8088/86. Ipak, njegova glavna nova osobina je 16-bitni zaštićeni režim. U ovom režimu on može pristupiti do 16 megabajta i zaštititi programe od pristupa tuđoj memoriji. Ipak, programi su i dalje podijeljeni u segmente koji ne mogu biti veći od 64 K.

80386: Ovaj CPU je znatno poboljšan u odnosu na 80286. Prvo, prošireni su mnogi registri na veličinu 32 bita (EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EIP) i dodana 2 nova 16 bitna registra FS i GS. Također uvodi novi 32-bitni zaštićeni režim. U ovom režimu, može se pristupiti memoriji do 4 gigabajta. Programi su i dalje podijeljeni u segmente, ali sada je svaki segment velik do 4 gigabajta.

80486/Pentium/Pentium Pro: Ovi procesori uključuju instrukcije za rad s pokretnim zarezom i uglavnom ubrzavaju izvršavanje instrukcija.

Pentium MMX/ Pentium II/Celeron: Ovi procesori dodaju MMX (MultiMedia eXtensions) instrukcije Pentiumu. Te instrukcije omogućavaju istovremene cjelobrojne operacije što ubrzava grafičke primjene..

Pentium III/Pentium IV su principijelno Pentium II sa SSE instrukcijama. Te instrukcije omogućavaju istovremene operacije u pokretnom zarezu. Neke verzije Pentium IV imaju 64 bitne registre.

Pentium Dual Core/Core 2/Core i7 uključuju 64 bitne instrukcije, 1,2,4, ili 8 procesora u istom integrisanom kolu, SSE3 instrukcije.

10

Page 11: PrvoPredavanje

2. Adresiranje podataka na sistemskom nivou

2.1.Registri

Sl. 3 Registar AX

2.1.1.8086 16-bitni registri

Originalni 8086 procesor je obezbjeđivao četiri 16-bitna registra opšte namjene: AX, BX, CX i DX. Svaki od ovih registara se može rastaviti u dva osmobitna registra. Na primjer, registar AX se može rastaviti na registre AH i AL, kako se vidi na Sl. 3 . Registar AH sadrži gornjih (ili viših) 8 bita registra AX a registar AL sadrži nižih osam bita registra AX. Često se AH i AL koriste kao međusobno nezavisni registri, ali je važno napomenuti da oni nisu nezavisni od registra AX. Promjena vrijednosti registra AX će promijeniti i registre AH i AL i obrnuto. Slično, BX se dijeli na BH i BL, CX na CH i CL, a DX na DH i DL. Registri opšte namjene se koriste u instrukcijama za premještanje podataka i aritmetičkim instrukcijama.

Postoje dva 16-bitna indeksna registra: SI i DI. Oni se često koriste kao pokazivači, ali se takođe koriste kao registri opšte namjene. Ipak, oni se ne mogu rastaviti u osmobitne registre.

16-bitni registri BP i SP se koriste da pokazuju na podatke na mašinskom steku i zovu se Base Pointer i Stack Pointer. O njima će biti kasnije riječi.

16-bitni registri CS, DS, SS i ES su segmentni registri. Oni određuju koji će se dio memorije koristiti za različite dijelove programa. CS predstavlja Code Segment, DS predstavlja Data Segment, SS predstavlja Stack Segment, a ES predstavlja Extra Segment. ES se koristi kao privremeni segmentni registar.

Instruction Pointer (IP) registar se koristi zajedno sa CS registrom radi praćenja adrese naredne instrukcije koju će izvršiti CPU. U normalnoj situaciji, kako se izvršava instrukcija, IP se uvećava da pokazuje na narednu instrukciju u memoriji.

Registar FLAGS čuva važne informacije o rezultatu prethodne instrukcije. Ovi rezultati se smještaju kao

individualni bitovi u registru. Na primjer, Z bit je 1 ako je rezultat prethodne instrukcije bio 0, a Z bit je 0 ako rezultat prethodne instrukcije nije bio 0. Ne mijenjaju sve instrukcije bite u FLAGS registru.

2.1.2.80386 32-bitni registriNa 80386 i kasnijim procesorima su prošireni registri. Na primjer, 16 bitni AX je proširen na 32 bita.

Radi kompatibilnosti sa starim procesorima, AX se odnosi na 16-bitni registar dok se EAX koristi da pokazuje prošireni, 32-bitni registar. AX je nižih 16 bita registra EAX, baš kao što je AL nižih 8 bita registra AX (kao i EAX). Nema direktnog načina za pristup do viših 16 bita EAX registra. Ostali prošireni registri su EBX, ECX, EDX, ESI i EDI.

Prošireni su još neki registri. BP je postao EBP; SP je postao ESP; FLAGS je postao EFLAGS a IP je postao EIP. Ipak, za razliku od registara opšte namjene, u 32-bitnom zaštićenom režimu (bit će o njemu kasnije riječi) koristi se samo proširena verzija ovih registara.

Segmentni registri su i dalje 16-bitni na 80386. Uvedena su dva nova segmentna registra: FS i GS, bez posebnog značenja njihovih imena. Oni su pomoćni segmentni registri poput ES.

Termin “riječ” se ponekad definiše kao veličina registara podataka procesora. Za 80x86 familiju ovaj termin je sada malo zbunjujući. Na Sl. 2, može se vidjeti da je “riječ” definisana da bude 2 bajta (ili 16 bita). To je značenje dato kada se 8086 pojavio. Kada se pojavio 80386, odlučeno je da se definicija pojma “riječ” ne mijenja, iako se promijenila veličina registra.

11

AH AL

AX

Page 12: PrvoPredavanje

2.2.Dobijanje fizičke memorijske adrese na PC procesorima

2.2.1.Realni režim

U realnom režimu rada (kompatibilnom sa 8086 i aktivnom pri startu računara) memorija je ograničena na samo jedan megabajt. Ispravne adrese u opsegu (heksadekadno) između 00000 i FFFFF. Ove adrese zahtijevaju 20-bitne brojeve. Jasno, 20-bitni broj se ne može smjestiti u 16-bitne registre procesora 8086. Intel je riješio taj problem korištenjem dvije 16-bitne vrijednosti radi određivanja 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). Fizička adresa koja se dobije 32 bitnim parom selektor-pozicija se računa formulom

1610* selektor + pozicija

Množenje sa 1610 u heksadekadnom sistemu je lako, samo se dodaje 0 na kraj broja. Na primjer, fizička adresa navedena kao 047C16:004816 iznosi:

047C0+0048--------04808

U suštini, vrijednost selektora je broj paragrafa (Sl. 2). Segmentno adresiranje u realnom režimu ima tri nedostatka:

• Jedan selektor može pristupiti samo 64K memorije (gornji limit 16-bitne adrese). Šta ako program ima više od 64K koda? Pojedinačna vrijednost u CS se ne može koristiti tokom cijelog programa. Program se mora rasjeći u sekcije (zvane segmenti) koji su kraći od 64 kilobajta. Kada se izvršenje programa premješta s jednog segmenta na drugi, vrijednost CS registra se mora promijeniti. Slični problemi se dešavaju s velikom količinom podataka i DS registrom. To može biti vrlo neugodno!

• Svaki bajt u memoriji nema jedinstvenu segmentnu adresu. Fizičkoj adresi 04808 moće se pristupiti kao 047C:0048, 047D:0038, 047E:0028 ili 047B:0058. To može otežati poređenje segmentiranih adresa.

• Nema zaštite između segmenata, pa je moguće upisivanje podataka u područje predviđeno za drugi program.

2.2.2.16-bit zaštićeni režim

U 80286 16-bitnom zaštićenom režimu rada, vrijednosti selektora se interpretiraju potpuno drugačije nego u realnom režimu. U realnom režimu, vrijednost selektora je broj paragrafa fizičke memorije. Kod zaštićenog režima, vrijednost selektora je redni broj elementa u deskriptorskoj tabeli, kombinovan s još tri bita (od kojih jedan određuje koji od dva moguća deskriptorska registra pokazuje na tabelu, a dva bita određuju s kojim pravima se želi pristupiti memorijskom segmentu). Za oba režima, program se dijeli u segmente. U realnom režimu ovi segmenti su na fiksnoj lokaciji u fizičkoj memoriji i vrijednost selektora određuje redni broj paragrafa odakle počinje segment. U zaštićenom režimu, segmenti nisu na fiksnoj poziciji u fizičkoj memoriji. Čak, ne moraju uopšte biti u RAM memoriji.

Zaštićeni režim 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 drže na disku dok ne budu opet potrebni. U 16-bitnom zaštićenom režimu, segmenti se premještaju između memorije i diska po potrebi. Kada se segment vrati sa diska u memoriju, vrlo je vjerovatno da će biti smješten u drugi dio memorije u odnosu na onaj gdje je bio prije nego što je prebačen na disk. Sve se ovo radi transparentno, u operativnom sistemu. Sam program ne mora biti posebno pisan da radi s virtualnom memorijom.

12

Page 13: PrvoPredavanje

U zaštićenom režimu, svakom segmentu je pridružen element deskriptorske tabele. Taj element ima sve informacije potrebne sistemu da zna o segmentu. Informacije uključuju: 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 smještena u segmentnim registrima.

Mana 16-bitnog zaštićenog režima je da su memorijske pozicije i dalje 16 bitne vrijednosti. Kao posljedica ovoga, veličina segmenata je limitirana na najviše 64 kilobajta. To čini problematičnom upotrebu velikih nizova.

2.2.3.32-bitni zaštićeni režim

80386 uveo je 32-bit zaštićeni režim. Postoje dvije glavne razlike između 32-bitnog režima za 386 i 16 bitnog režima za 286:

1. Memorijske pozicije su povećane na 32 bita. To omogućuje postavljanje pozicije na vrijednost preko 4 milijarde. Tako, segmenti mogu imati veličine 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 znači da u memoriji možemo držati i samo dijelove segmenata. U 16-bitnom režimu procesora 80286 , ili je cijeli segment u memoriji ili nije. To nije praktično sa velikim segmentima kakve dopušta 32-bitni režim.

U Windows 3.1, standardni režim je u stvari 286 16-bitni zaštićeni režim, a prošireni režim je 32-bitni zaštićeni režim. Windows 9X, Windows NT/2000/XP, OS/2 i Linux svi rade u 32-bitnom (najnovije verzije i 64 bitnom) zaštićenom režimu.

13