Transcript Document
Uvod u asemblerski jezik VI poglavlje - Karakteristike – Uvod u asemblerski jezik Skup instrukcija mikroprocesora predstavlja skup binarnih ulaza koji generišu odredjene akcije u toku ciklusa jedne instrukcije Primer : Verzija instrukcije na mašinskom jeziku za mikroprocesor MC 68000 koja glasi: "Napuni neposredni decimalni operand 2001 na adresu na koju ukazuje registar A“ ima sledeći 32-bitni format: 0010 0000 0111 1000 0000 0111 1101 0001 Asemblerski jezik Primer : Za mikroprocesor MC 68000 sekvenca : “Izvrši sabiranje sadržaja dve memorijske lokacije 600016 i 600216, a rezultat smesti u memorijsku lokaciju 600416“ imaće sledeći oblik: 0011 0000 0011 1000 0110 0000 0000 0000 1101 0000 0111 1000 0110 0000 0000 0000 0011 0001 1100 0000 0110 0000 0000 0100 Ovo predstavlja mašinski jezik, ili objektni (object) kôd (program) i njega će mašina direktno izvršavati, tj. ovakav program koga čini sekvenca 0 i 1 mašina jedino i razume Asemblerski jezik - osobine Kreiranje programa na mašinskom jeziku se može iskazati kroz sledeća zapažanja: programi su teški za razumevanje, veoma teško se nalaze greške, a iste nakon toga koriguju instrukcije se teško unose u mašinu, kuca se bit po bit, a zatim se cela reč unosi u paralelnoj formi programi ne poseduju komentar koji će programeru olakšati rad programi su dugački i zamorni za analizu programer često iz nehata čini greške koje je veoma teško locirati, a nakon toga korigovati Asemblerski jezik – binarna forma Preglednost programa se može poboljšati ako se binarana forma 0011 0000 0011 1000 0110 0000 0000 0000 1101 0000 0111 1000 0110 0000 0000 0010 0011 0001 1100 0000 0110 0000 0000 0100 napiše u heksadecimalnoj brojnoj notaciji Asemblerski jezik – heksadecimalna forma 3 0 3 8 6 0 0 0 C 0 7 8 6 0 0 2 3 1 C 0 6 0 0 4 Program koji konvertuje heksadecimalne brojeve u binarne i smešta u memoriju se naziva "heksadecimalni punilac" – (hexadecimal loader) Asemblerski jezik – mnemonici Programsko poboljšanje se postiže dodeljivanjem imena svakom instrukcionom kôdu Ime kôda instrukcije zove se mnemonik Mnemonik opisuje sa minimalnim brojem znakova šta instrukcija radi Primer : Add za sabiranje Sub za oduzimanje Programska sekvenca za MC 68000, kada se koriste mnemonici, ima sledeći oblik Move.W $6000, D0 Add.W $6000, D0 Move.W D0,$6004 program napisan na asemblerskom jeziku Proces asembliranja Za programsku sekvencu Move.W $6000, D0 Add.W $6000, D0 Move.W D0,$6004 kažemo da je napisana na asemblerskom jeziku Asemblerski program (asembler) vrši prevodjenje korisničkog programa ili izvornog programa, napisanog pomoću mnemonika, u program na mašinskom jeziku, ili objektni program, koga će mikroračunar izvršavati Ulaz u asembler je izvorni program Izlaz iz asemblera je objektni (izvršivi) program Proces razvoja programa na asemblerskom jeziku Programer koristi usluge tekst editora za kreiranje tekst datoteke (text file) koja sadrži program napisan na asemblerskom jeziku. Imena izvorna datoteka (source file) i izvorni program (source program) se često koriste u asemblerskom jeziku i jezicima višeg nivoa da označe tekst datoteke. Asembler prihvata izvorni program kao ulaz, vrši proveru formata zbog grešaka u pisanju i proizvodi objektni modul koji sadrži program napisan na mašinskom jeziku Proces razvoja programa na asemblerskom jeziku Punilac (loader) smešta objektni modul u memoriju na kojoj će se program izvršavati (ciljna mašina - target machine) Na ciljnoj mašini program se testira pomoću programa za odstranjivanje grešaka (debugger) Steps in transforming an assembly language program to an executable program residing $2,$5,$5 $2,$2,$2 $2,$4,$2 $15,0($2) $16,4($2) $16,0($2) $15,4($2) $31 00a51020 00421020 00821020 8c620000 8cf20004 acf20000 ac620004 03e00008 Executable machine language program Loader add add add lw lw sw sw jr Machine language program Linker Assembly language program Assembler MIPS, 80x86, PowerPC, etc. Library routines (machine language) Memory content An assembly language program, its machine-language version, and the symbol table created during the assembly process Assembly language program addi sub add test: bne addi add j done: sw Symbol table $s0,$zero,9 $t0,$s0,$s0 $t1,$zero,$zero $t0,$s0,done $t0,$t0,1 $t1,$s0,$zero test $t1,result($gp) done result test 28 248 12 Location 0 4 8 12 16 20 24 28 Machine language program 00100000000100000000000000001001 00000010000100000100000000100010 00000001001000000000000000100000 00010101000100000000000000001100 00100001000010000000000000000001 00000010000000000100100000100000 00001000000000000000000000000011 10101111100010010000000011111000 op rs rt rd sh fn Field boundaries shown to facilitate understanding Determined from assembler directives not shown here Generisanje izvršivih binarnih programa iz skupa nezavisno prevedenih izvornih procedura zahteva korišćenje linkera Kros-asembler Punilac, odstranjivač grešaka i program na mašinskom jeziku moraju da se izvršavaju na ciljnoj mašini, dok tekst editor i asembler mogu se izvršavati na drugoj (različitoj) mašini. Asembler koji se izvršava na jednoj mašini, a proizvodi (generiše) objektne module za drugu mašinu zove se krosasembler (cross-assembler). Proces punjenja (loading) objektnog modula sa mašine na kojoj je izvršeno kros asembliranje u ciljnu mašinu (down load) obično se izvodi serijskom komunikacionom vezom. The structure of a typical assembly language program Constant Definitions Main Program Subroutines Library Definitions Global Variables String Constants Karakteristike asemblerskog jezika Kada programer vrši programiranje na asemblerskom jeziku, on mora strogo da zna : koji će mikroračunar koristiti koje registre i instrukcije dotični mikroračunar poseduje koje adresne načine rada koristi, i puno drugih detalja Asembler nije prenosiv Svaki mikroračunar ima svoj sopstveni asemblerski jezik koji odražava njegovu sopstvenu arhitekturu. Asebmlerski program napisan za MC 68020 neće raditi na mikroračunaru zasnovanom na iAPX486 ili bilo kom drugom mikroprocesoru Karakteristike asemblerskog jezika – produžetak - asemblerski jezik je jezik kod koga svaka instrukcija generiše tačno jednu mašinsku instrukciju. postoji korespondencija jedan-prema-jedan izmedju mašinskih instrukcija i instrukcija na asemblerskom programu. postoji onoliko asemberskih jezika koliko postoji i različitih mikroprocesora Karakteristike asemblerskog jezika - nekonzistentnost - Za odredjivanje vrednosti algebarskog izraza X=Y+Z kod jednih procesora se koristi instrukcija Add X,Y,Z a kod drugih (mikroprocesora) instrukcija Add Y,Z,X Sagledavajući ograman broj nedostataka programiranja na asemblerskom jeziku udruženje IEEE oformila je radnu grupu IEEE P 694 koja je imala zadatak da standardizuje mnemonike asemblerskog jezika. Na žalost preporuke ove grupe nisu široko prihvaćene od strane industrije. Karakteristike asemblerskog jezika - pokušaj standardizacije - Nezavisno od toga što su pokušaji standardizacije propali ostali su tragovi tog rada za koje se čini da su prećutno šire prihvaćeni od strane proizvodjača RISC procesora a koji se odnose na: specifikaciju imena mnemonika definiciju tipa modifikatora uslove grananja dogovor o korišćenju formata ALU instrukcija mnemonik Karakteristike asemblerskog jezika imena najčešće korišćenih mnemonika operacija Add sabiranje Sub oduzimanje Mul množenje Div deljenje Inc inkrementiranje Dec dekrementiranje Cmp kompariranje Move kopiranje Clr brisanje (sadržaja registra) Ld punjenje (registra iz memorije) St smeštaj (sadržaja registra u memoriju) Lda punjenje adreses u registar Ldm punjenje većeg broja registara Stm smeštaj većeg broja registara Shl pomeranje u levo Shr pomeranje u desno Br bezuslovno grananje Bc uslovno grananje Bal grananje i povezivanje Bal R grananje na registar i povezivanje Karakteristike asemblerskog jezika - modifikatori za tip podataka - Instrukcijom: Move.W R1,R2 ;kopira sa sadržaj 32 bitnog registra R2 u R1 Modifikatori koji prate odredjeni tip podataka mogu biti oblika: modifikator B UB H tip podatka bajt (8-bitova) neoznačeni bajt (8-bitova) polu-reč (16 bitova) UH neoznačena polu-reč (16-bitova) W reč (32 bita) UW neoznačena reč (32-bita) F pokretni zarez (32-bita) D dupla preciznost pokretni zarez (64-bita) C znak ili decimalni broj u 8-bitnom formatu P decimalni broj u pakovanom (4-bitnom) formatu Karakteristike asemblerskog jezika uslovi grananja CC uslovi T istinit F pogrešan V premašaj C prenos ili pozajmljivanje PE parna parnost PO neparna parnost LE manji od ili jednak LT manji od EQ jednak NE nije jednak GE veći od ili jednak GT veći od Karakteristike asemblerskog jezika korišćeni formati ALU instrukcija slučaj 1 OP.X odredište, izvorište 1, izvorište 2 (tro-operandski format) slučaj 2 OP.X odredište, izvorište (samo kada se specificiraju dva operanda) slučaj 3 OP.X odredište/izvorište 1, izvorište 2 (u ovom slučaju OP koristi dva izvorna operanda, a upisuje rezultat na mesto operanda izvorište 1) Formati asemblerskih instrukcija Struktura instrukcija na asemblerskom jeziku dosta verno odslikava strukturu mašinskih instrukcija koje on predstavlja Asemblerski jezici različitih procesora medjusobno su dosta slični Ova osobina dozvoljava da se o njima u izvesnoj meri diskutira uopšteno Kada se dobro poznaje jedan asemblerski jezik lako se uči drugi. Formati asemblerskih instrukcija Svaki iskaz na asemblerskom jeziku čine sledeća četiri polja: oznaka (labela) opkôd ili direktiva operand (i) komentar Polja oznaka [< labela >] opkôd i direktiva (pseudoinstrukcija) <opkôd> ili <direktiva > operand (i) komentar [<operand 1>[, <operand 2>]] [<komentar>] Formati asemblerskih instrukcija - polje oznaka - Oznaka – za najveći broj instrukcija i direktiva ovo polje je i opciono polje oznaka predstavlja simboličko ime za memorijsku adresu. Izraz: Move.L B,D0 Izraz definiše lokaciju instrukcije u memoriji nakon što je program napunjen (loadovan). Oznaka se može koristiti da definiše početak programskog segmenta radi kasnijeg obraćanja. Oznaka se koristi kod dodela memorije pseudoinstrukcijama jer omogućava da memorisani podaci budu dostupni preko simboličkih imena. Formati asemblerskih instrukcija - polje operacioni kôd ili direktiva - Polje operacioni kôd ili direktiva sadrži: mnemonik instrukcije - simboličku skraćenicu za opkôd ako iskaz predstavlja mašinsku instrukciju ili asemblersku direktivu – tj. pseudoinstrukciju ako je iskaz komanda asembleru izbor imena za mnemonike i direktive razlikuje se od jednog asemblera do drugog Primer : Add R1,R2,R3 ;instrukcija Alfa EQU 50 ;direktiva Formati asemblerskih instrukcija - polje operandi - Operandi - polja operandi u iskazima asemblerskog jezika namenjena su da specificiraju adrese i registre koji se koriste kao operandi u mašinskoj instrukciji. Polje operand (i) kod instrukcije Add ukazuje šta sa čime treba sabrati. Polje operand kod Jump (Branch) instrukcije ukazuje gde treba skočiti. Kod pseudoinstrukcija ovo polje ukazuje koliko memorijskog prostora treba rezervisati. Asembleri prepoznaju i odredjene simbole u polju operand (i). Simbolu može da se dodeli apsolutna adresa, neposredna vrednost, ili bilo koji drugi važeći operand. Formati asemblerskih instrukcija - polje operandi - produžetak Izraz (expression) predstavlja kombinaciju simbola, konstanti (literali), algebarskih operatora i zagrada, a koristi se od strane asemblera za odredjivanje adresa ili vrednosti operanada. Primer : Instrukcijom Move.W # $ 2000, D1 definiše se 16-bitna heksadecimalna neposredni izvorni operand. vrednost 2000 kao Konstante za koje asembler automatski rezerviše memorijski prostor zovemo literali. Asemblerske direktive Alternativno ime je asemblerske pseudoinstrukcije Najveći broj asemblera pruža pomoć programeru na različite načine putem korišćenja asemberskih direktiva Direktive su instrukcije namenjene asembleru, a ne procesoru Akcija koja se preuzima od strane direktiva egzistira samo u toku asembliranja izvornog programa, tj. direktive su neizvršive asemblerske instrukcije Asemblerske direktive - primer Assembler directives provide the assembler with info on how to translate the program but do not lead to the generation of machine instructions tiny: max: small: big: array: str1: str2: .macro .end_macro .text ... .data .byte 156,0x7a .word 35000 .float 2E-3 .double 2E-3 .align 2 .space 600 .ascii “a*b” .asciiz “xyz” .global main # # # # # # # # # # # # # # start macro end macro start program’s text segment program text goes here start program’s data segment name & initialize data byte(s) name & initialize data word(s) name short float name long float align next item on word boundary reserve 600 bytes = 150 words name & initialize ASCII string null-terminated ASCII string consider “main” a global name Asemblerske direktive - primer Write assembler directive to achieve each of the following objectives: a. Put the error message “Warning: The printer is out of paper!” in memory. b. Set up a constant called “size” with the value 4. c. Set up an integer variable called “width” and initialize it to 4. d. Set up a constant called “mill” with the value 1,000,000 (one million). e. Reserve space for an integer vector “vect” of length 250. Solution: a. noppr: .asciiz “Warning: The printer is out of paper!” b. size: .byte 4 # small constant fits in one byte c. width: .word 4 # byte could be enough, but ... d. mill: .word 1000000 # constant too large for byte e. vect: .space 1000 # 250 words = 1000 bytes tip opkôd komentar upravljanje asembliranjem Org<izraz> početak programske sekvence End kraj programa koji se asemblira definicija simbola <oznaka> Equ<izraz> izjednačava simboličko ime (na poziciji oznaka) sa vrednošću operanda definisanje podataka i memorijskog prostora [<oznaka>] DC.<I> <vrednost(i)> definiše konstantu(e) tj. memoriše vrednosti operanda kao konstante [<oznaka>] DS.<I> <vrednost(i)> rezerviše memorijski prostor makro definicije Macro početak makro definicije Endm kraj makro definicije Lien dužina linije List listanje NoList nema listanja Spc<N> <N> blanko linija Page naredna stranica Title koristi operand kao naslov na svakoj stranici listinga If početak asembliranja uslovnog bloka instrukcije samo ako je specificirani uslov ispunjen Endif kraj uslovnog bloka upravljanje listingom ostale Proces asembliranja Proces asembliranja, kao aktivnost, je dovoljno sličan i može se kao postupak opisati da važi za sve mašine, tj. bude generalni Asembliranje možemo da zamislimo na sledeći način: program na asemblerskom jeziku predstavlja niz iskaza asembler u datom trenutku čita jedan iskaz, prevodi ga u mašinski jezik, a na svom izlazu generiše dva tipa informacija: odnosi se na generisani mašinski kôd i pridružuje se datoteci u kojoj se čuva izvršivi mašinski kôd, dodaje se odgovarajućem delu listing datoteke koja se koristi za potrebe štampanja. Proces se ponavlja dok se ne prevede ceo program. Proces asembliranja - produžetak Na prvi pogled veoma logičan postupak koji na žalost nije korektan. Zbog čega? Analizirajmo sledeću situaciju: Neka prvi iskaz u programu koji se prevodi bude Jump Adr_1. Asembler neće biti u stanju da asemblira ovaj iskaz sve dok nezna adresu Adr_1. Skok može biti na kraju programa koji se prevodi, što znači da asembler neće biti u stanju da pronadje adresu ako se prethodno ne pročita ceo program. Ovaj problem je poznat kao obraćanje unapred (forward reference) a javlja se zbog toga što se simbol Adr_1 javlja pre nego što je definisan, tj. obraćamo se simbolu čija definicja sledi kasnije. Problem obraćanja unapred – prvi pristup Asembler čita izvorni program dva puta. Pri ovome svako čitanje izvornog programa zovemo prolaz (pass). Bilo koji prevodilac koji čita ulazni program dva puta zove se dvoprolazni prevodilac. U toku prvog prolaza, kod dvo prolaznog asemblera, skupljaju se i smeštaju u tabeli definicije simbola i oznake (labele) iskaza. U toku drugog prolaza vrednosti svih simbola su poznate, problem obraćanja unapred nije više kritičan, svaki iskaz se čita, asemblira i generiše njegov izlaz. Problem obraćanja unapred – drugi pristup Drugi pristup se zasniva na jednom prolazu. Ideja je sledeća : Kada se naidje na iskaz koji se ne može asemblirati zbog toga što postoji obraćanje unapred ne generiše se izlaz. Umesto toga kreira se ulaz u (jednoj) tabeli čiji sadržaj ukazuje to da iskaz kod koga se javlja obraćanje unapred nije asembliran. Na kraju procesa asembliranja svi iskazi u neasembliranoj tabeli se asembliraju. Nedostaci: dvo prolaznog asemblera ogleda se u tome što zahteva nešto duže vreme prevodjenja jedno prolaznog: (a) dodatni memorijski prostor, koji može biti veliki ako u programu postoji veliki broj obraćanja unapred; (b) složenija struktura; i (c) razumljivost listinga objektnog koda nije uvek najjasnija. Zbog nabrojanih razloga najveći broj asemblera je dvo prolazni. Prvi prolaz Glavna aktivnost koja se obavlja u toku prvog prolaza u vezi je sa kreiranjem tabele simbola. U tabeli se čuvaju vrednosti svih simbola. Simbol može biti: (a) oznaka (labela); i (b) vrednost kojoj je pomoću direktiva dodeljeno simbolično ime, kao na primer : DISK_1 Equ 18 Kada simbol pripada polju Oznaka asembler mora da zna, koju adresu treba da dodeli toj instrukciji u toku izvršenja programa. Da bi sačuvao adresni trag o svim asembliranim instrukcija asembler mora u svakom ulazu tabele simbola da pamti vrednost jedne promenljive koja se zove lokacioni brojač instrukcija (instruction location counter - ILC). Na početku prvog prolaza asembler postavi ILC na vrednost 0. Nakon obrade svake instrukcije ILC se inkrementira za dužinu te instrukcije. Tabela simbola Tabela simbola - ima po jedan ulaz za svaki simbol Simboli su definisani bilo kao oznake (labele) ili preko definicija (Januar Equ 1) Svaka tabela simbola sadrži sam simbol (ili pokazivač na taj simbol), njegovu numeričku vrednost i dodatnu informaciju koja se odnosi na : dužinu polja podatka koje prati taj simbol, relokacione bitove, tj. da li simbol menja vrednost ako se program puni na neku drugu adresu u odnosu na onu koja je specificirana asemblerom da li je ili ne simbol dostupan van granica procedure. Opkôd tabela Opkôd tabela - sadrži najmanje jedan ulaz za svaki mnemonik asemblerskog jezika Svaki ulaz opkôd tabele sadrži : simbolički opkôd (mnemonik) dva operanda dužinu instrukcije klasu instrukcije koja deli opkodove u grupe u zavisnosti od broja i tipova operanada Drugi prolaz U ovom prolazu obavljaju se sledeće aktivnosti: generiše se objektni program štampa se listing na asemblerskom jeziku ako se to zahteva generiše se dodatna informacija koja je potrebna programu za povezivanje (linkeru) radi povezivanja procedura koje se asembliraju u različitim vremenskim trenucima Pseudoinstrukcije Example of one-to-one pseudoinstruction: The following not $s0 # complement ($s0) is converted to the real instruction: nor $s0,$s0,$zero # complement ($s0) Example of one-to-several pseudoinstruction: The following abs $t0,$s0 # put |($s0)| into $t0 is converted to the sequence of real instructions: add slt beq sub $t0,$s0,$zero $at,$t0,$zero $at,$zero,+4 $t0,$zero,$s0 # # # # copy x into $t0 is x negative? if not, skip next instr the result is 0 – x Pseudoinstrukcije MiniMIPS Pseudoinstructions Copy Arithmetic Shift Logic Memory access Control transfer Pseudoinstruction Usage Move Load address Load immediate Absolute value Negate Multiply (into register) Divide (into register) Remainder Set greater than Set less or equal Set greater or equal Rotate left Rotate right NOT Load doubleword Store doubleword Branch less than Branch greater than Branch less or equal Branch greater or equal move la li abs neg mul div rem sgt sle sge rol ror not ld sd blt bgt ble bge regd,regs regd,address regd,anyimm regd,regs regd,regs regd,reg1,reg2 regd,reg1,reg2 regd,reg1,reg2 regd,reg1,reg2 regd,reg1,reg2 regd,reg1,reg2 regd,reg1,reg2 regd,reg1,reg2 reg regd,address regd,address reg1,reg2,L reg1,reg2,L reg1,reg2,L reg1,reg2,L Makro naredbe i potprogrami Programeri često imaju potrebu da nekoliko puta u okviru programa ponavljaju odredjene sekvence Najjednostavnije ovoj problem se rešava tako što se sekvenca instrukcija kad god zatreba prepiše Ako je sekvenca dugačka, ili se često ponavlja, ovaj posao postaje zaista dosadan Kao alternative se nude sledeća dva rešenja koja se baziraju na grupisanju instrukcija u jedinstvenu celinu : makro naredbe potprogrami (procedure) Makro naredbe i potprogrami - produžetak Obe strategije ima svoje prednosti i nedostatke Kod poziva procedure izvršavaju instrukcije Call i Return Ako je procedura kratka, a poziv procedure česti, izvršenje instrukcija Call i Return u značajnoj meri usporava brzinu izvršenja programa Makro naredbe obezbedjuju efikasnije rešenje problema učestalog izvršenja iste ili skoro iste sekvence instrukcija Nedostatak makro naredbe se ogleda u povećanju obima programa. Makro mehanizam A macro is a mechanism to give a name to an oft-used sequence of instructions (shorthand notation) .macro name(args) ... .end_macro # macro and arguments named # instr’s defining the macro # macro terminator How is a macro different from a pseudoinstruction? Pseudos are predefined, fixed, and look like machine instructions Macros are user-defined and resemble procedures (have arguments) How is a macro different from a procedure? Control is transferred to and returns from a procedure After a macro has been replaced, no trace of it remains Macro – largest of three values Write a macro to determine the largest of three values in registers and to put the result in a fourth register. Solution: .macro mx3r(m,a1,a2,a3) move m,a1 bge m,a2,+4 move m,a2 bge m,a3,+4 move m,a3 .endmacro # # # # # # # macro and arguments named assume (a1) is largest; m = (a1) if (a2) is not larger, ignore it else set m = (a2) if (a3) is not larger, ignore it else set m = (a3) macro terminator If the macro is used as mx3r($t0,$s0,$s4,$s3), the assembler replaces the arguments m, a1, a2, a3 with $t0, $s0, $s4, $s3, respectively. Razlika izmedju makro naredbi i potprograma rad sa potprogramima • jednaka je zbiru GLPR ... CALL PP1 ... CALL PP2 Ukupna dužina programa n 10 k ... GLPR PPi i 1 CALL PP2 ... PP1 1k PP1 2k • i nezavisna je od toga koliko se puta u toku izvršenja glavnog programa pozivaju potprogrami. • U konkretnom slučaju jednaka je 13 k. Razlika izmedju makro naredbi i potprograma rad sa makroima Ukupna dužina programa • jednaka je zbiru GLPR ... MAKRO1 ... MAKRO2 10 k ... Ukupni program GLPR p1 MAKRO1 p2 MAKRO2 ... pn MAKROn MAKRO1 ... MAKRO2 ... ... 15 k MAKRO1 MAKRO2 1k ... gde je pi broj puta pozivanja makroa i u okviru glavnog programa MAKRO2 2k MAKRO2 ... na mestu poziva ceo MAKRO se umeće u kôd glavnog programa • Dužina programa zavisna je od toga koliko se puta u toku izvršenja glavnog programa pozivaju makroi. • U konkretnom slučaju jednaka je 15 k. Makro naredbe Veliki broj asemblerskih jezika je proširljiv dozvoljavaju korisniku da definiše nove instrukcione mnemonike koje zovemo makro naredbe Asembleri Makro naredbe se mogu smatrati kao sastavni deo jezika, pa se kao takve i mogu pozivati Novo definisane instrukcije mogu se koristiti potpuno ravnopravno sa svim ostalim instrukcijama iz skupa instrukcija na asemlerskom jeziku naredba predstavlja sekvencu mašinskih instrukcija koja se definiše jedanput, a može se koristiti po nekoliko puta u toku izvornog programa. Makro Makro naredbe - produžetak Definicija makro naredbe liči na definiciju procedure Procedure i makro naredbe nisu isto Razlika se ogleda u sledećem : korišćenjem makro naredbi ne štedi se memorijski prostor na mestima na kojima se poziva marko naredba ubacije se sekvenca mašinskih instrukcija, koje čine makro naredbe, čime se obim programa povećava makro naredbe nije potrebno povezivati, tj. linkovati. makro naredbe su pogodnije za primenu kada se u toku programa javljaju kratke celine po nekoliko puta, a procedure kada su celine duže. Definicija makro naredbe Definicija makro naredbe predstavlja metod dodele imena delu programa Različiti asembleri koriste različitu notaciju kod definicje makro naredbi Nezavisno od detalja svi imaju sledeće tri osnovne celine: zaglavlje u kome se javlja ime makro naredbe koja se definiše, tekst koji čini telo makro naredbe, direktiva koja se odnosi na kraj definicije. Tri celine kod definicije makro naredbe ime Makro operand, . . . , operand . . . Endm telo makro naredbe Makro naredbe - produžetak Kada se ime makro naredbe koristi kao opkôd tada je ono poznato kao makro poziv a njegova ekspanzija telom makro naredbe zove se makro ekspanzija Definicija makroa uključuje zadavanje formalnih parametara, a makro pozivom se predaju aktuelni parametri. Procedure Procedura je osnovna programska jedinica kod najvećeg broja HLL-ova. Korišćenjem procedure može da poboljša čitljivost, pisanje, i održavanje velikih programa Procedure takodje smanjuju veličinu programa jer je njihov kôd deljiv, tj. zajednički za veći broj programa Upotreba procedura je takodje svojstvena kod uvodjenja novih programskih tehnika kao što je rekurzivno programiranje čime se u značajnoj meri smanjuju napori programera kod realizacije odredjenih algoritama Lako prepoznajemo korišćenje procedura u skoro svim programima koje danas srećemo. Procedure - produžetak implementacija procedura podrazumeva upravljanje nekim strukturama podataka koje zbog poziva procedura unose dodatno vremensko prekoračenje, tj. usporavaju brzinu izvršenja programa savremeni mikroprocesori poseduju specijalne instrukcije koje izvode ove aktivnosti, a njihov efekat se ogleda u poboljšanju performansi Aktivnosti kod poziva procedura Prenos parametara proceduri (preko magacina, registara, itd) Predaja upravljanja željenoj proceduri Dodela prostora radi memorisanja lokalno promenljivih, Pamćenje konteksta programa iz koga je izvršen poziv, Pristup parametrima u toku izvršenja procedure, Obnavljanje konteksta programa iz koga je izvršen poziv, Oslobadjanje prostora koji je bio rezervisan za memorisanje lokalno promenljivih, Izbavljanje parametara (iz magacina, registara, itd), Vraćanje upravljanja programu iz koga je izvršen poziv. Primer korišćenja procedura kod Pascala procedure P(X : integer; var y : integer); var z : integer; begin . y:=z+x . end; program (glavni) . P(A,B); . end Prenos upravljanja izmedju programa i potprograma Metod prenosa upravljanje izmedju programa iz koga je izvršen poziv i potprograma zove se povezivanje potprograma (subroutine linkage) Informacija koja je potrebna potprogramu definiše se u zavisnosti od parametara Definicaija procedure uključuje formalne ili fiktivne parametre, a pozivom procedure se predaju aktuelni ili stvarni parametri Alternativno formalne parametre zovemo parametri, a za stvarne parametre se koristi termin argumenti Tehnike za prenos vrednosti ili adresa tip registarski magacin opis rutina iz koje se vrši poziv puni unapred definisane registre vrednostima ili adresama • broj parametara je ograničen • predaja je dinamička adresa iz koje se vrši poziv smešta • adresa povratka u toku obrade vrednosti ili adrese magacina mora biti sačuvana, a obnovljena pre povrataka • predaja dinamička definišu se oblasti u memoriji u parametarsk kojima se čuvaju vrednosti ili adrese e oblasti in line komentar vrednosti ili adrese se memorišu nakon instrukcije za poziv potprograma. Potprogram izračunava lokacije parametara • predaja statička , ako su oblasti definisane u toku asembliranja, • predaja je dinamička ako se bazna adresa oblasti predaje u registru • predaja je statička Tipovi argumenata i parametri koji se prenose Argumenti koji se predaju potprogramu zove se ulazni parametri Dobijeni rezultati u formi vrednosti ili adrese odgovaraju izlaznim parametrima potprograma Parametri koji se prenose izmedju pozivnog i pozvanog programa mogu se predavati kao: vrednosti (by value) - pozvanom programu se predaje stvarna vrednost adrese (by reference) - stvarni parametar se predaje kao adresa Registerski prenos Najjednostavniji metod za prenos argumenata Podaci se predaju preko internih registara CPU-a Brzi prenos podataka Broj argumenata koji se može preneti je ograničen brojem dostupnih registara Projektanti oba programa moraju prethodno da se dogovore preko kojih registara će se prenosti argumenti Registerski prenos Primer : Sledećom sekvencom instrukcija (važi za MC 68020) . Move.L vred_1,D1 ; prenos vrednosti Move.L adr_x,A1 ; prenos adrese Lea zaglav, A2 ; adresa zaglavlja Jsr PP_1 ; poziv potprograma . postavlja se 32-bitna vrednost u D1, adresa pokazivača na lokaciju adrese u A1, a adresa zaglav u A2. Potprogram PP_1 može kada obavlja svoju funkciju direktno da pristupa registrima Prenos preko magacina Argumenti se smeštaju u magacin pre nego što se izvrši poziv potprograma Kod smeštanja podataka u magacin registar SP se prvo dekrementira, za vrednost koja je odredjena obimom podatka koga treba zapamtiti, a nakon toga se memoriše podatak Prenos preko magacina Primer : Argumenti se smeštaju u magacin pre nego što se izvrši poziv potprograma na sledeći način: . Move.L vred_1,(SP) ; smešta se prvi podatak Move.W vred_2,(SP) ; smešta se drugi podatak Jsr ; poziv potprograma PP_A PP_A . na vrh magacina pokazuje registar SP registar SP uvek pokazuje na punu lokaciju Prenos preko magacina Primer : Sekvenca instrukcija, mikroprocesora MC68020, koja obavlja ovu aktivnost ima sledeći oblik: PP_A: Move.L (SP)+,A1 ;privremeno sačuvaj (PC) u A1 Move.W (SP)+,D1 ;smesti vred_2 u D1 Move.L (SP)+,D2 ;smesti vred_1 u D1 . . telo potprograma PP_A . Move.L Rts (A1),(SP) ;smesti (PC) u magacin ;povratak iz potprograma Prenos preko magacina - produžetak Prednosti : broj argumenata koji se prenosi mo`e biti veliki metoda je univerzalna jer magacin poseduju svi procesori ova metoda prenosa argumenata koristi se od strane velikog broja kompilatora, kakvi su C, Pascal, i dr. Nedostaci : s obzirom da se pristupa memorijskim lokacijama prenos je sporiji u odnosu na registarski ako je broj poziva potprograma ili broj podataka koji se prenosi veliki, a dodeljen prostor magacinu mali, tada može da dodje do prekoračenja opsega magacina. Ovo neminovno dovodi do gubitaka podataka, a time i do kraha rada sistema. Prenos podataka preko memorijskih lokacija Kada je broj parametara koji se prenosi veliki, parametarsku oblast je bolje postaviti u memoriji Ova oblast sadrži, po unapred odredjenoj sekvenci, vrednosti ili adrese kojima se pristupa od strane potprograma nakon što je njemu predata početna adresa ove oblasti Ista oblast se može koristiti od strane nekoliko potprograma pod uslovom da je ona dovoljno velika da može čuvati sve podatke Potprogram može da pristupa vrednostima koristeći indirektno adresiranje sa razmeštajem Prenos podataka preko memorijskih lokacija Primer : Sekvenca za prenos pet podataka preko memorijskih lokacija, za mikroprocesor MC 68020, imaće oblik . Move.L vred_1, memo_ob ; smeštaj prvog podatka Move.W vred_2, memo_ob+4 ; smeštaj drugog podatka Move.W vred_3, memo_ob+6 ; smeštaj trećeg podatka Move.L vred_4, memo_ob+8 ; smeštaj četvrtog podatka Move.W vred_5, memo_ob+12 ; smeštaj petog podatka Lea memo_ob, A1 Jsr PP_2 ; smesti adresu oblasti u A1 ; poziv potprograma Primer -produžetak: . memo_ob: DS.L 1 ; rezervacija prostora DS.W 2 DS.L 1 DS.W 1 End instrukcijom Move.L (8,A1),D1 vrši se prenos vred_4 u D1 definisanje parametarske oblasti se može obaviti na veći broj načina "In-line" kodiranje Metod za prenos vrednosti potprogramu zasniva se na kôdiranju vrednosti koja sledi nakon poziva potprograma Ovaj metod se zove in-line kodiranje i definiše vrednosti argumenata koje su konstante i ne menjaju se nakon asembliranja "In-line" kodiranje Primer : Sekvencom instrukcija: Jsr PP_3 DC.W 1 ; poziv potprograma PP_3 ; in line argument 32-bitna vrednost PC-a koja se smešta u sistemski magacin nakon poziva potprograma ukazuje na lokaciju argumenta u instrukcionoj sekvenci. "In-line" kodiranje Primer : Sledećom sekvencom koja je deo potprograma PP_3, smeštamo argumet u LS deo registra D1, a zatim u magacin smeštamo povratnu adresu koja se nalazi iza konstante : Move.L (SP), A0 ; izbavi (PC) i smesti ga u A0 Move.W (A0)+, D1 ; pribavi argumet i inkrementiraj A0 Move.L A0, (SP) ; smesti novu povratnu adresu . . telo potprograma PP_3 . Rts ; povratak iz potprograma Projektovanje modularnih programa i dokumentacija Kreiranje i dokumentovanje programa je od izuzetne važnosti za programere Promena funkcionalnih zahteva nekog programskog modula iziskuje modifikaciju prethodno kreiranog kôda Dobro dokumentovani program može da uštedi mnogo vremena koje je potrebno za analizu postojećeg kôda Svaka organizacija na jedinstven način formira svoj sopstveni standard o vodjenju dokumentacije Projektovanje modularnih programa i dokumentacija - produžetak Ključne komponente, minimalnog standarda koga treba ispoštovati, su : funkcionalni opis algoritamski opis tabela o korišćenju registara in line dokumentacija Funkcionalni opis Funkcionalni opis: opisuje šta odredjena funkcija obavlja, ali ne daje informaciju kako se ta funkcija izvršava Funkcionalni opis mora da objasni na koji način se argumenti prenose toj funkciji, i na koji način se rezultati vraćaju (ako postoje) Funkcionalni opis Primer: Hexout (R1 : vrednost) 32-bitna binarna vrednost se prenosi funkciji u registru R1, a heksadecimalna vrednost se štampa sa desnim poravnjanjem. Decout (R1 : vrednost) 32-bitna binarna vrednost se prenosi funkciji u registru R1, a decimalna vrednost se štampa sa desnim poravnjanjem. Decin (R1 : vrednost, R2 : status) Čita se niz decimalnih cifara sa tastature i vraća 32-bitni binarni ekvivalenat u registar R1. Ako niz ne predstavlja na korektan način decimalni broj tada se vrednost "1" kao tip statusne greške vraća u registar R2, inače, kada je decimalni broj važeći, u registar R2 se vraća vrednost "0". Hexin ( niz, vrednost) Analizira se niz ASCII karaktera koji predstavlja heksadecimalni broj i vraća se 32-bitna binarna ekvivalentna vrednost u magacin na lokaciji MemSP-4. Pokazivač na niz se prenosi funkciji preko magacina na lokaciji MemSP. Nakon povratka, pokazivač u MemSP pokazivaće na bajt koji sledi nakon zadnje heksadecimalne cifre u nizu. Algoritamski opis Pseudokôd: objašnjava na koji način se implementira funkcija svaki programer kome se dodeljuje zadatak da modifikuje kôd izuzetno je zainteresovan za logičku strukturu postojećeg kôda obično logičku strukturu kôda lakše je razumeti ako se koristi neka HLL notacija korišćenje HL pseudokôda od izuzetne je važnosti u toku inicijalnog razvoja kôdnog modula kao i od velike pomoći programeru koji se bavi održavanjem pseudokôd olakšava saradnju individua modifikacije, a takodje i olakšava debagiranje zaduženih za na osnovu svega izloženog, preporučuje se da, pseudokôd bude sastavni deo dokumentacije programa na asemblerskom jeziku Algoritamski opis Primer : Jedan tipičan primer koji uključuje funkcionalni opis kao i opis algoritma na nivou pseudokôda imao bi sledeći oblik : ; ############################################################ ######### ; Ime programa: Suma integer vrednosti ; Programer: Mika Rus ; Datum zadnje modifikacije: 12.01.2004. ; ############################################################ ######### Algoritamski opis ################################################################ ; Funkcionalni opis: ; Program odredjuje sumu celobrojnih vrednosti (integer) od 1 do N, gde je ; N vrednost koja se prihvata (čita) sa tastature ; ############################################################### ; Opis algoritma na pseudokod nivou ; main: cout << "\n Uneti ulaznu vrednost za N = " cin >> v0 if (v0 > 0) t0 = 0; while (v0 > 0) do t0 = t0 + v0; v0 = v0 - 1 cout << "Zbir integer-a od 1 do N je", t0; go to main; else cout << "\n Ovo je kraj opisa" ; ############################################################### Tabela o korišćenju registara Tabela o korišćenju registara: U okviru granica algoritma ovom tabelom se definiše način korišćenja svakog od registara procesora i premošćava se jaz izmedju opisnih imena promenljivih i odgovarajućih registara procesora Tabela o korišćenju registara Primer : Jedan tipičan primer zaglavlja glavnog programa koji koristi tabelu o korišćenju registara bio bi sledećeg oblika: ;####################Primer zaglavlja glavnog programa############### ; Program 1: <opisno ime> ; Programer: <ime i prezime> ; Dan kreiranja: dan, mesec, godina ; Zadnja modifikacija: dan, mesec, godina ; ############################################################### ; Funkcionalni opis programa ; Sledi kratak opis programa ; ############################################################### ; Korišćenje registara u glavnom programu ; R1 = početna adresa niza ......................... ; R2 = vrednost koja se dobija sabiranjem ....................... ; ############################################################### ; Opis pseudokoda ; ############################################################### Tabela o korišćenju registara Primer : Drugi tipični primer koji bi se odnosio na opis funkcije bio bi sledećeg oblika: ; #################### Primer zaglavlja funkcije ##################### ; Ime funkcije: <opisno ime> ; Programer: <ime i prezime> ; Dan kreiranja: dan, mesec, godina ; Zadnja modifikacija: dan, mesec, godina ; ################################################################## ; Funkcionalni opis: ; Sledi kratak opis: ; ################################################################## ; Objašnjenje koji se parametri prenose funkciji i na koji način ; R1 = pokazivač niza u memoriji ; Objašnjenje koje se vrednosti vraćaju od strane funkcije i kako ; R2 = binarna vrednost rezultata izračunavanja ; R3 = vrednost statusa, "1" - rezultat ima korektnu vrednost, "0" - rezultat nema ; korektnu vrednost ; Primer pozivne sekvence: ; <prikaz prenosa parametara preko registara, magacina, .........> ; JSR xxxx poziv potprograma ; <povratak na ovo mesto .............> ; ################################################################## ; Način korišćenja registara u funkciji: ; R5 = adresa lokacije .................. ; R6 = privremena suma ; ################################################################## ; Algoritamski opis na nivou pseudokoda: ; sledi opis ; ################################################################## "In line" dokumentacija In line dokumentacija: Ovaj tip dokumentacije je od velike koristi u fazi identifikacije koju aktivnost svaki od blokova na asemblerskom jeziku obavlja "In line" dokumentacija Primer : Jedan tipičan primer korišćenja in line dokumentacije je sledeći: Andi R3,R1,1 ; maskiraj LSB registra R1 i smesti vrednost ; u registar R3 Beqz R3,parno ; ako je LSB=0 skoči na parno Addi R2,R2,1 ; inkrementiraj brojač neparno za 1 parno: ...... Svaki modul ima sopstveni adresni prostor, počev od adrese 0 a) Pozicioniranje objektnih modula u binarnoj slici pre relokacije i linkovanja b) Objektni moduli nakon linkovanja i relokacije Adresni prostor nakon linkovanja - za prethodni slajd - Interna struktura objektnog modula generisanog od strane prevodioca Relocirani binarni program sa prethodnih slajdova pomeren za 300 adresa naviše Veliki broj instrukcija ukazuje na nekorektne memorijske adrese. Dinamičko povezivanje a) Pre poziva EARTH b) Nakon poziva i linkovanja EARTH Korišćenje DLL fajla od strane dva procesa