Professional Documents
Culture Documents
03 FRISC Programiranje
03 FRISC Programiranje
Apsolutni
*.o
strojni kôd
Premjestivi
strojni kôd
Punitelj Povezivač
a.out
(loader) (linker)
Biblioteke
U okviru OS-a
Izvršni
program *.a
Memorija
© Kovač, Basch, FER, Zagreb 3
Asembleri - Uvod
• Možemo spomenuti da podjela posla s prethodne slike može biti i
drugačija:
Korisnik vidi
Apsolutni samo ovo
*.o
strojni kôd
Premjestivi
strojni kôd
Punitelj Povezivač
a.out
(loader) (linker)
Biblioteke
U okviru OS-a
Izvršni
program *.a
Memorija
© Kovač, Basch, FER, Zagreb 5
Asembleri - Uvod
• Tipičan tijek pri prevođenju mnemoničkih programa:
Mnemonički
Uređivač
programi
teksta
(editor)
*.s Asemblerski
prevoditelj
(assembler)
Apsolutni
*.o
strojni kôd
Premjestivi
strojni kôd
Punitelj Povezivač
a.out
(loader) (linker)
Biblioteke
U okviru OS-a
Izvršni
program *.a
Memorija
© Kovač, Basch, FER, Zagreb 6
Asembleri - Uvod
• Razdvajanje mnemoničkog programa u više datoteka omogućuje
njegovu modularizaciju u cilju lakšeg programiranja i održavanja
Mnemonički
Uređivač Program xconas
teksta program
Apsolutni
(editor) Asemblerski strojni kôd
*.a prevoditelj
(izvršni program)
(assembler)
*.e
Program xcompas
Punitelj
simulatora
Memorija
simulatora
© Kovač, Basch, FER, Zagreb 9
Asembleri - Uvod
• U ATLAS-u se može koristiti samo jedna datoteka s
mnemoničkim programom
Za razliku od C-a:
a = 2+i;
2+i a-= func(3*j); a += b[2][4];
- func(3*j)
+ b[2][4];
• Polje labele:
• Obavezno počinje od prvog stupca datoteke, ali se smije ispustiti
• Labela je simboličko ime za adresu
• Labela se sastoji od niza slova i znamenaka te znaka podvlake, a
prvi znak mora biti slovo
• Duljina labele nije ograničena, ali se razlikuje samo prvih deset
znakova
• Polje naredbe:
• Polje naredbe ispred sebe obavezno mora imati prazninu (znak
razmaka ili tabulatora), bez obzira stoji li ispred labela ili ne
• Polje naredbe se smije ispustiti (tada naravno nije potrebno
stavljati praznine)
• Naredba se piše prema pravilima definiranim za pojedini procesor
• U polju naredbe umjesto naredbe smije stajati i pseudonaredba
(bit će objašnjene kasnije)
• Polje komentara:
• Polje komentara počinje znakom komentara i proteže se do kraja
tekučeg retka
• Znak komentara ovisi o procesoru, a za FRISC to je znak točka-
zarez ;
• Polje komentara se također može ispustiti
• Polje komentara se zanemaruje prilikom prevođenja
• Primjeri:
PETLJA ADD R0, R1, R2 ;naredba ADD
SUB R3, R2, R3
PODATCI `DW 23, 14 ;pseudonaredba `DW
LABELA_3 ; labela smije stajati bez naredbe
; komentar smije početi od prvog stupca
ADD... ADD...
NATRAG XOR... XOR...
SUB... SUB...
JP NATRAG JP 4
ADD...
Ako svaka naredba zauzima 4 memorijske
XOR... lokacije, adresa naredbe XOR je 4
SUB...
Adresa naredbe SUB je 8, itd.......
JP __
4
Ovdje stavimo adresu naredbe na
koju želimo skočiti
• Pseudonaredbe:
• nemaju veze s procesorom
• to su naredbe za asemblerski prevoditelj: one upravljaju njegovim
radom govoreći mu pobliže kako treba obavljati prevođenje
• "izvodi" ih asemblerski prevoditelj tijekom prevođenja
`ORG adresa
• Primjer:
zapravo ADD
program: memorija: zauzima adrese
0-3, STORE 4-7,
`ORG 0 adresa sadržaj itd.
ADD ... 0: ADD
STORE ... 4: STORE
8: 0
`ORG 14 C: 0
"preskočeno"
LOAD ... 10: 0 do adrese 14
HALT 14: LOAD
18: HALT
brojevi su heksadekadski
• Podsjetnik:
• Memorijske lokacije široke su jedan bajt (tj. najmanja
količina memorije koja se može adresirati je jedan bajt)
• Podatkovna sabirnica je širine 32 bita, što znači da se
može odjednom pročitati sadržaj 4 memorijske lokacije
program: memorija:
`ORG 20 adresa sadržaj
ADD ... 20: ADD
STORE ... 24: STORE
LOAD ... 28: LOAD
`ORG 0
XOR ...
HALT greška: 0 je manje od
adrese prethodnog `ORG-a
(iako bi na adresama 0 i 4
bilo mjesta za strojni kod
naredaba XOR i HALT)
program: memorija:
`ORG 0 adresa sadržaj
ADD ... 0: ADD
STORE ... 4: STORE
LOAD ... 8: LOAD
`ORG 4
XOR ...
HALT
greška: 4 je manje od adrese
prethodne naredbe LOAD
(veći je od prethodnog `ORG-a,
ali ne "dovoljno")
`DW podatci
BROJAC `DW 10
SUMA `DW 0
program: memorija:
`ORG 0 adresa sadržaj
`DW 11 0: 11
`DW 22, 33 1: 22
BROJ `DW 0FF 2: 33
`ORG 7 3: 0FF
LAB `DW 44 4: 0
... 5: 0 "preskočeno"
6: 0 do adrese 7
7: 44
uočite da ... ...
pseudonaredba `DW ne
poravnava podatak na
adresu djeljivu s 4 !!!
program: memorija:
... sadržaj
ADD ... ...
STORE ... ADD
STORE
`END
LOAD ...
35fgxm+*=*)+9 zamemareno:
• LOAD se ne prevodi
• pogrešno napisan redak se također
zanemaruje
`BASE D
BROJACI`DW 15,16,17
ADD R2,18,R3 Retci u kojima se koristi baza 10:
LOAD R3,(12) baza se odnosi na zelene brojeve
LOAD R3,(R0-92)
`BASE B
`ORG 1000000 Retci u kojima se koristi baza 2:
XOR R1,1001010,R1 baza se odnosi na plave brojeve
• Primjeri:
%B 010 %B -1011
%H 2A7 %H +1FF
%D 95 %D -29
%O 7611 %O -37
• Poravnanje podataka
Uspoređivanje brojeva
Rješenje:
CMP R0, R1
JR_SLT R0_MANJI
KRAJ HALT
Rješenje:
OR R6,R6,R0 ; broj ispitaj i stavi u R0
JR_Z KRAJ ; ako je 0, u R0 je rezultat
JR_N NEG ; ispitaj predznak
POZ MOVE 1, R0
JR KRAJ
NEG MOVE -1, R0
KRAJ HALT
© Kovač, Basch, FER, Zagreb 62
FRISC - programiranje u asembleru
Rad s bitovima
• Operacije s bitovima:
• postavljanje (set)
• brisanje (reset)
• komplementiranje (complement)
• ispitivanje (test), itd.
• Ostalo:
• upis niza bitova na određeno mjesto u drugom nizu bitova
• prebrajanje bitova
• itd.
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
OR R0, %B 1111, R0
HALT
© Kovač, Basch, FER, Zagreb 69
Rad s bitovima - Brisanje bitova
Primjer:
• Zbog toga što 20-bitna maska ima na najvišem bitu jedinicu ona se
predznačno proširuje i u procesoru daje 32-bitni broj
11111111111111111111011110111011
• Ako napišemo 11111111011110111011 asembler pretpostavlja da mi želimo
konstantu 00000000000011111111011110111011, no asembler zna da
procesor ne može tu konstantu dobiti te javlja GREŠKU !!
• Da bi asembler mogao prepoznati da mi želimo broj koji nastane
predznačnim proširenjem sa 20 na 32 bita, moramo upisati "cijelu"
konstantu 11111111111111111111011110111011. Asembler će uspješno
prepoznati da je to konstanta koja se može dobiti predznačnim
proširenjem sa 20 bita i uspješno generirati strojni kôd.
MASKA DW 00FF0000
Rješenje:
>>>>
NEPARAN: R2=1
PARAN MOVE R0, R2
KRAJ HALT
PARAN: R2=R0
KRAJ HALT
>>>>
© Kovač, Basch, FER, Zagreb 75
Rad s bitovima - Ispitivanje bitova
Prethodni program:
KRAJ HALT
© Kovač, Basch, FER, Zagreb 76
Rad s bitovima - Ispitivanje bitova
• Ispitivanje stanja više bitova
• jesu li svi ispitivani bitovi jednaki ništicama?
MASKA DW %B 11000000000000000000000000000011
MASKA DW %B 10111111111111000000111111100001
© Kovač, Basch, FER, Zagreb 81
Rad s bitovima - Ispitivanje bitova
Rješenje prethodnog primjera na drugi način (usporedba sa -1
umjesto komplementiranja):
MASKA DW %B 10111111111111000000111111100001
MASKA DW %B 01000000000000111111000000011110
© Kovač, Basch, FER, Zagreb 85
Rad s bitovima – Upis bitova
• Često je potrebno određene bitove upisati u pojedine bitove
nekog registra (ili memorijske lokacije)
0 1 1 0 0 0 0 0 1 1 1 1 0 1 0 0
Daje rezultat:
0 1 1 0 1 1 1 1 0 0 1 1 0 1 0 0
Podatak: ____yyyy
Maskirani podatak: 1111yyyy
Poravnati podatak: 11yyyy11 AND
Registar: xx____xx
Maskirani registar: xx1111xx
Registar nakon AND: xxyyyyxx
MASKA0 DW %B 11111111111111111111100000000011
MASKA7 DW %B 00011111111100000000000000000000
© Kovač, Basch, FER, Zagreb 89
Rad s bitovima – Prebrajanje bitova
• Pod prebrajanjem bitova misli se na prebrajanje ništica ili
jedinica u određenom nizu bitova u podatku
. . . . . . C
. . . . . .
Višestruka preciznost
A3 B3 A2 B2 A1 B1 A0 B0
A B A B A B A B
C4 C3 C2 C1
Cout FA Cin Cout FA Cin Cout FA Cin Cout FA Cin C0
S S S S
S3 S2 S1 S0
1) RL = AL + BL + BH BL
2) RH = AH + BH + međuprijenos RH RL
HALT
© Kovač, Basch, FER, Zagreb 102
Višestruka preciznost - Oduzimanje
• Oduzimanje se obavlja slično zbrajanju
međuposudba
1) RL = AL - BL - BH BL
2) RH = AH - BH - međuposudba RH RL
>>>>
HALT
© Kovač, Basch, FER, Zagreb 106
Višestruka preciznost - Logičke operacije
• Logičke operacije AND, OR, XOR, NOT rade neovisno na
pojedinim bitovima podataka
izlazni bit
viši dio RH niži dio RL 0
R1 R0
Početno stanje prije
rotacije i način rotacije: V X N Y
>>>>
© Kovač, Basch, FER, Zagreb 109
Rješenje:
R1 R0
Početno stanje prije
rotacije i način rotacije: V X N Y
X Y operacija
0 0 - zamjenu bitova koji su
0 1 treba ih zamijeniti različiti jednostavno
1 0 treba ih zamijeniti
ostvarimo tako da ih
1 1 -
komplementiramo
; Nezavisna rotacija R0 i R1
ROTR R0, 1, R0
ROTR R1, 1, R1
HALT
• NBC:
0 0 0 0 0 0 0 0
• Dvojni komplement:
>>>>
0 0 0 0 0 0 0 0
• Jedinični komplement:
isto kao
za dvojni
Rješenje:
>>>>
© Kovač, Basch, FER, Zagreb 118
<<<<
ADD R1, 4, R1
SUB R2, 1, R2
JR_NZ PETLJA Nema eksplicitnog proširivanja
podatka, nego se u naredbi ADC
HALT zbraja s ništicom (tj. s višom
riječ proširenog podatka)
`ORG 1000
DW 1234, 563, 2A3523, ...
Rješenje:
>>>>
© Kovač, Basch, FER, Zagreb 120
<<<<
PETLJA LOAD R0, (R1) ; dohvati podatak
OR R0, R0, R0 ; postavi zastavice
JR_N NEG ; ispitaj predznak
Potprogrami
• Trebamo znati:
• Kako se potprogram poziva i kako se vraćamo iz potprograma
• Gdje se sprema povratna adresa
• Kako se prenose parametri i vraćaju rezultati iz potprograma
• Gdje se čuvaju lokalne varijable potprograma
• Kako se ostvaruje da stanja registara iz glavnog programa ne
budu promijenjena za vrijeme potprograma
• Naredba: RET
• uzima podatak (povratnu adresu) sa stoga
• skače na tu povratnu adresu
. . . . . . .
• Na najnižim adresama se nalazi (fiksna veličina)
program i varijable/konstante. Gomila (heap):
• Iza toga se nalazi područje malloc i free
gomile. Gomila dinamički raste
prema najvišim adresama.
(nema veze sa strukturom
podataka koja se također naziva
heap - iz "Algoritama i struktura
podataka"). Stog (stack):
• Na najvišim adresama se nalazi FFFF FFFF push i pop
stog koji raste prema nižim
adresama.
>>>>
© Kovač, Basch, FER, Zagreb 128
Potprogrami - stog
<<<<
• Mi ćemo pretpostaviti da je na FRISC spojena memorija od 64 KB.
Najviša adresa (8-bitne memorijske lokacije) u memoriji od 64 KB je FFFF
• Na stog se uvijek stavljaju 32-bitni podatci pa im adrese moraju biti
djeljive sa 4
• FFFC je adresa 32-bitnog podatka koji je "na zadnjoj 32-bitnoj lokaciji",
tj. "na najvišim lokacijama memorije"
• Budući da SP pokazuje na zadnji podatak na stogu (podatak koji na
početku još ne postoji), onda SP inicijaliziramo na jednu 32-bitnu riječ
dalje: 4+FFFC = 10000
... ...
FFF4 - FFF7 itd. 32b riječ
FFF8 - FFFB predzadnja 32b riječ
FFFC - FFFF zadnja 32b riječ
10000 - 10003
© Kovač, Basch, FER, Zagreb 129
Potprogrami - Parametri i rezultati
• Kao i u višim programskim jezicima, potprogrami obavljaju
izračunavanja u ovisnosti o parametrima te vraćaju pozivatelju
izračunati rezultat ili povratnu vrijednost:
tip povratne
parametri i njihovi tipovi
vrijednosti
• Terminologija:
• parametar (formalni parametar) - "varijabla" u potprogramu preko koje
potprogram prima vrijednosti od pozivatelja
• argument (stvarni parametar) - stvarna vrijednost koju pozivatelj šalje
potprogramu preko njegovih parametara
• Pomoću registara
• Pomoću stoga
Rješenje:
(na sljedećem slajdu)
>>>>
; glavni program
GLAVNI MOVE 10000, SP ;važno: inicijaliziraj SP !!!
LOAD R0, (PRVI) ;vrijednost u prvi parametar
LOAD R1, (DRUGI) ;vrijednost u drugi parametar
CALL NILI ;poziv potprograma
STORE R2, (REZ) ;spremanje rezultata
HALT
; potprogram NILI
NILI OR R0, R1, R2 ; koriste se parametri R0 i R1
XOR R2, -1, R2 ; rezultat se upisuje u R2
RET ; povratak iz potprograma
• Nedostatci:
• Može se prenijeti ograničen broj argumenata (najviše 7)
• Registri obično čuvaju međurezultate i nisu slobodni za
korištenje kao parametri
• Nije moguće rekurzivno pozivanje potprograma
0 FFF8
0 FFFC
10000
© Kovač, Basch, FER, Zagreb 155
<<<< Izvođenje programa:
0 R0
GLAVNI MOVE 10000, SP R1
0
LOAD R0, (PRVI) 10000 R7 tj. SP
STORE R0, (P1)
LOAD R0, (DRUGI)
STORE R0, (P2) . . .
CALL NILI
0 P1
0 P2
LOAD R0, (R_NILI) 0 R_NILI
STORE R0, (REZ) 1234ABCD PRVI
22445599 DRUGI
HALT
0 REZ
0 FFF8
0 FFFC
10000
© Kovač, Basch, FER, Zagreb 156
<<<< Izvođenje programa:
1234ABCD R0
GLAVNI MOVE 10000, SP R1
0
LOAD R0, (PRVI) 10000 R7 tj. SP
STORE R0, (P1)
LOAD R0, (DRUGI)
STORE R0, (P2) . . .
CALL NILI
0 P1
0 P2
LOAD R0, (R_NILI) 0 R_NILI
STORE R0, (REZ) 1234ABCD PRVI
22445599 DRUGI
HALT
0 REZ
0 FFF8
0 FFFC
10000
© Kovač, Basch, FER, Zagreb 157
<<<< Izvođenje programa:
1234ABCD R0
GLAVNI MOVE 10000, SP R1
0
LOAD R0, (PRVI) 10000 R7 tj. SP
STORE R0, (P1)
LOAD R0, (DRUGI)
STORE R0, (P2) . . .
CALL NILI
1234ABCD P1
0 P2
LOAD R0, (R_NILI) 0 R_NILI
STORE R0, (REZ) 1234ABCD PRVI
22445599 DRUGI
HALT
0 REZ
0 FFF8
0 FFFC
10000
© Kovač, Basch, FER, Zagreb 158
<<<< Izvođenje programa:
22445599 R0
GLAVNI MOVE 10000, SP R1
0
LOAD R0, (PRVI) 10000 R7 tj. SP
STORE R0, (P1)
LOAD R0, (DRUGI)
STORE R0, (P2) . . .
CALL NILI
1234ABCD P1
0 P2
LOAD R0, (R_NILI) 0 R_NILI
STORE R0, (REZ) 1234ABCD PRVI
22445599 DRUGI
HALT
0 REZ
0 FFF8
0 FFFC
10000
© Kovač, Basch, FER, Zagreb 159
<<<< Izvođenje programa:
22445599 R0
GLAVNI MOVE 10000, SP R1
0
LOAD R0, (PRVI) 10000 R7 tj. SP
STORE R0, (P1)
LOAD R0, (DRUGI)
STORE R0, (P2) . . .
CALL NILI
1234ABCD P1
22445599 P2
LOAD R0, (R_NILI) 0 R_NILI
STORE R0, (REZ) 1234ABCD PRVI
22445599 DRUGI
HALT
0 REZ
0 FFF8
0 FFFC
10000
© Kovač, Basch, FER, Zagreb 160
<<<< Izvođenje programa:
22445599 R0
GLAVNI MOVE 10000, SP R1
0
LOAD R0, (PRVI) FFFC R7 tj. SP
STORE R0, (P1)
LOAD R0, (DRUGI)
STORE R0, (P2) . . .
CALL NILI
1234ABCD P1
22445599 P2
LOAD R0, (R_NILI) 0 R_NILI
STORE R0, (REZ) 1234ABCD PRVI
22445599 DRUGI
HALT
0 REZ
0 FFF8
00000018 FFFC
10000
© Kovač, Basch, FER, Zagreb 161
<<<< Izvođenje programa:
22445599 R0
NILI LOAD R0, (P1) R1
0
LOAD R1, (P2)
FFFC R7 tj. SP
OR R0, R1, R0
XOR R0, -1, R0
0 FFF8
00000018 FFFC
10000
© Kovač, Basch, FER, Zagreb 162
<<<< Izvođenje programa:
1234ABCD R0
NILI LOAD R0, (P1) R1
0
LOAD R1, (P2)
FFFC R7 tj. SP
OR R0, R1, R0
XOR R0, -1, R0
0 FFF8
00000018 FFFC
10000
© Kovač, Basch, FER, Zagreb 163
<<<< Izvođenje programa:
1234ABCD R0
NILI LOAD R0, (P1)
22445599 R1
LOAD R1, (P2)
FFFC R7 tj. SP
OR R0, R1, R0
XOR R0, -1, R0
0 FFF8
00000018 FFFC
10000
© Kovač, Basch, FER, Zagreb 164
<<<< Izvođenje programa:
3274FFDD R0
NILI LOAD R0, (P1)
22445599 R1
LOAD R1, (P2)
FFFC R7 tj. SP
OR R0, R1, R0
XOR R0, -1, R0
0 FFF8
00000018 FFFC
10000
© Kovač, Basch, FER, Zagreb 165
<<<< Izvođenje programa:
CD8B0022 R0
NILI LOAD R0, (P1)
22445599 R1
LOAD R1, (P2)
FFFC R7 tj. SP
OR R0, R1, R0
XOR R0, -1, R0
0 FFF8
00000018 FFFC
10000
© Kovač, Basch, FER, Zagreb 166
<<<< Izvođenje programa:
CD8B0022 R0
NILI LOAD R0, (P1)
22445599 R1
LOAD R1, (P2)
FFFC R7 tj. SP
OR R0, R1, R0
XOR R0, -1, R0
0 FFF8
00000018 FFFC
10000
© Kovač, Basch, FER, Zagreb 167
<<<< Izvođenje programa:
CD8B0022 R0
NILI LOAD R0, (P1)
22445599 R1
LOAD R1, (P2)
10000 R7 tj. SP
OR R0, R1, R0
XOR R0, -1, R0
0 FFF8
00000018 FFFC
10000
© Kovač, Basch, FER, Zagreb 168
<<<< Izvođenje programa:
CD8B0022 R0
GLAVNI MOVE 10000, SP
22445599 R1
LOAD R0, (PRVI) 10000 R7 tj. SP
STORE R0, (P1)
LOAD R0, (DRUGI)
STORE R0, (P2) . . .
CALL NILI
1234ABCD P1
22445599 P2
LOAD R0, (R_NILI) CD8B0022 R_NILI
STORE R0, (REZ) 1234ABCD PRVI
22445599 DRUGI
HALT
0 REZ
0 FFF8
00000018 FFFC
10000
© Kovač, Basch, FER, Zagreb 169
<<<< Izvođenje programa:
CD8B0022 R0
GLAVNI MOVE 10000, SP
22445599 R1
LOAD R0, (PRVI) 10000 R7 tj. SP
STORE R0, (P1)
LOAD R0, (DRUGI)
STORE R0, (P2) . . .
CALL NILI
1234ABCD P1
22445599 P2
LOAD R0, (R_NILI) CD8B0022 R_NILI
STORE R0, (REZ) 1234ABCD PRVI
22445599 DRUGI
HALT
0 REZ
0 FFF8
00000018 FFFC
10000
© Kovač, Basch, FER, Zagreb 170
<<<< Izvođenje programa:
CD8B0022 R0
GLAVNI MOVE 10000, SP
22445599 R1
LOAD R0, (PRVI) 10000 R7 tj. SP
STORE R0, (P1)
LOAD R0, (DRUGI)
STORE R0, (P2) . . .
CALL NILI
1234ABCD P1
22445599 P2
LOAD R0, (R_NILI) CD8B0022 R_NILI
STORE R0, (REZ) 1234ABCD PRVI
22445599 DRUGI
HALT
CD8B0022 REZ
0 FFF8
00000018 FFFC
10000
© Kovač, Basch, FER, Zagreb 171
<<<< Izvođenje programa:
CD8B0022 R0
GLAVNI MOVE 10000, SP
22445599 R1
LOAD R0, (PRVI) 10000 R7 tj. SP
STORE R0, (P1)
LOAD R0, (DRUGI)
STORE R0, (P2) . . .
CALL NILI
1234ABCD P1
22445599 P2
LOAD R0, (R_NILI) CD8B0022 R_NILI
STORE R0, (REZ) 1234ABCD PRVI
22445599 DRUGI
HALT
CD8B0022 REZ
0 FFF8
00000018 FFFC
10000
© Kovač, Basch, FER, Zagreb 172
<<<< (kompletan listing s komentarima)
; glavni program
GLAVNI MOVE 10000, SP ;važno: inicijaliziraj SP !!!
; stavi vrijednost u prvi parametar
LOAD R0, (PRVI)
STORE R0, (P1)
; stavi vrijednost u drugi parametar
LOAD R0, (DRUGI)
STORE R0, (P2)
HALT
>>>>
© Kovač, Basch, FER, Zagreb 173
<<<<
; potprogram NILI
NILI LOAD R0, (P1) ; dohvat prvog parametra
LOAD R1, (P2) ; dohvat drugog parametra
NILI
RET
GLAVNI ...
CALL NILI
LOAD R0, (R_NILI)
...
NILI PUSH R0
PUSH R1
... ; naredbe
... ; potprograma
POP R1
0 FFF0
POP R0 0 FFF4
RET 0 FFF8
0 FFFC
SP 10000
GLAVNI ...
CALL NILI
LOAD R0, (R_NILI)
...
NILI PUSH R0
PUSH R1
... ; naredbe
... ; potprograma
POP R1
0 FFF0
POP R0 0 FFF4
RET 0 FFF8
povr.adr FFFC
SP 10000
GLAVNI ...
CALL NILI
LOAD R0, (R_NILI)
...
NILI PUSH R0
PUSH R1
... ; naredbe
... ; potprograma
POP R1
0 FFF0
POP R0 0 FFF4
RET 0 FFF8
povr.adr FFFC
SP 10000
GLAVNI ...
CALL NILI
LOAD R0, (R_NILI)
...
NILI PUSH R0
PUSH R1
... ; naredbe
... ; potprograma
POP R1
0 FFF0
POP R0 0 FFF4
RET R0 FFF8
povr.adr FFFC
SP 10000
GLAVNI ...
CALL NILI
LOAD R0, (R_NILI)
...
NILI PUSH R0
PUSH R1
... ; naredbe
... ; potprograma
POP R1
0 FFF0
POP R0 R1 FFF4
RET R0 FFF8
povr.adr FFFC
SP 10000
GLAVNI ...
CALL NILI
Registri R0 i R1 se mijenjaju.
LOAD R0, (R_NILI)
... Stanje stoga se ne mijenja
(smije se mijenjati, ako nakon
NILI PUSH R0 naredaba potprograma stanje
PUSH R1 bude jednako kao prije njih)
... ; naredbe
... ; potprograma
POP R1
0 FFF0
POP R0 R1 FFF4
RET R0 FFF8
povr.adr FFFC
SP 10000
GLAVNI ...
CALL NILI
LOAD R0, (R_NILI)
...
Registar R1 se obnavlja.
NILI PUSH R0
PUSH R1
... ; naredbe
... ; potprograma
POP R1
0 FFF0
POP R0 R1 FFF4
RET R0 FFF8
povr.adr FFFC
SP 10000
GLAVNI ...
CALL NILI
LOAD R0, (R_NILI)
...
GLAVNI ...
CALL NILI
LOAD R0, (R_NILI)
...
NILI PUSH R0
PUSH R1
... ; naredbe
... ; potprograma
POP R1
0 FFF0
POP R0 R1 FFF4
RET R0 FFF8
povr.adr FFFC
SP 10000
GLAVNI ...
CALL NILI
LOAD R0, (R_NILI)
...
NILI PUSH R0
PUSH R1
... ; naredbe
... ; potprograma
POP R1
0 FFF0
POP R0 R1 FFF4
RET R0 FFF8
povr.adr FFFC
SP 10000
• Nedostatci:
• Sporiji rad s memorijskim lokacijama, nego s registrima (upis
i čitanje)
• Nešto duži i kompliciraniji program, nego kad se koriste
registri
• Nije moguće rekurzivno pozivanje potprograma
>>>>
CALL NILI
POP R0
STORE R0, (REZ)
HALT
0 FFF0
0 FFF4
0 FFF8
0 FFFC
10000
© Kovač, Basch, FER, Zagreb 194
<<<< Izvođenje programa:
0 R0
GLAVNI MOVE 10000, SP R1
0
LOAD R0, (PRVI) R2
0
PUSH R0
LOAD R0, (DRUGI) 10000 R7 tj. SP
PUSH R0
CALL NILI
POP R0
STORE R0, (REZ)
HALT
0 FFF0
0 FFF4
0 FFF8
0 FFFC
10000
© Kovač, Basch, FER, Zagreb 195
<<<< Izvođenje programa:
param.1 R0
GLAVNI MOVE 10000, SP R1
0
LOAD R0, (PRVI) R2
0
PUSH R0
LOAD R0, (DRUGI) 10000 R7 tj. SP
PUSH R0
CALL NILI
POP R0
STORE R0, (REZ)
HALT
0 FFF0
0 FFF4
0 FFF8
0 FFFC
10000
© Kovač, Basch, FER, Zagreb 196
<<<< Izvođenje programa:
param.1 R0
GLAVNI MOVE 10000, SP R1
0
LOAD R0, (PRVI) R2
0
PUSH R0
LOAD R0, (DRUGI) FFFC R7 tj. SP
PUSH R0
CALL NILI
POP R0
STORE R0, (REZ)
HALT
0 FFF0
0 FFF4
0 FFF8
param.1 FFFC
10000
© Kovač, Basch, FER, Zagreb 197
<<<< Izvođenje programa:
param.2 R0
GLAVNI MOVE 10000, SP R1
0
LOAD R0, (PRVI) R2
0
PUSH R0
LOAD R0, (DRUGI) FFFC R7 tj. SP
PUSH R0
CALL NILI
POP R0
STORE R0, (REZ)
HALT
0 FFF0
0 FFF4
0 FFF8
param.1 FFFC
10000
© Kovač, Basch, FER, Zagreb 198
<<<< Izvođenje programa:
param.2 R0
GLAVNI MOVE 10000, SP R1
0
LOAD R0, (PRVI) R2
0
PUSH R0
LOAD R0, (DRUGI) FFF8 R7 tj. SP
PUSH R0
CALL NILI
POP R0
STORE R0, (REZ)
HALT
0 FFF0
0 FFF4
param.2 FFF8
param.1 FFFC
10000
© Kovač, Basch, FER, Zagreb 199
<<<< Izvođenje programa:
param.2 R0
GLAVNI MOVE 10000, SP R1
0
LOAD R0, (PRVI) R2
0
PUSH R0
LOAD R0, (DRUGI) FFF4 R7 tj. SP
PUSH R0
CALL NILI
POP R0
STORE R0, (REZ)
HALT
0 FFF0
pov.adr. FFF4
param.2 FFF8
param.1 FFFC
10000
© Kovač, Basch, FER, Zagreb 200
<<<< Izvođenje programa:
param.2 R0
NILI POP R2 R1
0
POP R0
POP R1 0 R2
PUSH R0
PUSH R2
RET
0 FFF0
pov.adr. FFF4
param.2 FFF8
param.1 FFFC
10000
© Kovač, Basch, FER, Zagreb 201
<<<< Izvođenje programa:
param.2 R0
NILI POP R2 R1
0
POP R0
POP R1 pov.adr. R2
PUSH R0
PUSH R2
RET
0 FFF0
pov.adr. FFF4
param.2 FFF8
param.1 FFFC
10000
© Kovač, Basch, FER, Zagreb 202
<<<< Izvođenje programa:
param.2 R0
NILI POP R2 R1
0
POP R0
POP R1 pov.adr. R2
PUSH R0
PUSH R2
RET
0 FFF0
pov.adr. FFF4
param.2 FFF8
param.1 FFFC
10000
© Kovač, Basch, FER, Zagreb 203
<<<< Izvođenje programa:
param.2 R0
NILI POP R2
param.1 R1
POP R0
POP R1 pov.adr. R2
PUSH R0
PUSH R2
RET
0 FFF0
pov.adr. FFF4
param.2 FFF8
param.1 FFFC
10000
© Kovač, Basch, FER, Zagreb 204
<<<< Izvođenje programa:
rezult R0
NILI POP R2
param.1 R1
POP R0
POP R1 pov.adr. R2
PUSH R0
PUSH R2
RET
0 FFF0
pov.adr. FFF4
param.2 FFF8
param.1 FFFC
10000
© Kovač, Basch, FER, Zagreb 205
<<<< Izvođenje programa:
rezult R0
NILI POP R2
param.1 R1
POP R0
POP R1 pov.adr. R2
PUSH R0
PUSH R2
RET
0 FFF0
pov.adr. FFF4
param.2 FFF8
rezult FFFC
10000
© Kovač, Basch, FER, Zagreb 206
<<<< Izvođenje programa:
rezult R0
NILI POP R2
param.1 R1
POP R0
POP R1 pov.adr. R2
PUSH R0
PUSH R2
RET
0 FFF0
pov.adr. FFF4
pov.adr. FFF8
rezult FFFC
10000
© Kovač, Basch, FER, Zagreb 207
<<<< Izvođenje programa:
rezult R0
NILI POP R2
param.1 R1
POP R0
POP R1 pov.adr. R2
PUSH R0
PUSH R2
RET
0 FFF0
pov.adr. FFF4
pov.adr. FFF8
rezult FFFC
10000
© Kovač, Basch, FER, Zagreb 208
<<<< Izvođenje programa:
rezult R0
param.1 R1
pov.adr. R2
GLAVNI MOVE 10000, SP
FFFC R7 tj. SP
LOAD R0, (PRVI)
PUSH R0
LOAD R0, (DRUGI)
PUSH R0
CALL NILI
POP R0
STORE R0, (REZ) 0 FFF0
pov.adr. FFF4
HALT
pov.adr. FFF8
rezult FFFC
10000
© Kovač, Basch, FER, Zagreb 209
<<<< Izvođenje programa:
rezult R0
param.1 R1
pov.adr. R2
GLAVNI MOVE 10000, SP
10000 R7 tj. SP
LOAD R0, (PRVI)
PUSH R0
LOAD R0, (DRUGI)
PUSH R0
CALL NILI
POP R0
STORE R0, (REZ) 0 FFF0
pov.adr. FFF4
HALT
pov.adr. FFF8
rezult FFFC
10000
© Kovač, Basch, FER, Zagreb 210
<<<< Izvođenje programa:
rezult R0
- dohvaćeni rezultat se koristi
param.1 R1
- stog je u početnom stanju
pov.adr. R2
GLAVNI MOVE 10000, SP
10000 R7 tj. SP
LOAD R0, (PRVI)
PUSH R0
LOAD R0, (DRUGI) ALI: registri R0, R1, R2
PUSH R0 su promjenjeni !!!
CALL NILI
POP R0
STORE R0, (REZ) 0 FFF0
pov.adr. FFF4
HALT
pov.adr. FFF8
rezult FFFC
10000
© Kovač, Basch, FER, Zagreb 211
<<<< (kompletan listing s komentarima)
; glavni program
GLAVNI MOVE 10000, SP ;važno: inicijaliziraj SP !!!
; stavi vrijednost prvog parametra na stog
LOAD R0, (PRVI)
PUSH R0
; stavi vrijednost drugog parametra na stog
LOAD R0, (DRUGI)
PUSH R0
HALT
>>>>
© Kovač, Basch, FER, Zagreb 212
<<<<
; potprogram NILI
NILI POP R2 ; uzmi povratnu adresu sa stoga
POP R0 ; dohvat prvog parametra
POP R1 ; dohvat drugog parametra
SP 0 FFE0
0 FFE4
0 FFE8
0 FFEC
0 FFF0
0 FFF4
0 FFF8
0 FFFC
10000
SP 0 FFE0
Izvodi se:
0 FFE4
0 FFE8
Glavni program stavlja dva
0 FFEC
parametra na stog
0 FFF0
0 FFF4
par.2 FFF8
par.1 FFFC
10000
SP 0 FFE0
Izvodi se:
0 FFE4
0 FFE8
0 FFEC
0 FFF0
Pov.adr. FFF4
Glavni program poziva
potprogram
par.2 FFF8
par.1 FFFC
10000
SP 0 FFE0
Izvodi se:
0 FFE4
R2 FFE8
Potprogram sprema registre R1 FFEC
(koje će mijenjati) na stog
R0 FFF0
(npr. tri registra R0, R1, R2) Pov.adr. FFF4
par.2 FFF8
par.1 FFFC
10000
SP 0 FFE0
0 FFE4
R2 FFE8
R1 FFEC
? R0
Pov.adr.
FFF0
FFF4
par.2 FFF8
Kako dohvatiti parametre ?
par.1 FFFC
10000
SP 0 FFE0
0 FFE4
R2 FFE8
Da smo prije spremanja R1 FFEC
registara dohvatili
parametre, onda bi uništili
R0 FFF0
registre prije nego ih Pov.adr. FFF4
spremimo: par.2 FFF8
par.1 FFFC
10000
?
© Kovač, Basch, FER, Zagreb 220
Potprogrami - Prijenos stogom
Promatramo stanje na stogu za potprogram koji bi spremao
registre na stog.
SP 0 FFE0
0 FFE4
R2 FFE8
Jedna mogućnost (LOŠA!!!) R1 FFEC
je da presložimo podatke na
stogu korištenjem fiksnih
R0 FFF0
memorijskih lokacija Pov.adr. FFF4
(npr. tako da parametri dođu par.2 FFF8
na vrh stoga) par.1 FFFC
10000
SP 0 FFE0
0 FFE4
R2 FFE8
Rješenje bi bilo kad ne bi R1 FFEC
morali pristupati podatcima
na stogu samo pomoću
R0 FFF0
PUSH i POP. Pov.adr. FFF4
par.2 FFF8
Kako možemo pristupiti par.1 FFFC
podatcima "ispod" vrha 10000
stoga, bez pomicanja vrha
stoga?
SP 0 FFE0
0 FFE4
R2 FFE8
Rješenje je R1 FFEC
jednostavno: R0 FFF0
Pov.adr. FFF4
Registarsko indirektno par.2 FFF8
adresiranje s odmakom, par.1 FFFC
pri čemu kao adresni 10000
registar koristimo SP
SP 0 FFE0
0 FFE4
(SP+0) R2 FFE8
(SP+4) R1 FFEC
Adrese se (SP+8) R0 FFF0
zadaju ovako (SP+C) Pov.adr. FFF4
(SP+10) par.2 FFF8
(SP+14) par.1 FFFC
10000
Naredbama LOAD i STORE
možemo pristupati
podatcima "unutar" stoga.
SP 0 FFE0
Izvodi se:
0 FFE4
Obnavljaju se registri
0 FFE8
R0, R1 i R2. 0 FFEC
0 FFF0
Povratak se lako Pov.adr. FFF4
ostavaruje sa RET par.2 FFF8
par.1 FFFC
Ali, obnavljanjem R0
gubi se rezultat !!! 10000
Rješenje:
• U ovom rješenju potprogram mijenja registre R1 i R2 i sprema
ih na stog (R0 se također mijenja, ali preko njega se ionako vraća
povratna vrijednost)
• Parametrma se pristupa registarskim indirektnim adresiranjem
s odmakom (korištenjem SP-a kao adresnog registra)
>>>>
© Kovač, Basch, FER, Zagreb 233
<<<< Izvođenje programa:
0 R0
GLAVNI MOVE 10000, SP R1
R1
LOAD R0, (PRVI) R2
R2
PUSH R0
LOAD R0, (DRUGI) 0 R7 tj. SP
PUSH R0
CALL NILI
CALL NILI
CALL NILI
CALL NILI
CALL NILI
CALL NILI
CALL NILI
POP R2
POP R1
RET
0 FFE8
0 FFEC
0 FFF0
pov.adr. FFF4
param.2 FFF8
param.1 FFFC
10000
© Kovač, Basch, FER, Zagreb 241
<<<< Izvođenje programa:
param.2 R0
NILI PUSH R1 R1
R1
PUSH R2
R2 R2
LOAD R1, (SP+0C)
LOAD R2, (SP+10) FFF0 R7 tj. SP
OR R1, R2, R0
XOR R0, -1, R0
POP R2
POP R1
RET
0 FFE8
0 FFEC
R1 FFF0
pov.adr. FFF4
param.2 FFF8
param.1 FFFC
10000
© Kovač, Basch, FER, Zagreb 242
<<<< Izvođenje programa:
param.2 R0
NILI PUSH R1 R1
R1
PUSH R2
R2 R2
LOAD R1, (SP+0C)
LOAD R2, (SP+10) FFEC R7 tj. SP
OR R1, R2, R0
XOR R0, -1, R0
POP R2
POP R1
RET
0 FFE8
R2 FFEC
R1 FFF0
pov.adr. FFF4
param.2 FFF8
param.1 FFFC
10000
© Kovač, Basch, FER, Zagreb 243
<<<< Izvođenje programa:
param.2 R0
NILI PUSH R1
param.2 R1
PUSH R2
R2 R2
LOAD R1, (SP+0C)
LOAD R2, (SP+10) FFEC R7 tj. SP
OR R1, R2, R0
XOR R0, -1, R0
POP R2
POP R1
RET
0 FFE8
R2 FFEC
R1 FFF0
pov.adr. FFF4
(SP+0C) param.2 FFF8
param.1 FFFC
10000
© Kovač, Basch, FER, Zagreb 244
<<<< Izvođenje programa:
param.2 R0
NILI PUSH R1
param.2 R1
PUSH R2
param.1 R2
LOAD R1, (SP+0C)
LOAD R2, (SP+10) FFEC R7 tj. SP
OR R1, R2, R0
XOR R0, -1, R0
POP R2
POP R1
RET
0 FFE8
R2 FFEC
R1 FFF0
pov.adr. FFF4
param.2 FFF8
(SP+10) param.1 FFFC
10000
© Kovač, Basch, FER, Zagreb 245
<<<< Izvođenje programa:
rezult R0
NILI PUSH R1
param.2 R1
PUSH R2
param.1 R2
LOAD R1, (SP+0C)
LOAD R2, (SP+10) FFEC R7 tj. SP
OR R1, R2, R0
XOR R0, -1, R0
POP R2
POP R1
RET
0 FFE8
R2 FFEC
R1 FFF0
pov.adr. FFF4
param.2 FFF8
param.1 FFFC
10000
© Kovač, Basch, FER, Zagreb 246
<<<< Izvođenje programa:
rezult R0
NILI PUSH R1
param.2 R1
PUSH R2
R2 R2
LOAD R1, (SP+0C)
LOAD R2, (SP+10) FFF0 R7 tj. SP
OR R1, R2, R0
XOR R0, -1, R0
POP R2
POP R1
RET
0 FFE8
R2 FFEC
R1 FFF0
pov.adr. FFF4
param.2 FFF8
param.1 FFFC
10000
© Kovač, Basch, FER, Zagreb 247
<<<< Izvođenje programa:
rezult R0
NILI PUSH R1 R1
R1
PUSH R2
R2 R2
LOAD R1, (SP+0C)
LOAD R2, (SP+10) FFF4 R7 tj. SP
OR R1, R2, R0
XOR R0, -1, R0
POP R2
POP R1
RET
0 FFE8
R2 FFEC
R1 FFF0
pov.adr. FFF4
param.2 FFF8
param.1 FFFC
10000
© Kovač, Basch, FER, Zagreb 248
<<<< Izvođenje programa:
rezult R0
NILI PUSH R1 R1
R1
PUSH R2
R2 R2
LOAD R1, (SP+0C)
LOAD R2, (SP+10) FFF8 R7 tj. SP
OR R1, R2, R0
XOR R0, -1, R0
POP R2
POP R1
RET
0 FFE8
R2 FFEC
R1 FFF0
pov.adr. FFF4
param.2 FFF8
param.1 FFFC
10000
© Kovač, Basch, FER, Zagreb 249
<<<< Izvođenje programa:
rezult R0
GLAVNI MOVE 10000, SP R1
R1
LOAD R0, (PRVI) R2
R2
PUSH R0
LOAD R0, (DRUGI) FFF8 R7 tj. SP
PUSH R0
CALL NILI
CALL NILI
CALL NILI
; glavni program
GLAVNI MOVE 10000, SP ;važno: inicijaliziraj SP !!!
LOAD R0, (PRVI) ; stavi vrijednost
PUSH R0 ; prvog parametra na stog
LOAD R0, (DRUGI) ; stavi vrijednost
PUSH R0 ; drugog parametra na stog
CALL NILI ; poziv potprograma
STORE R0, (REZ) ; spremi rezultat iz R0
ADD SP, 8, SP ; ukloni parametre sa stoga
HALT
POP R2 ; Obnovi
POP R1 ; registre.
RET
>>>>
R2
spremljeni registri
R1
OKVIR pov.adr. povratna adresa
param.2
parametri
param.1
>>>>
© Kovač, Basch, FER, Zagreb 257
<<<<
• Potpunija verzija stogovnog okvira uključuje i lokalne varijable
• Lokalne varijable se stavljaju na stog nakon ulaska u
potprogram, a mogu se staviti "ispod" ili "iznad" spremljenih
registara. Ovdje je odabrano da se stave "iznad" njih:
y
lokalne varijable
x
R2
spremljeni registri
OKVIR R1
pov.adr. povratna adresa
param.2
parametri
param.1
Važna napomena:
Prevoditelj u stvarnosti obično pokušava staviti lokalne varijable u
registre, a tek kad se oni napune stavlja lokalne varijable na stog
© Kovač, Basch, FER, Zagreb 258
Rekapitulacija okvira stoga
• Okvir stoga sadrži:
• parametre y
lokalne varijable
• povratnu adresu x
• spremljene registre R2
spremljeni registri
• lokalne varijable OKVIR R1
pov.adr. povratna adresa
• Način rada s okvirom: param.2
• Glavni program: parametri
param.1
• stavlja parametre
• stavlja povratnu adresu (CALL)
• uklanja parametre
• Potprogram:
• sprema i obnavlja registre
• stvara i uklanja lokalne varijable
• uklanja povratnu adresu (RET)
SP
SP
param.n
Pozovi potprogram
SP
pov.adr.
param.n
Pozovi potprogram
Spremi registre
R2
SP
R1
pov.adr.
param.n
Pozovi potprogram
y
Spremi registre x
R2
SP
Stvori lokalne varijable R1
pov.adr.
param.n
Pozovi potprogram
y
Spremi registre x
R2
SP
Stvori lokalne varijable R1
pov.adr.
Izvođenje (okvir se ne mijenja) param.n
(ali se mogu mijenjati podatci u okviru,
npr. parametri i lokalne varijable)
Pozovi potprogram
Spremi registre
R2
SP
Stvori lokalne varijable R1
pov.adr.
Izvođenje (okvir se ne mijenja) param.n
Pozovi potprogram
Spremi registre
SP
Stvori lokalne varijable
pov.adr.
Izvođenje (okvir se ne mijenja) param.n
Spremi registre
SP
Stvori lokalne varijable
Spremi registre
SP
Stvori lokalne varijable
Ukloni parametre
Rješenje:
Pokažimo prvo kako će izgledati okvir stoga:
(SP+00) R2
spremljeni registri
(SP+04) R1
(SP+08) pov.adr.
OKVIR
povratna adresa
(SP+0C) param. n parametar
MOVE 4, R0
PUSH R0
CALL FAKT
STORE R0, (REZULT)
ADD SP, 4, SP
HALT
REZULT DW 0
Rješenje:
• Radi lakšeg objašnjenja, pokažimo prvo kako bi rješenje moglo
izgledati u programskom jeziku C
>>>>
main () {
int rez;
rez = fib ( 8 );
}
>>>>
>>>>
; glavni program
HALT
>>>>
>>>>
© Kovač, Basch, FER, Zagreb 279
<<<< ; n nije ni 1 ni 2 - nastavak izvođenja
; x = fib(n-1)
LOAD R1, (SP+14) ; dohvati parametar n
SUB R1, 1, R1 ; Oduzmi n-1 i stavi na stog
PUSH R1 ; za prvi rekurzivni poziv.
CALL FIB ; pozovi fib(n-1)
ADD SP, 4, SP ; ukloni n-1 sa stoga
STORE R0, (SP+4) ; spremi rezultat u x
; y = fib(n-2)
LOAD R1, (SP+14) ; dohvati parametar n
SUB R1, 2, R1 ; Oduzmi n-2 i stavi na stog
PUSH R1 ; za drugi rekurzivni poziv.
CALL FIB ; pozovi fib(n-2)
ADD SP, 4, SP ; ukloni n-2 sa stoga
STORE R0, (SP+0) ; spremi rezultat u y
>>>>
okviri na stogu
fib(4)
okviri na stogu
fib(3)
fib(4)
okviri na stogu
fib(2)
fib(3)
fib(4)
okviri na stogu
fib(3)
fib(4)
okviri na stogu
fib(1)
fib(3)
fib(4)
okviri na stogu
fib(3)
fib(4)
okviri na stogu
fib(4)
okviri na stogu
fib(2)
fib(4)
okviri na stogu
fib(4)
okviri na stogu
okviri na stogu
okviri na stogu
Makronaredbe
IME_MAKRONAREDBE `MACRO
ADD R0, R1, R2 Tijelo
... makronaredbe
STORE R5, (20)
`ENDMACRO
Oznaka kraja
Rješenje:
; DEFINICIJA MAKRONAREDBE
NILI `MACRO
OR R0, R1, R2
XOR R2, -1, R2
`ENDMACRO
>>>>
© Kovač, Basch, FER, Zagreb 298
<<<<
;;;;;; GLAVNI PROGRAM
LOAD R0, (PRVI) ; DOHVATI PODATKE
LOAD R1, (DRUGI) ; U R0 i R1
NILI ; POZOVI MAKRONAREDBU
STORE R2, (REZ) ; SPREMI REZULTAT
HALT
;;;;;; PODATCI I MJESTO ZA REZULTAT
PRVI DW 81282C34
DRUGI DW 29A82855
REZ DW 0
>>>>
prvi prolaz
NILI `MACRO
OR R0, R1, R2 GLAVNI LOAD R0,(PRVI)
XOR R2, -1, R2 LOAD R1,(DRUGI)
`ENDMACRO
OR R0, R1, R2
GLAVNI LOAD R0,(PRVI)
XOR R2, -1, R2
LOAD R1,(DRUGI)
NILI STORE R2,(REZ)
STORE R2,(REZ) HALT
HALT
Prvi prolaz:
• Asembler čita redak po redak datoteke:
• Ako naiđe na definciju makronaredbe, onda u tablici
makronaredbi zapamti njeno ime i tijelo (slično kao što
dvoprolazni asembler nailaskom na labelu u tablici labela pamti
njeno ime i vrijednost)
• Prevoditelj ne mijenja ostale retke mnemoničkog programa
• Na kraju prvog prolaska, mnemonička datoteka više nema
definicija makronaredaba, ali sadrži pozive makronaredaba.
>>>>
© Kovač, Basch, FER, Zagreb 304
Makronaredbe - Četveroprolazni asembler
<<<<
Drugi prolaz:
• Drugi prolaz zamijenjuje sve pozive makronaredba njihovim
tijelima što daje obični mnemonički program
Rješenje:
na sljedećem slajdu
>>>>
© Kovač, Basch, FER, Zagreb 307
<<<<
; DEFINICIJA MAKRONAREDBE
NILI `MACRO P1, P2, REZ
LOAD R0, (P1)
LOAD R1, (P2)
OR R0, R1, R2
XOR R2, -1, R2
STORE R2, (REZ)
`ENDMACRO
; GLAVNI PROGRAM
NILI PRVI, DRUGI, REZULT ;;;; POZIV
HALT
HALT
PRVI DW 81282C34
DRUGI DW 29A82855
REZULT DW 0
>>>>
© Kovač, Basch, FER, Zagreb 309
Usporedba makronaredaba i potprograma
• Makronaredbe općenito troše više memorije jer njihovo tijelo
u memoriji postoji u više primjeraka (onoliko koliko ima
poziva). Potprogrami se u memoriji nalaze samo u jednom
primjerku.
Ostali primjeri
A B ¤ ¤ C D ¤ F ¤ ¤ ¤ G \0
stanje bajtova
nije važno
• "Slova" (žuti) se kopiraju
>>>>
• Razmaci označeni sa ¤ (zeleni) se sažimaju
© Kovač, Basch, FER, Zagreb 315
Ostali primjeri
Rješenje:
Upotrijebiti dva pokazivača:
• jedan čita znakove izvornog niza (R1)
• drugi pokazuje mjesto na koji se kopira znak izvornog niza (R2)
R1
A B ¤ ¤ C D ¤ F ¤ ¤ ¤ G \0
R2
>>>>
R1
A B ¤ ¤ C D ¤ F ¤ ¤ ¤ G \0
R2
>>>>
R1
A B ¤ ¤ C D ¤ F ¤ ¤ ¤ G \0
R2
>>>>
R1
A B ¤ ¤ C D ¤ F ¤ ¤ ¤ G \0
A B
R2
>>>>
R1
A B ¤ ¤ C D ¤ F ¤ ¤ ¤ G \0
A B ¤
R2
>>>>
A B ¤ ¤ C D ¤ F ¤ ¤ ¤ G \0
A B ¤
R2
>>>>
>>>>
SLOVO_PA_SLOVO
STOREB R3, (R2) ; Kopiraj znak
ADD R1, 1, R1 ; Pomakni R1 i R2
ADD R2, 1, R2
JR PETLJA
RAZMAK_PA_SLOVO
MOVE SLO, R0 ; stanje = slovo
STOREB R3, (R2) ; Kopiraj znak
ADD R1, 1, R1 ; Pomakni R1 i R2
ADD R2, 1, R2
JR PETLJA >>>>
© Kovač, Basch, FER, Zagreb 324
<<<< ; TRENUTAČNI ZNAK JE RAZMAK
SLOVO_PA_RAZMAK
MOVE RAZ, R0 ; stanje = razmak
STOREB R3, (R2) ; Kopiraj znak
ADD R1, 1, R1 ; Pomakni R1 i R2
ADD R2, 1, R2
JR PETLJA
RAZMAK_PA_RAZMAK
ADD R1, 1, R1 ; Pomakni R1
JR PETLJA
>>>>
; definiranje "konstanti"
SLO `EQU 0
RAZ `EQU 1
∑ 33 3 9 9 12
Prvi čvor liste ima specijalno značenje i u njemu se pamti zbroj svih
vrijednosti preostalih čvorova liste. Prvi čvor je uvijek prisutan, bez
obzira postoje li ostali čvorovi. Pretpostavka je da u zbroju nikada neće
doći do prekoračenja opsega.
Zadnji čvor u listi prepoznaje se po NULL-pokazivaču (tj. lokacija s
pokazivačem sljedećeg čvora sadrži ništicu).
>>>>
© Kovač, Basch, FER, Zagreb 327
Ostali primjeri
<<<<
Rješenje:
pokazivač
∑ 33 2 3 9 12
Novi element
© Kovač, Basch, FER, Zagreb 329
Ostali primjeri
<<<< Idejno rješenje:
• Mjesto za ubacivanje je ISPRED prvog čvora koji ima veću ili jednaku
vrijednost novom čvoru.
pokazivač
∑ 33 2 3 9 12
Novi element
© Kovač, Basch, FER, Zagreb 330
Ostali primjeri
<<<< Idejno rješenje:
• Budući da se čvor mora ubaciti ISPRED čvora na kojeg pokazuje
pokazivač, onda ne možemo dohvatiti prethodni čvor u kojem treba
promijeniti pokazivač na sljedeći (plava strelica)
pokazivač
∑ 33 2 3 9 12
Novi element
© Kovač, Basch, FER, Zagreb 331
Ostali primjeri
<<<< Idejno rješenje:
• Zato trebamo još jedan pokazivač koji će uvijek "kasniti" za jedan čvor
u odnosu na pokazivač ispitivanog čvora, tj. pokazivač će pokazivati
jedan čvor ispred onog čvora kojeg ispitujemo
pokazivač
koji "kasni" pokazivač
∑ 33 2 3 9 12
Novi element
© Kovač, Basch, FER, Zagreb 332
Ostali primjeri
Način rada potprograma:
R1 R2
∑ 33 2 3 9 12
5
R0
Novi element
© Kovač, Basch, FER, Zagreb 333
Ostali primjeri
Način rada potprograma:
R1 R2
∑ 33 2 3 9 12
Je li (5 ≤ 2) ?
5
R0
Novi element
© Kovač, Basch, FER, Zagreb 334
Ostali primjeri
Način rada potprograma:
R1 R2
∑ 33 2 3 9 12
Je li (5 ≤ 2) ?
5 Ako jeste:
R0 našli smo mjesto za ubacivanje
Novi element
© Kovač, Basch, FER, Zagreb 335
Ostali primjeri
Način rada potprograma:
R1 R2
∑ 33 2 3 9 12
Je li (5 ≤ 2) ?
5 Ako nije:
R0 nastavljamo traženje
Novi element
© Kovač, Basch, FER, Zagreb 336
Ostali primjeri
Način rada potprograma:
R1 R2 Pomičemo R1 i R2 za
jedan čvor dalje
∑ 33 2 3 9 12
5
R0
Novi element
© Kovač, Basch, FER, Zagreb 337
Ostali primjeri
Način rada potprograma:
R1 R2 Pomičemo R1 i R2 za
jedan čvor dalje
∑ 33 2 3 9 12
5
R0
Novi element
© Kovač, Basch, FER, Zagreb 338
Ostali primjeri
Način rada potprograma:
R1 R2
∑ 33 2 3 9 12
Je li (5 ≤ 3) ?
5 Nije: tražimo dalje
R0
Novi element
© Kovač, Basch, FER, Zagreb 339
Ostali primjeri
Način rada potprograma:
R1 R2 Pomičemo R1 i R2 za
jedan čvor dalje
∑ 33 2 3 9 12
5
R0
Novi element
© Kovač, Basch, FER, Zagreb 340
Ostali primjeri
Način rada potprograma:
R1 R2 Pomičemo R1 i R2 za
jedan čvor dalje
∑ 33 2 3 9 12
5
R0
Novi element
© Kovač, Basch, FER, Zagreb 341
Ostali primjeri
Način rada potprograma:
R1 R2
∑ 33 2 3 9 12
Je li (5 ≤ 9) ?
5 Jeste: mjesto ubacivanja je
R0
pronađeno - iza čvora na kojeg
pokazuje R1
Novi element
© Kovač, Basch, FER, Zagreb 342
Ostali primjeri
Način rada potprograma:
R1 R2
Prespajamo pokazivače
∑ 33 2 3 9 12
5
R0
Novi element
© Kovač, Basch, FER, Zagreb 343
Ostali primjeri
Način rada potprograma:
R1 R2
Prespajamo pokazivače
∑ 33 2 3 9 12
5
R0
Novi element
© Kovač, Basch, FER, Zagreb 344
Ostali primjeri
Način rada potprograma:
R1 R2
Prespajamo pokazivače
∑ 33 2 3 9 12
5
R0
Novi element
© Kovač, Basch, FER, Zagreb 345
Ostali primjeri
Način rada potprograma:
R1 R2
∑ 33 2 3 9 12
505
R0
Novi element
© Kovač, Basch, FER, Zagreb 346
Ostali primjeri
Način rada potprograma:
R1 R2 R1 i R2 se pomiču za
jedan čvor dalje
∑ 33 2 3 9 12
505
R0
Novi element
© Kovač, Basch, FER, Zagreb 347
Ostali primjeri
R1 R2 R1 i R2 se pomiču za
jedan čvor dalje
∑ 33 2 3 9 12
505
R0
Novi element
© Kovač, Basch, FER, Zagreb 348
Ostali primjeri
Način rada potprograma:
R1 R2 I to se ponavlja ...
∑ 33 2 3 9 12
505
R0
Novi element
© Kovač, Basch, FER, Zagreb 349
Ostali primjeri
Način rada potprograma:
R1 R2 I to se ponavlja ...
∑ 33 2 3 9 12
505
R0
Novi element
© Kovač, Basch, FER, Zagreb 350
Ostali primjeri
Način rada potprograma:
∑ 33 2 3 9 12
505
R0
Novi element
© Kovač, Basch, FER, Zagreb 351
Ostali primjeri
Način rada potprograma:
∑ 33 2 3 9 12
505
R0
Novi element
© Kovač, Basch, FER, Zagreb 352
Ostali primjeri
Način rada potprograma:
∑ 33 2 3 9 12
505
R0
Novi element
© Kovač, Basch, FER, Zagreb 353
Ostali primjeri
Način rada potprograma:
∑ 33 2 3 9 12
505
R0
Novi element
© Kovač, Basch, FER, Zagreb 354
Ostali primjeri
Način rada potprograma:
∑ 33 2 3 9 12
>>>>
© Kovač, Basch, FER, Zagreb 356
<<<<
;;;; PETLJA ZA TRAŽENJE MJESTA ZA UBACIVANJE
>>>>
© Kovač, Basch, FER, Zagreb 357
<<<<
;;;; DIO ZA UMETANJE NOVOG ČVORA U LISTU
POP R6 ; obnovi
POP R5 ; vrijednosti
POP R2 ; spremljenih
POP R1 ; registara
RET
#4 8 276 8 12
>>>>
Rješenje:
#4 8 276 8 12
R2 X
Pomičemo R1 za jedan
čvor dalje ...
R1
#4 8 276 8 12
R2 X
Pomičemo R1 za jedan
čvor dalje ...
I to se ponavlja sve
R1 dok...
#4 8 276 8 12
R2 X
#4 8 276 8 12
R2 X
#4 8 276 8 12
R2 X
#4 8 276 8 12
R2 X
R0 8
R1
#4 8 276 8 12
R0 R1 R2
#4 8 276 8 12
Pokazivači u čvorovima se
prespajaju ovako:
R0 R1 R2
#4 8 276 8 12
7
24
3 12 29
8 25 43
>>>>