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 

assembly ukaz .word

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Programiranje embedded sistemov
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.16
Kraj: Ljubljana

PrispevekObjavljeno: Čet Feb 17, 2011 10:22 am    Naslov sporočila:  assembly ukaz .word Odgovori s citatom

Živijo. Sem naletel na assembly ukaz .word, ki je v startup kodi mikroprocesorja uporabljen na čuden način.
Koda:
_undf:  .word _reset

Labela _undf je tukaj uporabljena prvič. Tudi _reset, ki se nahaja za .word je uporabljen prvič. Kaj ta ukaz naredi? Ali mogoče reče, naj kateri koli OBJEKT skoči na labelo _undef v kolikor naleti na spremenljivko _reset tipa word? Možno, da sem usekal popolnoma mimo...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo Obišči avtorjevo spletno stran
Benjamin
Član
Član



Pridružen-a: Tor 10 Jul 2007 11:23
Prispevkov: 116
Aktiv.: 0.57
Kraj: Trebnje, Ljubljana

PrispevekObjavljeno: Čet Feb 17, 2011 11:37 am    Naslov sporočila:   Odgovori s citatom

Živjo!

Na kratko: ko procesor naleti na nedefinirano inštrukcijo (undefined instruction), se ti bo procesor resetiral.

Malo daljše: nekje nad to vrstico bi moral imeti nekaj podobnega:
Koda:
_start: b   reset
   ldr   pc, _undefined_instruction
   ldr   pc, _software_interrupt
   ldr   pc, _prefetch_abort
   ldr   pc, _data_abort
   ldr   pc, _not_used
   ldr   pc, _irq
   ldr   pc, _fiq

Se pravi, ko procesor naleti na nedefinirano inštrukcijo, bo šel pogledati v zgornjo tabelo vektorjev ter nato skočil na naslov, ki je podan z _undf oz. _reset.

_________________
Cessna 152: "Flight Level Three Thousand, Seven Hundred"
Controller: "Roger, contact Houston Space Center"
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
71GA
Član
Član



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

PrispevekObjavljeno: Pet Feb 18, 2011 10:23 am    Naslov sporočila:   Odgovori s citatom

Benjamin je napisal/a:
Živjo!
Na kratko: ko procesor naleti na nedefinirano inštrukcijo (undefined instruction), se ti bo procesor resetiral.

Kje v moji kodi se to zgodi prvič?
Benjamin je napisal/a:
Živjo!
Malo daljše: nekje nad to vrstico bi moral imeti nekaj podobnega:
Koda:
_start: b   reset
   ldr   pc, _undefined_instruction
   ldr   pc, _software_interrupt
   ldr   pc, _prefetch_abort
   ldr   pc, _data_abort
   ldr   pc, _not_used
   ldr   pc, _irq
   ldr   pc, _fiq

Se pravi, ko procesor naleti na nedefinirano inštrukcijo, bo šel pogledati v zgornjo tabelo vektorjev ter nato skočil na naslov, ki je podan z _undf oz. _reset.

V bistvu imaš popolnoma prav! Moja koda izgleda takole:
Koda:
Vectors:

        b     _start                    // reset - _start
        ldr   pc,_undf                  // undefined - _undf
        ldr   pc,_swi                   // SWI - _swi
        ldr   pc,_pabt                  // program abort - _pabt
        ldr   pc,_dabt                  // data abort - _dabt
        nop                             // reserved
        ldr   pc,[pc,#-0xFF0]           // IRQ - read the VIC
        ldr   pc,_fiq                   // FIQ - _fiq

#if 0
// Use this group for production
_undf:  .word _reset                    // undefined - _reset
_swi:   .word _reset                    // SWI - _reset
_pabt:  .word _reset                    // program abort - _reset
_dabt:  .word _reset                    // data abort - _reset
_irq:   .word _reset                    // IRQ - _reset
_fiq:   .word _reset                    // FIQ - _reset

#else
// Use this group for development
_undf:  .word __undf                    // undefined
_swi:   .word __swi                     // SWI
_pabt:  .word __pabt                    // program abort
_dabt:  .word __dabt                    // data abort
_irq:   .word __irq                     // IRQ
_fiq:   .word __fiq                     // FIQ

__undf: b     .                         // undefined
__swi:  b     .                         // SWI
__pabt: b     .                         // program abort
__dabt: b     .                         // data abort
__irq:  b     .                         // IRQ
__fiq:  b     .                         // FIQ

#endif

Kot vidiš je zadeva še malo bolj zapletena Smile Se pravi, če sem jaz pravilno razumel, je na začetku nek branch instruction b _start a ne vem, kaj to naredi. Potem z ukazom ldr pc, _undf v program counter zloadamo naslov labele _undf. Ko v naslednjem koraku program skoči na labelo _undf tam najde ukaz .word _reset in skoči naprej na labelo _reset, katere kode nisem prilepil v post. Toda labela _undf je malo nižje podana ponovno (glej #else) in sledi ji ukaz, ki kaže na labelo __undf, kjer se nahaja ukaz b .. Kaj s tem dosežemo?
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 -> Programiranje embedded sistemov Č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: 79 dni


Powered by phpBB © 2001, 2005 phpBB Group