www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

[SOLVED] SWI (software interupt) assembly ukaz

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
71GA
Član
Član



Pridružen-a: Tor 16 Jun 2009 18:53
Prispevkov: 391
Aktiv.: 2.00
Kraj: Ljubljana

PrispevekObjavljeno: Ned Jan 30, 2011 11:45 am    Naslov sporočila:  [SOLVED] SWI (software interupt) assembly ukaz Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
BluPhenix
Član
Član



Pridružen-a: Pet 05 Mar 2004 12:54
Prispevkov: 1018
Aktiv.: 4.29
Kraj: Sežana

PrispevekObjavljeno: Ned Jan 30, 2011 1:24 pm    Naslov sporočila:   Odgovori s citatom

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.

_________________
Exclamation Pravilo št. 1: Pišite slovensko, velja za vse.

TA SUHI ŠKAFEC PUŠČA. Saj ni tako težko, no!
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
71GA
Član
Član



Pridružen-a: Tor 16 Jun 2009 18:53
Prispevkov: 391
Aktiv.: 2.00
Kraj: Ljubljana

PrispevekObjavljeno: Ned Jan 30, 2011 3:32 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
domen_puncer
Član
Član



Pridružen-a: Čet 01 Maj 2008 13:30
Prispevkov: 78
Aktiv.: 0.37
Kraj: Ljubljana, Mozirje

PrispevekObjavljeno: Ned Jan 30, 2011 4:28 pm    Naslov sporočila:   Odgovori s citatom

Da citiram BluPhenixa:
(8004 ker je ARM 32 biten, torej 4 byti naslovnega prostora).

_________________
Tiskanje sudoku
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
71GA
Član
Član



Pridružen-a: Tor 16 Jun 2009 18:53
Prispevkov: 391
Aktiv.: 2.00
Kraj: Ljubljana

PrispevekObjavljeno: Ned Jan 30, 2011 5:50 pm    Naslov sporočila:   Odgovori s citatom

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 Smile

LP Žiga
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
71GA
Član
Član



Pridružen-a: Tor 16 Jun 2009 18:53
Prispevkov: 391
Aktiv.: 2.00
Kraj: Ljubljana

PrispevekObjavljeno: Tor Feb 08, 2011 10:37 am    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
BluPhenix
Član
Član



Pridružen-a: Pet 05 Mar 2004 12:54
Prispevkov: 1018
Aktiv.: 4.29
Kraj: Sežana

PrispevekObjavljeno: Tor Feb 08, 2011 10:27 pm    Naslov sporočila:   Odgovori s citatom

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.

_________________
Exclamation Pravilo št. 1: Pišite slovensko, velja za vse.

TA SUHI ŠKAFEC PUŠČA. Saj ni tako težko, no!
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
71GA
Član
Član



Pridružen-a: Tor 16 Jun 2009 18:53
Prispevkov: 391
Aktiv.: 2.00
Kraj: Ljubljana

PrispevekObjavljeno: Tor Feb 08, 2011 11:48 pm    Naslov sporočila:   Odgovori s citatom

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
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
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