Pre-Processor.Kódsorok címhez való rendelése.

Pre-Processor.Kódsorok címhez való rendelése.
2011-02-01T15:48:50+01:00
2011-02-11T13:04:14+01:00
2022-11-20T19:30:39+01:00
disane
Emberek!

Most kell a segítségetek. 10 -én le kell adnom és még csak az felét csináltam meg az is egy kicsit bugos. Ehhez kéne egy kis segítség. Közben azért voltak más tantárgyak is mint a bolond matematika az őrült sok marhasággal amit még életemben sosem láttam.

Minden esetre elakadtam a címzésben.

Van úgy hogy megadok egy forráskódot ahol van két címke. Egyik jelzi, hogy hol van vége a kódnak nevezzük _end ,nek _main -ben pedig egy jmp _main -van. A gond az, hogy ez esetben ilyesmi kódot kéne kapnom:


0x000 jmp _main

de e helyett ilyet kapok


0x002 jmp _main

Íme az asm forráskód:


; eternal loop with unconditional jump


_main:
jmp _main
_end:
.end

Ehhez kéne valami preprocesszorféleséget írni ami a parancsot a címhez rendeli. Nagyobb kódszerkezetekben működik a forráskódom. Íme:



; a simple program that adds two constants using a sub - routine and stores
; the result in a variable vc
;
ca .equ 5 ; define a constant ca with value 5
cb .equ 7 ; define a constant cb with value 7
.org 128
vc .dw 0 ; define a variable vc at address 64 with value 0
.org 0
vw .dw 0x166
_main:
lda,c ca ; load constant ca to accu
push,r a ; push accu to the stack
lda,c cb ; load constant cb to accu
push,r a ; push accu to the stack
call _sum ; call sub - routine sum
sta vc ; vc = accu
inc,r sp,2 ; deallocate parameter stack
jmp _end ; jmp to label end
_sum:
push,r fp ; save old framepointer
ldr fp,sp ; mark current frame
dec,ri sp,1 ; space for temp below the fp
lda,c 0 ; accu = 0
sta,ri fp,-1 ; temp = accu
lda,ri fp,2 ; accu = 7 (via stack )
add,ri fp,3 ; accu = 7 + 5 (via stack )
sta,ri fp,-1 ; temp = accu
lda,ri fp,-1 ; accu = temp
ldr sp,fp ; remove locals from stack
pop,r fp ; restore fp of caller
ret ; back to caller
_end:
.end

dw kap helyet 0x000 -án majd 0x002 -re már lda,c 5 kerül ez így van rendjén. Íme a C forráskód:

Pre-Process()

A fenti forráskódban látható current_address -t csak ott módosítom az egyéb fügvények csak másolják az onnan kapott értéket a láncolt listába ahová az egyes parancsok kerülnek a címeikkel. (".dw", ".equ" pre-processzor direktívák nincs beleszólásuk a program logikájába). .org mondja meg hogy hová kerüljön a következő változó vagy parancs a memóriában. .end -et úgy kezelem mint parancsot, tehát van valódi címe a memóriában.

Egy apró része még nincs kész a preprocesszornak de éjjel nappal dolgozom rajta, hogy összeálljon és ne legyen benne hiba, de nem tudok egyszerre a syntaxis vizsgáló foltozgatásával, a parancsok feldolgozásával meg a címek rendelésével foglalkozni. Esetleg valaki ha a címek hozzárendeléshez valami jó megoldást tudna nyújtani azt megköszönném.
Mutasd a teljes hozzászólást!
Ja, hogy már csak a tulajdonképpeni fordítást kellene megcsinálni

Hát kezdetnek egy asszociatív tároló kellene, amelyik egy-egy utasításkódhoz hozzárendel egy adatterületet, ahol az illető utasítás adatai vannak leírna: operandusok száma, típusa, gépi kód...
Mutasd a teljes hozzászólást!

  • Pre-Process() először végig halad a lehetséges címkéken (LABELS, _(underscore)-al kezdődnek és :(colon)-al végződnek ).
    Eltárolja egy bináris fában a címet és a Label nevét. Ez esetben nem tudom biztosan, hogy most akkor az aktuális címet mentse vagy a következőt ahol a parancs lesz. Ehhez kéne valami pontosítás, hogy hogyan lehetne ezt biztosan tudni...

    bWrite_address letitltásával megakadályozom, hogy 2 Byte -al emelkedjen a cím, vagy engedélyezem.

    .dw elméletileg megemeli a címet 2 Byte -al. .org tetszőleges címre állítja majd letiltja a következő iterációig, nehogy 2 -vel megnövelje automatikusan a címet. .end szintén engedélyezi a cím emelését 2 -vel. A többi pre-processor direktíva viszont nem szabadna, hogy befolyásolja a címeket.

    Az ötlet jó, de a kivitelezés csapni való. Ehhez kéne segítség...
    Mutasd a teljes hozzászólást!
  • A feladatot, már egyszer elecseteltem az alábbi linken megtaláljátok a rendkívül hasznos diskurzust amit a feladatról a folytattunk:

    CPU Simulator feladat PROG.HU -n
    Mutasd a teljes hozzászólást!
  • Most mondjam azt, lex meg yacc? Az ember nem kezdi nulláról a fejlesztést, ha van kész eszköz is...
    Mutasd a teljes hozzászólást!
  • Köszönöm szépen. Ez nem is rossz cucc, ha majd nem a sulinak írom a projektet és nem leszek falak közé szorítva, hogy mit használhatok fel akkor biztosan kipróbálom majd.

    Minden esetre megoldottam a kódcímzését érintő problémát. Megint túl bonyolultan akartam valamit megoldani ami amúgy meg pofonegyszerű.

    De azért még lehetnek itt gondok ezért nyitva hagyom a kérdést.

    Ki, hogyan szokta a Translation Table -t felállítani amikor Assembler -t ír? Mert kéne olyasmit is írnom és sajnos még sosem csináltam olyat. Volna elképzelésem, hogy mit kéne csinálnom, de biztosan van rá egyszerű és gyors megoldás is. Válaszokat kérek :)
    Mutasd a teljes hozzászólást!
  • Pontosan mi is lenne az?
    Mutasd a teljes hozzászólást!
  • Az OP Code -ot, addressing mode -al és címekkel együtt bináris kódra kéne fordítani. Ezt ki hogyan oldaná meg?
    Mutasd a teljes hozzászólást!
  • Ja, hogy már csak a tulajdonképpeni fordítást kellene megcsinálni

    Hát kezdetnek egy asszociatív tároló kellene, amelyik egy-egy utasításkódhoz hozzárendel egy adatterületet, ahol az illető utasítás adatai vannak leírna: operandusok száma, típusa, gépi kód...
    Mutasd a teljes hozzászólást!
  • Igen ezt eltaláltad, de nem használhatok külső könyvtárakat erre. Nekem kell megépítenem a tárolót is. Nincs valakinek linkje az algoritmusra és az adatszerkezetre amit használnom kéne? Vagy ha van kedve akkor értelmesen itt leírhatná a működését. Köszönöm előre is.
    Mutasd a teljes hozzászólást!
  • Elkészültem vele. Igaz két feladat nem volt meg. De mivel ennyire jól elvégeztem az első 3 -at ezért maximum pontot kaptam a projektre xD
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd