Podprogrami in uporaba sklada
Primer: - podprograma za kvadriranje in
seštevanje -
| Sestavimo program, ki
izračuna kvadratno (a*a) vrednost desetih števil, ki so
zapisana po vrsti od naslova $3000 dalje (0,1,2,3,4,5,6,7,8,9).
Izračun enačbe naj se izvrši v podprogramu.
Rezultate zapišimo na mesto števil. Z drugim
podprogramom izračunaj vsote parov kvadratov števil
(prvi + drugi rez., tretji + četrti rez. ...). Ta podprogram
naj se nahaja na naslovu $5000, rezultati pa na $3010. Program naj
se nahaja v pomnilniku na naslovu $4000. Pazi na nastavitev kazalca
sklada! ($F000) |
|
|
org $fffe
fdb start
org $3000
x0 fcb 0
x1 fcb 1
x2 fcb 2
x3 fcb 3
x4 fcb 4
x5 fcb 5
x6 fcb 6
x7 fcb 7
x8 fcb 8
x9 fcb 9
org $3010
r1 rmb 1
r2 rmb 1
r3 rmb 1
r4 rmb 1
r5 rmb 1
org $5000
sestej LDX #$3010
ABX
PSHX
LDX #$3000
TAB
ABX
LDAA 0,x
LDAB 1,x
ABA
PULX
STAA 0,x
RTS
org $4000
start LDS #$F000
LDX #$3000
nasl_x2 LDAA 0,x
BSR kvadrat
STAA 0,x
INX
CPX #$300A
BNE nasl_x2
CLRA
CLRB
nasl_s PSHA
PSHB
JSR sestej
PULB
PULA
INCA
INCA
INCB
CMPB #5
BNE nasl_s
konec BRA konec
kvadrat TAB
MUL
TBA
RTS
end
|
* nastavimo reset vektor
* z začetnim naslovom programa
* nastavimo začetek podatkov
* podatek in rešitev kvadrata za x=0
* podatek in rešitev kvadrata za x=1
* podatek in rešitev kvadrata za x=2
* podatek in rešitev kvadrata za x=3
* podatek in rešitev kvadrata za x=4
* podatek in rešitev kvadrata za x=5
* podatek in rešitev kvadrata za x=6
* podatek in rešitev kvadrata za x=7
* podatek in rešitev kvadrata za x=8
* podatek in rešitev kvadrata za x=9
* nastavimo začetek rešitev seštevanj
* rešitev prvega seštevanja
* rešitev drugega seštevanja
* rešitev tretjega seštevanja
* rešitev četrtega seštevanja
* rešitev petega seštevanja
* nastavimo začetek drugega podprograma
* naložimo naslov za shranjevanje rezultatov
* prišteje odmik za trenutno rešitev
* shrani naslov za rešitev v sklad
* naložimo naslov podatkov
* odmik prestavi v B!
* prišteje odmik, kjer so trenutni podatki
* naloži prvi podatek za seštevanje
* naloži drugi podatek za seštevanje
* ju sešteje
* vzame prej shranjeni naslov rezultata
* in shrani rezultat
* vrnitev iz podprograma
* nastavimo začetek programa
* najprej pripravimo sklad!
* naložimo naslov za podatkov
* naloži število za kvadriranje
* kliče podprogram, ki izvrši kvadriranje
* shrani rezultat
* propravi X za shranjevanje naslednjega rezultata
* ponavlja izračun enačbe,
* dokler ne izračuna 10 rezultatov
* pripravi odmik podatkov za naslednji podprogram
* pripravi odmik rezultatov za naslednji podprogram
* ter ju
* shrani v sklad
* kliče podprogram za seštevanje in hranjenje rezultata
* obnovi prej
* pripravljena odmika
* odmik podatkov poveča
* za dva (oba seštevanca!)
* odmik rezultatov poveča za ena
* in ponavlja, dokler
* ne izračuna 5 rezultatov
* za konec neskončna zanka
* število postavi še v B
* in izvrši množenje A*B
* rezultat (1 bajt) vrne v A
* vrnitev iz podprograma
|
| Med delovanjem programa opazujemo tok programa
(skoki v podprograme in nazaj) in spreminjanje stanja kazalca
sklada (lahko tudi vsebino sklada v pomnilniku!). |
|
|
Naloge za reševanje in utrjevanje:
1. naloga: Sestavi program, ki v
podprogramu prišteje 5 k številom, ki se nahajajo od
naslova $2000 dalje (števila so: 3,7,15,2,9,22). V
podprogramu se izvrši le seštevanje, shranjevanje
rezultata izvrši v glavnem programu in sicer na mesto
števila. Program naj se nahaja v pomnilniku na naslovu $
3000. Preizkusi delovnje BSR in JSR (ugotovi razliko!).
2. naloga: Sestavi program, ki v
podprogramu pomnoži s 4 števila, ki se nahajajo od
naslova $1000 dalje (števila so: 1,3,5,7,9,8,6,4,2). V
podprogramu se izvrši množenje in shranjevanje
rezultata v dolžini enega bajta in sicer na mesto
števila. Program naj se nahaja v pomnilniku na naslovu
$5000, podprogram pa na naslovu $4000. Preizkusi delovnje BSR in
JSR!