200 likes | 346 Views
Sklad - splošno. Kaj je sklad? Sklad (angl. Stack) je dinamična podatkovna struktura, nad katero sta (poleg inicializacije) mogoči dve operaciji: Vstavi “(angl. Push)” in Vzemi “(angl. Pull)”. Z operacijo VSTAVI damo nov podatek v (na) sklad. Z operacijo VZEMI vzamemo podatek s (iz) sklada.
E N D
Sklad - splošno • Kaj je sklad? • Sklad (angl. Stack) je dinamična podatkovna struktura, nad katero sta (poleg inicializacije) mogoči dve operaciji: • Vstavi “(angl. Push)” in • Vzemi “(angl. Pull)”. • Z operacijo VSTAVI damo nov podatek v (na) sklad. • Z operacijo VZEMI vzamemo podatek s (iz) sklada. • Sklad ima dva konca: “dno” in “vrh”. • Obe operaciji (VSTAVI, VZEMI) delujeta na tistem koncu, ki mu rečemo vrh. • Ko sklad inicializiramo, je prazen. • Z operacijo VSTAVI se sklad polni. • Z operacijo VZEMI se sklad prazni.
Sklad - splošno Vrh sklada Podatek na vrhu sklada Tu delujeta operaciji vstavi in vzemi Ostala vsebina sklada Dno sklada • Sklad torej služi za shranjevanje podatkov po principu zadnji noter, prvi ven (angl. LIFO – Last In First Out). • Za hranjenje podatkov potrebujemo ustrezno pomnilno sredstvo (pomnilnik) in kazalec (register) ki določa, kje je vrh.
Pomnilnik $1000 Pomnilnik RAM $3FFF $4000 HCS12 in sklad • Za sklad je uporabljen (katerikoli) del pomnilnika RAM (se nahaja kjerkoli v naslovnem področju pomnilnika RAM). • Vrh sklada določa skladovni kazalec – register procesorja - SP. • Inicializacija sklada • Izberemo položaj (začetni vrh oz. dno) sklada: LDS #SKLAD ;npr. SKLAD= $4000 • S tem je sklad “prazen”. Skladovni kazalec SP $4000
CPE po CPE pred $5A $5A Pomnilnik Pomnilnik SP SP $3FFF $4000 $1000 $1000 RAM RAM $3FFF Nedef. $3FFF $5A $4000 $4000 HCS12 in sklad • Oparacija VSTAVI: PSHA, PSHB, PSHC, PSHD, PSHX, PSHY • Skladovni kazalec se najprej dekrementira. • Operand se shrani v sklad na naslov, ki ga kaže SP. • Sklad torej “rase” oz. se polni proti nižjim naslovom. • Npr. PSHA ; -SP, (SP) A
CPE po CPE pred ???? $5A Pomnilnik Pomnilnik SP SP $4000 $3FFF $1000 $1000 RAM RAM $3FFF $5A $3FFF $5A $4000 $4000 HCS12 in sklad • Oparacija VZEMI: PULA, PULB, PULC, PULD, PULX, PULY • Operand se vzame s sklada, t.j. z naslova, kamor kaže SP. • Skladovni kazalec se nato inkrementira. • Seveda se vsebina na tistem naslovu ne spremeni. • Npr. PULA ;A (SP), SP+
Pomnilnik za sklad Pomnilnik za sklad Pomnilnik za sklad B A A B $55 $AA $55 $AA $AA $AA $AA SP SP SP SP $55 $55 $55 $55 PULA PULB PSHB PSHA HCS12 in sklad • Primer: zamenjamo vsebini akumulatrojev A in B PSHA ;naj bo v akumulatorju A npr. $55 PSHB ;naj bo v B npr. $AA PULA ;sedaj je v akumulatorju A $AA PULB ;in v B gre $55 Pomnilnik za sklad
HCS12 – sklad - “tipičen primer” • (Začasno) shranjevanje v sklad: PSHA ;shranjevanje v izbranem vrstnem redu PSHB PSHX ...... ;I.T.D. ...... PULX ;obnovitev v obratnem vrstnem redu PULB PULA
HCS12 – vloga sklada • Pri začasnem shranjevanju podatkov (v sklad) – to smo ravnokar spoznali. • Pri povezovanju programov s podprogrami (subrutinami) – shranjevanju vrnitvenega naslova v sklad, to je naslova ukaza v klicnem programu, ki sledi klicnemu ukazu. • Pri streženju zahtevam za prekinitev – shranjevanje registrov procesorja (konteksta) v sklad.
Programi in podprogrami • Program običajno obsega: • glavni program in • več podprogramov (“subrutin”). • Noben (pod)program naj ne bi obsegal več vrstic kot za eno (dobro) stran. • Že malo obsežnejši program narejen “v enem kosu” postane nepregleden, težko obvladljiv in za “enkratno uporabo”. • Načrtovanje programa s podprogrami naredi program bolj pregleden, bolj obvladljiv, modularen, zato tudi bolj prilagodljiv in bolj uporaben. • Podprogrami pa so sami po sebi potrebni tudi (in včasih predvsem) zato, ker se določena zaporedja ukazov (določene sestavljene operacije) v programu (programih) večkrat oz. pogosto ponavljajo.
Programi in podprogrami • Glavni program je tisti del programa, ki se začne izvrševati, ko hočemo program izvršiti. • Podprogrami (subrutine) pa se “kličejo” iz glavnega programa (klicnega programa) po potrebi, samo enkrat ali pa poljubno mnogokrat. • Možen je seveda tudi klic podprograma znotraj podprograma, to je “gnezdenje” klicev. • Ko govorimo o skladu in podprogramih, pa je prav sklad tisti, ki: • daje podlago, da se klicni program lahko nadaljuje po vrnitvi iz klicanega podprograma, • omogoča gnezdenje klicev.
Programi in podprogrami ;Podprogram SUB_A SUB_A: Ukaz 1 Ukaz 2 ...... ...... Ukaz za povratek (RTS) ;Glavni program ....... Ukaz N-1 Ukaz N: Klic podprograma (JSR SUB_A) Ukaz N+1 ....... ....... ....... Klic podprograma (JSR SUB_B) ....... ....... ....... ....... Ponovni klic podprograma (JSR SUB_B) ....... I.T.D. ;Podprogram SUB_B SUB_B: Ukaz 1 Ukaz 2 ...... ...... Ukaz za povratek (RTS)
HCS12 - subrutine • Podprogramu (subrutini) damo primerno ime, ki sam po sebi o subrutini nekaj pove, npr.: Sestej • V zbirnem jeziku je to naslov 1. ukaza subrutine • Poskrbimo za prenos argumentov iz klicnega v klicni program (subrutino) in obratno, to je (vhodnih) podatkov in (izhodnih) rezultatov. • Če se le da (ko jih je malo) prenašamo argumete preko registrov CPE. • Zapišemo vsebino subrutine, to je • zaporedje ukazov, ki spada k subrutini in realizira tisto, čemur je namenjena, to je na podlagi vhodnih podatkov da potrebni rezultat. • Poskrbimo za povratek v klicni program, to je • Za to imamo ukaz RTS • Opomba: seveda je ukazov RTS za povratek iz iste subrutine po potrebi lahko tudi več.
HCS12 – primer subrutine ; ---------------------------------------------------------------------------------------- ; Program s podprogramom ; ; --- Splošne definicije ; RAMSTART EQU $1000 ;začetek pomnilnika RAM RAMSIZE EQU $2000 ;njegova velikost RAMEND EQU RAMSTART+RAMSIZE PROGRAM EQU $3000 ;začetek pomnilnika za program NPOD EQU $10 ;št. podatkov za sešteti ; --- podatki in sklad ORG RAMSTART POD: DS.B NPOD ;to naj bodo podatki za seštevanje VSOTA: DS.B 1 ;tu bo rezultat ; --- začetek glavnega programa ORG PROGRAM Start: LDS #RAMEND ;določimo sklad
HCS12 – primer subrutine ; ; --- priprava na klic subrutine ; --- podamo dejanske (vrednosti) argumentov ; LDX #POD ;začetek podatkov LDAB #NPOD ;število podatkov JSR SESTEJ ;klic subrutine BRA * ;neskončna zanka ;
HCS12 – primer subrutine ; ----------------------------------------------------------------------------------- ; Ime Subrutine: SESTEJ ; Opis: subrutina sešteje podano število 8-bitnih podatkov v pomnilniku ; Vhodni argumenti: register X: naslov prvega podatka ; akumulator B: število podatkov ; Izhod: vsota podatkov shranjena na naslovu takoj za podatki ; SESTEJ: PSHA ;shranimo registre PSHB PSHX CLRA SESTEJ0: ADDA 0,X ;računamo INX DECB BNE SESTEJ0 STAA 0,X ;shranimo rezultat (lahko tudi STAA VSOTA) PULX ;obnovimo registre PULB PULA RTS
HCS12 – ukaz JSR • Ukaz: JSR ImeSubrutine prenese izvrševanje zaporedja ukazov na subrutino. V tem primeru pomeni ImeSubrutine simbolični naslov 1.ukaza subrutine. • Kaj se dogaja? • Vsebina programskega števca se shrani v sklad. • Programski števec se polni z vsebino v polju operanda ukaza JSR (to je z naslovom 1. ukaza subrutine). • S tem se izvrševanje ukazov prenese na subrutino.
CPE po klicu CPE pred klicem $5A $5A PC SP PC SP $3004 $3FFE $310A $4000 HCS12 – ukaz JSR ;Klicni program ....... $3000 NOP $3001 JSR $310A $3004 NOP ....... ;Subrutina $310A TAB $310B ....... I.T.D. $3FFE $30 $3FFF $04 Nedef. $4000 $4000 Sklad Sklad
CPE pred CPE po $5A $5A SP PC SP PC $3FFE $3111 $4000 $3004 HCS12 – ukaz RTS ;Klicni program ....... $3000 NOP $3001 JSR $310A $3004 NOP ......... ....... ;Subrutina $310A TAB $310B ....... .......... ....... $3110 RTS SP $3FFE $30 $3FFE $30 $3FFF $04 $3FFF $04 SP $4000 $4000 Sklad Sklad
HCS12 – sklad in prekinitve • V primeru zahteve za prekinitev procesor shrani svoj kontekst (registre) v sklad. • Programski števec se polni z vsebino pomnilniške besede s ‘posebnim pomenom’ – prekinitvenim vektorjem (vektor vsebuje torej naslov ukaza). • Sledi prevzem in izvršitev (prvega) ukaza ter za tem vseh ostalih ukazov ‘prekinitvenega strežnika’. • Zadnji ukaz prekinitvenega strežnika je ukaz RTI (angl.Return from Interrupt), ki iz sklada obnovi ob zahtevi za prekinitev shranjene registre (seveda tudi programski števec).