CPU szimulátor feladat
2010-12-25T00:51:35+01:00
2011-02-01T01:08:16+01:00
2022-07-01T15:11:37+02:00
  • Nem gondolod, hogy komolyan veszlek, ugye? Azért ott még nem tartunk "kiskomám"...

    Azt meg csak a hecc kedvéért írtam. El is készült, de nem kértem érte pénzt. Ez viszont nem egyszerű kód lesz mint amit az osztálytársnak összetákoltam 2 nap alatt.

    Van valaki aki segítene, még egy eszme csere is elég, nem kell megírni helyettem. Ötletek kellenek, nem a kódotok. nehogy már valaki itt a kisujját is mozdítsa...
    Mutasd a teljes hozzászólást!
  • Idéznék:
    Pitiáner. Én 1650 euróért készítek egy gyengébb verziót valakinek miközben az enyémet is hegesztem

    Csak nem visszanyalt a fagyi kiskomám?


    Komolyra fordítva:
    Mivel a régi ajánlatomat pitiánernek tekintetted, ezért akkor komolyabbat mondok. Szerdától kint leszek pár napot Bécsben, jutányos 100 eurós órabérért garantáltan segítek kijavítani minden hibát
    Mutasd a teljes hozzászólást!
  • 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!
  • Eszem ágában sem volt ennyiért megírni neki, max támogatást nyújtottam volna

    De ahogy elnézem, úgyis jobban ért hozzá
    Mutasd a teljes hozzászólást!
  • Időigényes úgy bizony. Arra gondoltam hogy valamiféle adat szerkezetekkel (láncolt listák vagy BST -kel) lelehetne csökkenteni a fejlesztési időt, de sajna így is időigényes.
    C++ -ben valóban jól összelehetne hozni kisebb macerával, csak az a gond hogy C -ben kell megírnom.

    Nem beszélve arról hogy a programnak működnie kell ,hogy ne bukjak meg. Idáig egy light -os tesztet írtunk csak C programozásból. Előtte kellett egy GPS adat analizátor -t írni. Ez kiírta külön az adatfolyamból amit az eszköz biztosított (kapott műholdról) hogy mi a pontos idő, szélességi, hosszúsági fok stb. Eléggé könnyű feladat volt.

    Utána volt egy feladat ahol képeket kellet manipulálni. Forgatni, színezni stb. Azokat nem írtam meg mert másra tanultam, különben is nagyon egyszerűek voltak.

    Nem akadtam el csak kíváncsi vagyok, hogy mások nem e szívtak (szívnak) vele. De azért példa progik és tippek jól jönnének

    Egyelőre Syntax vizsgálatra egy BST -t állítottam fel. Külön címkéknek, utasításoknak, változóknak konstansoknak. Ezzel vizsgálni tudom, hogy az adott elem létezik már e.

    Magára a program sorra egy láncolt listát fogok felállítani benne a parancs, program sor címe, addressing mode, változó, argumentumok, breakpoint stb.

    Az assemblernél csak egy 512 Byte -os tároló kell mondjuk char -okból és TL -el átfordítani az olvasható kódot gépi kódra.
    Mutasd a teljes hozzászólást!
  • inkább időigényes, mint nehéz feladat, C-ben biztos hogy nem lenne gusztusom megírni, C++ objektum orientált verzió enyhén tetszetősebb

    Első szemszter végén ilyet kérnek, ráadásul villamos mérnököktől Örülök hogy enghem nem szivattak ilyesmikkel

    Most elakadtál benne valahol, vagy hasonló példa progik kellenének, hogy mit hogyan érdemes?
    Mutasd a teljes hozzászólást!
  • Mindegy ha már egy része meglesz a szimulátoromnak majd pastie -be bevágom hátha valaki kíváncsi rá. Gondolom nem én vagyok az egyetlen akinek újra kell feltalálnia a fogaskereket.
    Mutasd a teljes hozzászólást!
  • mindig ezek az olcsójánosok viszik el a munkát :D
    dolgozz komolyan
    Mutasd a teljes hozzászólást!
  • Argathron: Heh, én is bécsi vagyok, második kerület xD Pitiáner. Én 1650 euróért készítek egy gyengébb verziót valakinek miközben az enyémet is hegesztem
    Ahogy elnézem akkor nem sokan szenvedtek ezzel...

    @ez nem megy: Nem gond összehozom helyetted is egész jól haladok vele Csak azt gondoltam többen is kaptak már hasonló feladatot.
    Mutasd a teljes hozzászólást!
  • Nem értem mi ez a hirtelen agresszivitás az oldalon.


    Értelmes embereket idegesít, ha valamit nem tudnak értelmezni.
    Az agyunk ezt személyes kudarcnak veszi, innen a frusztráció
    Nem értjük mit akarsz, mit vársz tőlünk.


    Mutasd a teljes hozzászólást!
  • 20 eurós órabérért segítek neked megírni bécsben
    Mutasd a teljes hozzászólást!
  • Nem, végül kidobtam még az elején. Eredetileg valami Z80 emulátor-féleséget szerettem volna összehozni, ami linuxon fut, de rá kellett jönnöm, hogy kevés vagyok hozzá. (főként kitartás terén)
    Azt hiszem, C-ben indultam neki, de még a tervezés környékén adtam fel, tényleges kód úgy emlékszem, nem készült...
    Mutasd a teljes hozzászólást!
  • Nem értem mi ez a hirtelen agresszivitás az oldalon. Csak a véleményetekre vagyok kíváncsi. A kész megoldásaitokra kevésbé bár azt is kirakhatjátok felőlem. Maximum ötletek érdekelnek vagy ,hogy ti kaptatok e hasonló feladatot már (mi volt a feladat pontosan).

    igen/nem válasz nem elég, de a te válaszodat elfogadom. Végül is sikerült befejezni vagy egy bizonyos pontig eljutnod ahol már valamit csinált a programod? C -ben írtad? Mennyi időbe telt befejezni (ha befejezted)?
    Mutasd a teljes hozzászólást!
  • Esetleg mutogasd a nyitó hozzászólásodat!

    -----
    Végeredményben még mindig nem tiszta, hogy mit vársz.
    Segítséget a megoldásban?
    Egy igen, igen, igen, nem válasz elég?
    Hobbiból, úgy tizensok éve próbálkoztam ilyesmivel, de végül úgy döntöttem, hogy több energiát igényel, mint amennyi értelme van, így kidobtam. Ennyi elég? Vagy azt várod, hogy valaki önként jelentkezik, hogy már megcsinálta, és átadja a kész anyagot?
    Mutasd a teljes hozzászólást!
  • előző comment ignorálva...

    OFF: Lehet itt a fórumon a commenteket a saját thread -ben törölni? Csak mert ha valakinek meg akarom mutatni a fórumon a használható válaszokat akkor ne idegesítő kisgyerekek -ek válaszait lássam.

    Tehát a feladat:

    1. Code Parser és Pre-processzor
    2. Assembler
    3. HEX File encoder/decoder
    4. UI
    5. CPU Sim. Engine

    A program egy konzolos alkalmazás nem használ grafikai interfészt. A végcél az hogy ilyen és hasonló 512 byte -nál kissebb nagyságú kódot "könnyedén" végre tudjon hajtani:

    ; a simple asm source code that multiplicates 11 with 13 .org 0x80 ; allocating space for 3 variables at 0x80 vresult .dw 0x0 ; stores the result vmul_1 .dw 0xb ; multiplicator = 11 vmul_2 .dw 0xd ; multiplicant = 13 .org 0x0 ; moving back to our source code _loop: srl vmul_1 ; shifts the multiplicator right logically jmp,c _add ; if there is a carry then we jump to the adder ; Carry Flag is not set jmp,z _exit ; if the multiplicator is 0 then we're done jmp _shift ; else we go back shifting the multiplicator further _add: lda vresult ; loading the result into the accumlator add vmul_2 ; adding the (shifted) multiplicant to it sta vresult ; storing vp back into the memory _shift: sl vmul_2 ; shifting the multiplicant to the left jmp _loop ; jumping back to the top of the loop _exit: .end ; done

    A processzor vagy mikrovezérlő, amely a fenti -hez hasonló utasításkészletet használja az alábbi tulajdonságokkal rendelkezik:

    Regiszterek: a, ix, sp, fp
    ahol
    'a' az akumlátor
    'ix' az index regiszter
    'sp' stack pointer (verem mutató, nem vagyok benne biztos hogy így nevezik magyarul)
    'fp' frame pionter (keret mutató ???)

    addressing modes:
    direct, példa: lda
    indirect, példa: lda,i
    register indirect with offset, példa: sta,ri
    immediate (konstans), példa: lda,c
    register, példa: ldr
    ezeken kívül címezhetőek még a már ismert c o s z flag -ek. Carry , Overflow, Signed, Zero

    Minden egyes utasítás 16 bit hosszúságú. Abból 9 általában a cím hosszúság. 2^9 = 512 Byte -ot képes megcímezni. Utasítás készletet itt nem listáznám de a fenti kód gondolom egyértelmű.

    Ennyit a berendezésről. Íme a feladat kicsit részletesebben:

    1. Code Parser és Pre-Processor
    - Kommentek eltüntetése
    - feleseleges white space -ek és new line character -ek eltüntetése,
    - Syntax vizsgálat
    - Pre-Processor: konstansok -at az értékükkel helyettesíteni,
    a parancsokat a megfelelő címekhez rendelni, .org parancs kivitelezése (jelöli hogy mely címen helyezkednek el a változók), változó neveket a címükkel helyettesíteni, megadott kezdő értékeket a változók címeire másolni

    2. Assembler:
    Translation Table segítségével átírni az utasításokat hexa formátumra és tárolni egy 512 Byte -os tárolóban. Például:
    lda 0x80
    bináris formában:
    0000_1000_1000_0000
    Assembler értelmezése szerint (hexa-decimal):
    0x0880

    3. Intel HEX File encoder/decoder
    Hasonló feladat mint a fenti annyi kivétellel hogy az Intel szabványait használva egy HEX kódolót/dekódolót kell írni. A végeredmény -nek alkalmasnak kell lennie arra hogy egy MCU -t vezéreljen.

    4. UI (Felhasználó felület)
    - command line argument -eket használva (ezt nem tudom hogy nevezik magyarul) megadni egy forrás állományt betöltésre. (pl.: load <source_code.asm>)
    - program vezérlését realizálni az alábbi parancsokkal:
    - ha r (run) -t adok meg akkor lefuttatja a kódot egészen egy break point -ig vagy a program végéig.
    - s (step) -el soronként végighaladhatok a kódon
    - dr (display registers) kiírja a regiszterek tartalmát
    - dm (display memory dump) kiírja a memória tartalmát
    - bs (set break point)
    - bc (clear breakpoint)
    - q (quit program)

    5. CPU szimulátor motor

    Végrehajtja a step és run parancsokat. Végrehajtja a programot. regisztereket, flag -eket, Stack -et (frame és stack pointer -k) szimulál stb. Ellenőrzi hogy nem e break point -on tartózkodik vagy a program végén. A legmagasabb címre 0x198 helyezi a PC -t majd halad lefelé 0x000 -ig.

    Ez volna a feladatom. Esetleg nem dereng valakinek hogy fősulin vagy valahol kellet hasonlót írnia és ha igen akkor sikerült e és hogy nehéznek találta e a feladatot. Én jelenleg a Syntax Check -et fejezem be és utána térek rá a Pre-Processzor -ra.

    Boldog Karácsonyt mindenkinek...
    Mutasd a teljes hozzászólást!


  • Nem lehet, hogy mindössze nyelvi gondjai vannak? Vagy csak szimplán részeg volt, amikor írta?

    Mutasd a teljes hozzászólást!
  • Ha sikerült megértenetek, hogy nagyjából mire gondolok



    Szerintem, itt a forumon, eleg sokan gondolunk valamire veled kapcsolatban....
    Mutasd a teljes hozzászólást!
  • Hello emberek!

    Rég nem jártam itt. Volna egy pár kérdésem de főleg a véleményetekre volnék kíváncsi.
    Épp most fejezem be az első szemesztert az FH Technikum Wien -en" Elektronik" szakon, azt hiszem MO -n ez a Villamos Mérnöki.

    A lényeg, hogy záróprojektként C programozásból egy CPU szimulátor nevű feladatot kaptunk. Sajnos azt nem nagyon értettem meg hogy mi a célja ennek a programnak. Csak azt, hogy assembly kódot kér be (8 bites mikrovezérlőről van szó ha minden igaz) és nekem ezt formáznom kell ("rések" eltüntetése, kommentár eltüntetése stb), syntax vizsgálata és egy pre-processzor megírása amely helyettesíti a deklarált konstansokat az értékükkel, változók nevét a címükkel kell helyettesíteni, ahol függvény hívás történik ott a címke helyére a címet kell kiírni majd egy köztes kódot hoz létre. Ezenkívül meg kell írnunk valamiféle "Intel HEX-File Encoder/Decoder" -t.

    Nem is szeretném most itt leírni a feladatot teljesen (mivel elég késő van és a feladat eléggé méretes) de amint lesz holnap időm, készítek egy átfogóbb leírást a feladatról.

    Ha sikerült megértenetek, hogy nagyjából mire gondolok (ha nem az sem baj majd holnap egyértelműbbé teszem a leírást) akkor az volna a kérdésem, hogy ti kaptatok e már hasonló feladatot munkátok során, vagy tanultatok e valami hasonlót?
    Mutasd a teljes hozzászólást!
Ez a téma lezárásra került a moderátor által. A lezárás oka: a konkr�t k�rd�seket m�r a tud�st�rban tedd fel l�gysz�ves!
abcd