 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Ned Jan 30, 2011 11:45 am Naslov sporočila: [SOLVED] SWI (software interupt) assembly ukaz |
|
|
Lep pozdrav!
V knjigi katero študiram sem naletel na software interrupt ukaz, ki mi ni popolnoma jasen. Razlaga v knjigi je skopa in gre takole: "When the processor executes an SWI instruction, it sets the program counter pc to the offset 0x8 in the vector table." Podana je tudi koda PRE in POST, kar prikazuje registre pred in po ukazu, ki je vpisan vmes.
Koda: |
PRE:
cpsr = nzcVqift_USER
pc = 0x00008000
lr = 0x003fffff; lr = r14
r0 = 0x12
UKAZ:
0x00008000 SWI 0x123456
POST:
cpsr = nzcVqIft_SVC
spsr = nzcVqift_USER
pc = 0x00000008
lr = 0x00008004
r0 = 0x12
|
V kodi razumem, da spsr shrani stanje pred interuptom, da lahko kasneje nadaljuje tam, kjer je končal, razumem tudi, da cpsr skoči v SVC (superuser mode) in da se v cpsr vklopi interrupt mask (I), ki prepreči ponovni interrupt. Kar ne razumem je: "Zakaj se pc in lr spremenita tako kot se?" Bi mi lahko kdo to malo obrazložil?
Nazadnje urejal/a 71GA Sre Feb 09, 2011 1:11 am; skupaj popravljeno 1 krat |
|
Nazaj na vrh |
|
 |
BluPhenix Član

Pridružen-a: Pet 05 Mar 2004 12:54 Prispevkov: 1018 Aktiv.: 4.29 Kraj: Sežana
|
Objavljeno: Ned Jan 30, 2011 1:24 pm Naslov sporočila: |
|
|
Sej ti piše.
Program counter (pc) skoči na naslov interrupta (SWI je pri ARM na 0x08, drugi drugje) - tam se začne koda interrupta, navadno ta koda preusmeri potem programa na lokacijo, kjer se nahaja dejanska procedura, ki jo mora interrupt narediti. FIQ ima recimo nekaj prostora na voljo, da je koda lahko direktno na naslovu FIQja, tako da ej še hitrejši. Ostali interrupti na dodeljenem naslovu pač hranijo link do rutine (ne pa samo rutino). Tako da se na naslovu 0x08 pri tebi mora nahajati naslov v pomnilniku kjer se začne swi.
Link register pa torej ohrani od kje je zadeva prišla (naslednji ukaz, ki bi se izvedel, če nebi prišlo do interrupta), da potem gre od tam naprej. (8004 ker je ARM 32 biten, torej 4 byti naslovnega prostora).
spsr shrani stanje zastavic, če mene spomin ne vara: CPSR -current program status register, SPSR - saved program status register. SPSR shrani prejšnjo (pred interruptom) vrednost CPSR, ne pc. _________________
Pravilo št. 1: Pišite slovensko, velja za vse.
TA SUHI ŠKAFEC PUŠČA. Saj ni tako težko, no! |
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Ned Jan 30, 2011 3:32 pm Naslov sporočila: |
|
|
Aha torej program counter (pc) je na začetku poljubni 0x00008000, nato pa ob IRQ vedno pokaže na default pozicijo interupt vektorja, ki je za ARM 0x00000008. Link register (lr) pa naj bi pokazal na naslednji ukaz, ki naj bi se izvedel v kolikor nebi prišlo do IRQ. Ampak zakaj potem lr ne pokaže na 0x00008001, ki je en naprej od 0x00008000? |
|
Nazaj na vrh |
|
 |
domen_puncer Član

Pridružen-a: Čet 01 Maj 2008 13:30 Prispevkov: 78 Aktiv.: 0.37 Kraj: Ljubljana, Mozirje
|
Objavljeno: Ned Jan 30, 2011 4:28 pm Naslov sporočila: |
|
|
Da citiram BluPhenixa:
(8004 ker je ARM 32 biten, torej 4 byti naslovnega prostora). _________________ Tiskanje sudoku |
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Ned Jan 30, 2011 5:50 pm Naslov sporočila: |
|
|
domen_puncer je napisal/a: |
Da citiram BluPhenixa:
(8004 ker je ARM 32 biten, torej 4 byti naslovnega prostora). |
Aha se opravičujem sem spregledal v komentarju. Hvala obema
LP Žiga |
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Tor Feb 08, 2011 10:37 am Naslov sporočila: |
|
|
V bistvu je še nekaj, kar me zanima. Kaj je številka pred/po ukazu SWI? Na primer:
Koda: |
0x00008000 SWI 0x123456 |
Po tem ukazu se potlej najbrž izvede rutina, ki se nahaja na naslovu SWI (to je 0x00000008) in ko se rutina konča se vrne na link register. Upam, da razumem. Ampak zanima me le še, kako spravimo naslov, kjer se nahaja rutina na naslov 0x00000008?
Še eno vprašanje kaj je pomen registra r0 v prvem primeru, ki sem ga navedel na tej strani? V knjigi piše, da je vloga tega registra "parameter passing" a si ne znam predstavljati, kaj bi to bilo.
LP |
|
Nazaj na vrh |
|
 |
BluPhenix Član

Pridružen-a: Pet 05 Mar 2004 12:54 Prispevkov: 1018 Aktiv.: 4.29 Kraj: Sežana
|
Objavljeno: Tor Feb 08, 2011 10:27 pm Naslov sporočila: |
|
|
Parameter passing bi meni pomenilo, da je rezerviran za posredovanje parametra funkcije.
Torej če imaš funkcijo f (x) {return x^2} in jo kličeš f(2), pomeni, da bo register r0 hranill vrednost 2.
Naslov spraviš tja tako, da ga zapišeš na tistpo mesto.
Se pravi v assemblerju s kakšnim store mnemonikom, v C ju pa imaš določene ukaze compilerju, ki povzročijo, da compiler to stori namesto tebe.
Številka pred SWI je naslov na katerem se nahaja koda, ki povzroči SWI (lokacija do katere je prišel program). ZA številko za SWI se pa ne spomnem. _________________
Pravilo št. 1: Pišite slovensko, velja za vse.
TA SUHI ŠKAFEC PUŠČA. Saj ni tako težko, no! |
|
Nazaj na vrh |
|
 |
71GA Član


Pridružen-a: Tor 16 Jun 2009 18:53 Prispevkov: 391 Aktiv.: 2.00 Kraj: Ljubljana
|
Objavljeno: Tor Feb 08, 2011 11:48 pm Naslov sporočila: |
|
|
BluPhenix je napisal/a: |
ZA številko za SWI se pa ne spomnem. |
No to pa vem. Koda za SWI je številka software interrupta npr. 0x123456 je debugging številka. Sem to prebral v tej knjigi ki jo počasi prebiram. |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 7 dni
Powered by phpBB © 2001, 2005 phpBB Group
|