Portál AbcLinuxu, 10. května 2025 05:44

Dotaz: "Univerzální" (dis)assembler

MaSo avatar 4.1.2016 20:33 MaSo | skóre: 15 | blog: MaSo | Frýdek-Místek
"Univerzální" (dis)assembler
Přečteno: 991×
Odpovědět | Admin
Zdravím, zkouším si navrhnout vlastní CPU do CPLD/FPGA. Mám tím pádem i vlastní instrukční sadu s vlastními opkódy.
Můj dotaz je tímto jednoduchý:
existuje nějaký "univerzální" (dis)assembler, který bych naučil moje instrukce+opkódy?
Zkouším si psát vlastní (hehe, v BASHi :-D ), ale je to peklo; parsovat řádky a v nich třeba i matematické operace, kde se až výsledek "připojí" k dané instrukci, atd. Třeba separovat mezery, uvozovky, apostrofy jako vstup pro instrukci, ...
CPU bude sloužit jako řídící prvek pro konkrétní aplikace, které vyžadují interakci s nadřazeným systémem. Momentálně se řídím PICkama, ALE něco zjednodušuji a něco vylepšuji - více registrů, mnohonásobně rychlejší zpracování instrukcí (zatím se mi vše daří vecpat do 2 fází hodin, tzn. využití rise i fall hodin) a to včetně zpracování přerušení - uložení/výběr adresy.
Webové síťové nástroje: http://nettools.mzettik.cz (pracuje se na tom - pomalu :-) )
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

4.1.2016 21:59 pako
Rozbalit Rozbalit vše Re: "Univerzální" (dis)assembler
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jestli existuje "universální" assembler nevím, ale parsovat cokoliv v bashi zní jako docela krkolomná akce. Určitě snáze by to šlo s Pythonem (pro sh-like syntaxi obsahuje modul shlex, už jen to by Vám vyřešilo zábavu s mezerami a řetězci v uvozovkách) nebo Perlem. Obecněji se asi budete chtít podívat na nástroje lexikální analýzy (jako flex/bison).
5.1.2016 01:00 Petr Šobáň | skóre: 80 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: "Univerzální" (dis)assembler
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nic univerzálního neexistuje.

Prostě příkazy znáš tak si napiš vlastní překladač který poběží na jiné platformě a tam pak napíšeš překladač který už poběží na tvém CPU a pak už budeš soběstačný.
5.1.2016 21:19 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: "Univerzální" (dis)assembler
Odpovědět | | Sbalit | Link | Blokovat | Admin
Hustý, 8 bit? Jak moc RISC? Já před pár lety zkoušel psát emulátor instrukcí pro x86 a to v perlu. Ty regexpy se daly krásně použít na parsování řetězců 010101 :-D. Mám dojem, že jsem přepsal všechny instrukce z pentia datasheetu, ale pak už jsem se na emulaci ve virtuálních registrech vykašlal :-/.

Pokud chceš psát něco vlastního, tak si radši než BASH napiš parsovací funkce v C (i tam můžeš použít bitfieldy v packed struct). Ale pokud je to nějaká normální architektura a plánuješ ji rozvinout, tak si můžeš patchnout binutils a pak můžeš pracovat s objektovýma souborama. Jenom možná binutils bude asi mít problémy parsovat 8/16bit binárky.

Horší by byl překladač.

P.S. Napiš o tom hackování blog ;-).
Intel meltdown a = arr[x[0]&1]; karma | 帮帮我,我被锁在中国房
MaSo avatar 6.1.2016 20:03 MaSo | skóre: 15 | blog: MaSo | Frýdek-Místek
Rozbalit Rozbalit vše Re: "Univerzální" (dis)assembler
Jedná se o 8b data, registry, ... adresování až 13b (velikost instrukce je fixních 16b) (interní ROM) - původně bylo zamýšleno čtení programu z ext. SPI Flashky, k čemuž se možná vrátím (v simulátoru (Logisim, kde navrhuji i toto µCPU) mám hotovou "čtečku" EEPROMky 93C46 v 8b režimu). 64b (zatím - podpora až 256B) interní RAM pro data. Pro jednoduché aplikace - takové "SoC" by to mělo stačit - vše bude v jednom CPLD/FPGA čipu. Pokud se to nevleze do CPLD, tak to půjde do FPGA, kde už by to teoreticky díky internímu PLL mohlo šlapat až někde na 300-600MHz = 300-600MIPS.
Momentálně se dá říct, že se jedná převážně o RISC (1 takt hodin, malá sada instrukcí, která se bude asi rozšiřovat - zatím je jen pár instrukci - chci doladit Assembler pro lepší testování s možnosti exportu přímo pro Logisim). Instrukci bude nejspíše přibývat, tak snad z toho nakonec nebude CISC... :-D
Co se týče assembleru, tak nejvíce si rozumím s BASHem i když jsem našel na netu very-light parser assemleru v Pythonu (který vůbec neumím) a tak nějak jsem jej poladil pro mé účely - učím se s tím docela rychle. Netušil jsem, jak je Python rychlý na to, že je to jen "skriptovací" jazyk. A s tím C, nevím, no. Už jsem jej kdysi zkoušel (řízení krokáče přes paralelní port), toť vše :-D Co se mi tak zdá, tak Python má docela blízko k C, tak uvidím, co dál... Každopádně chci vykutit nějaký základní (dis)assembler, pak budu pokračovat v HW CPU.
No blog, já zas nejsem na nějaké to rozepisování :-)

Už jsem tak před rokem navrhoval komplexnější CPU (CISC), ale myslím, že jsem taky skončil u assembleru (který i docela fungoval), čímž to zhaslo :-/ )
Webové síťové nástroje: http://nettools.mzettik.cz (pracuje se na tom - pomalu :-) )
7.1.2016 07:40 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: "Univerzální" (dis)assembler
Aha takže něco na úrovni PICu nebo picoblaze. S tím by asi měly binutils problém. Ale zase pro tak malý opcode prostor není problém napsat vlastní parser. A důležité je použít něco co umí pracovat s bitovými poli. V bashi je to dost o ústa :-D.

Python určitě nemá blízko k C :-D, ale pokud na to máš už nějakej template tak proč ne. Já jsem původně zavrhl bison a flex parsování (makrojazyk, který se přeloží do C, trochu těžkopádná syntaxe a vykopírování třeba řetězců lehko vede k segfaultu při chyb programátora), ale nakonec jsem se k nim rád vrátil (od perlu).

Blog klidně jen ukázky architektury :-D.
MaSo avatar 7.1.2016 19:38 MaSo | skóre: 15 | blog: MaSo | Frýdek-Místek
Rozbalit Rozbalit vše Re: "Univerzální" (dis)assembler
Bitovém pole myslíš v parseru? (Tam nevidím problém, v minulém "projektu" CPU jsem to měl) Nebo myslíš instrukce v CPU pro bitové operace? také není problém, ale zatím je nemám.
Hmm, dle mně se Python a C podobá, ale to je jedno, hlavně, abych to dotáhl do konce, ať už použiji cokoli... :-D
Webové síťové nástroje: http://nettools.mzettik.cz (pracuje se na tom - pomalu :-) )
8.1.2016 10:36 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: "Univerzální" (dis)assembler
Myslím bitové pole v C struct definici. Například (náhodně vybrané z PIC32 kompilátoru):
typedef union {
  struct {
    unsigned TBF:1;
    unsigned RBF:1;
    unsigned R_W:1;
    unsigned S:1;
    unsigned P:1;
    unsigned D_A:1;
    unsigned I2COV:1;
    unsigned IWCOL:1;
    unsigned ADD10:1;
    unsigned GCSTAT:1;
    unsigned BCL:1;
    unsigned :3;    //reserved
    unsigned TRSTAT:1;
    unsigned ACKSTAT:1;
  };
} __I2C2ASTATbits_t;
Tohle vlastně definuje přímo bity v nějakém 16 bit registru. Když pak uložíš nebo načteš nějakou proměnnou třeba z binárního souboru, tak máš hned rovnou přístup k jednotlivým hodnotám.
MaSo avatar 8.1.2016 23:46 MaSo | skóre: 15 | blog: MaSo | Frýdek-Místek
Rozbalit Rozbalit vše Re: "Univerzální" (dis)assembler
aha :-)
Tak tak dalece k definicím jsem se zatím nedostal. A ono zatím nemám ani co definovat, ještě nejsou žádné "HW" registry. I když...
... mám už tam několik typů přerušení ("akce": enable, flag a clear).
Programování bude čistě v asm., C implementovat nebudu - to je mimo mé schopnosti.
Webové síťové nástroje: http://nettools.mzettik.cz (pracuje se na tom - pomalu :-) )
9.1.2016 09:34 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: "Univerzální" (dis)assembler
Tak hodně štěstí :-D. BTW Jaký FPGA vlastně?
MaSo avatar 9.1.2016 17:29 MaSo | skóre: 15 | blog: MaSo | Frýdek-Místek
Rozbalit Rozbalit vše Re: "Univerzální" (dis)assembler
Dík no.... :-D
Soustředil jsem se na Xilinx, nějaké hrátky byly zatím jen s nejnižším CPLD XC9536, doma mám pak XC95288 (nebo jak to je) a pak jestli se nepletu, tak nějakého Spartana-3 a Spartana-6 XC6SLX9 (11400 klopáků). Programátor mám Presto (podpora EEpromů/Flash, různé µ-controléry, podpora JTAG) od Asixu (česká firma) s podporu SW pro Linux (sic "jen" přes wine, ale funguje bez chyb). Psal jsem o něj blog tady na ábíčku.
Webové síťové nástroje: http://nettools.mzettik.cz (pracuje se na tom - pomalu :-) )
9.1.2016 22:34 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: "Univerzální" (dis)assembler
Do XC9536 se to téměř určitě nevejde (tam je jen 36 registrů). Pokud chceš nějakou pamět programu, tak ideálně blockRAM v jednom z těch spartanu.
MaSo avatar 10.1.2016 18:47 MaSo | skóre: 15 | blog: MaSo | Frýdek-Místek
Rozbalit Rozbalit vše Re: "Univerzální" (dis)assembler
jj, tohle vím, použiji toho spartana... a RAMku mám navrhlou svou...
Webové síťové nástroje: http://nettools.mzettik.cz (pracuje se na tom - pomalu :-) )
6.1.2016 23:51 Tomáš
Rozbalit Rozbalit vše Re: "Univerzální" (dis)assembler
Odpovědět | | Sbalit | Link | Blokovat | Admin

Psát parser pro gramatiku ( ač jednoduchou ) není nic triviálního. Zvláště ne v bash. Podíval bych se na generátory parserů. Konkrétně na ANTLR. Tady je příklad assembleru. Má to 630 řádek z nich 1/4 jsou prázdné řádky.

Další variantou jsou pak lex/flex a yacc/bison.

Myslím, že na ten disassembler by šly tyto nástroje použít.

MaSo avatar 7.1.2016 20:37 MaSo | skóre: 15 | blog: MaSo | Frýdek-Místek
Rozbalit Rozbalit vše Re: "Univerzální" (dis)assembler
joj, tak to ANTLR vypadá, že je odpověď na můj dotaz. Sic nechápu, proč je tak složitě definované case insensitive instrukcí, ale i tak. Dále, co jsem se díval na příklad, tak zápis typu:
blabla
  : x y
  ;
jestli nepůjde zjednodušit stylem:
blala: x y ;
Jak budu mít trošku času, tak na to mrknu, zatím moc díky.
Jen ještě nevím, co z toho vyleze, jestli JEN ověřuje syntaxi a až pak si musím ??sám?? vytvořit převod na strojový kód (hex/bin)nebo je tam další definice k hlubší analýze a převodu.
Určitě se budu muset podívat na nějaký ten (RT)FM :-D
Zatím moc díky!
Webové síťové nástroje: http://nettools.mzettik.cz (pracuje se na tom - pomalu :-) )
8.1.2016 10:30 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: "Univerzální" (dis)assembler
Parsery fungujou tak, že si vytvoříš předpis jazyka například:
whitespace + identifikátor + whitespace + číslo/jmémo proměnné + whitespace
A v sekci, která tomuhle předpisu bude odpovídat získáš nějakou funkcí toho parseru to číslo nebo jméno proměnné a to použiješ pro vygenerování opkódu nebo nějaké akce (třeba EXIT u skriptu, v případě assembleru třeba vygenerování adresy návěští).

U makrojazyka bison/yacc můžeš zapsat víc na řádek, oddělují se tuším znakem pajpou. Vtip je v tom, že za každej match můžeš hodit kus svého kódu. Ale řekl bych, že to bude nějak i u toho ANTLR. On je ten formát zápisu gramatiky dost jazykově nezávislý.

Já používal jako úplně první seznámení seriál tady na abclinuxu "Jazyky a překladače".

V případě převodu bin → asm se ale IMO parser nevyplatí.
Jendа avatar 8.1.2016 10:44 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: "Univerzální" (dis)assembler
jestli nepůjde zjednodušit stylem
No minimálně v Bisonu to zdá se projde. Jinak já to píšu stylem tak mezi:
foo:   bar
     | baz
     ;
Ještě jsem za to vynadáno nedostal.
Jen ještě nevím, co z toho vyleze, jestli JEN ověřuje syntaxi a až pak si musím ??sám?? vytvořit převod na strojový kód (hex/bin)nebo je tam další definice k hlubší analýze a převodu.
Opět něco mezi :-). Nejen, že to ověří syntaxi, ale v okamžiku, kdy ti to žere kus vstupu, si tam můžeš přidat kus vlastního kódu - typicky to, co právě vygeneruje stroják. Např. (zjednodušeně)
term_loop:  term_loop DUTOK_PLUS term {
              $$.přidej_kód(nacpi $1 na stack);
              $$.přidej_kód(nacpi $2 na stack);
              $$.přidej_instrukci(ADD);
            }
            ;
Vysoce užitečný byl předmět PP, bohužel k tomu nejsou použitelná skripta. Přemýšlel jsem, že něco napíšu, ale a) jsem lama, mé znalosti jsou na úrovni toho jednosemestrálního kurzu, b) efektivně by to znamenalo udělat step-by-step návod na řešení těch úkolů, které se každý rok recyklují.
8.1.2016 11:32 tom
Rozbalit Rozbalit vše Re: "Univerzální" (dis)assembler
Odpovědět | | Sbalit | Link | Blokovat | Admin
Na prototypovani je asi nejrychlejsi perl. Podival bych se na implementaci

http://search.cpan.org/~pscust/CPU-Z80-Assembler-2.15/lib/CPU/Z80/Assembler.pm

a vzal si z toho pouzitelne knihovny, treba

http://search.cpan.org/~pscust/Asm-Preproc-1.02/lib/Asm/Preproc.pm
8.1.2016 17:12 Zopper | skóre: 15
Rozbalit Rozbalit vše Re: "Univerzální" (dis)assembler
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jednoznačně se připojuji k "použít lex+yacc/bison". Konkrétně nadhodím PLY: http://www.dabeaz.com/ply/ což je python implementace lex+yacc, nedávno jsem to použil. V odkazech se dá najít i implementace překladače pro jazyk C.

Tohle je samozřejmě situace, kdy formální vzdělání hodně věcí zjednoduší. Vědět, co je, jak vypadá a jaké má omezení bezkontextová gramatika (a jak ji vytvořit)... Protože aspoň v nějaké intuitivní a zjednodušené formě to stejně budeš muset pochopit, abys mohl vysvětlit těm nástrojům, jak tvůj jazyk vypadá. ;-)
"Dlouho ještě chcete soudit proti právu, stranit svévolníkům?" Ž 82,2
9.1.2016 09:40 pc2005 | skóre: 38 | blog: GardenOfEdenConfiguration | liberec
Rozbalit Rozbalit vše Re: "Univerzální" (dis)assembler
Ja ještě přihodím odkazy na manuál a učebnici, co jsem použil pro úspěšně "fungující" gramatiku :-D.

Jinak se hodí znalost regexpů.
MaSo avatar 9.1.2016 17:34 MaSo | skóre: 15 | blog: MaSo | Frýdek-Místek
Rozbalit Rozbalit vše Re: "Univerzální" (dis)assembler
Díky moc! Mrknu na to :-)
S regexpy nějaký problém nemám (sice často musím použit strejčka... :-D )
Webové síťové nástroje: http://nettools.mzettik.cz (pracuje se na tom - pomalu :-) )
12.1.2016 15:31 Marek Sulik
Rozbalit Rozbalit vše Re: "Univerzální" (dis)assembler
No ak ti stačia regulárna gramatika, tak potom odporúčam RAGEL.

http://www.colm.net/open-source/ragel/

12.1.2016 18:37 Marek Sulik
Rozbalit Rozbalit vše Re: "Univerzální" (dis)assembler
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ak chceš, tak mǒžem pomǒct s tým disassemblerom. Zadarmo.

MaSo avatar 15.1.2016 17:12 MaSo | skóre: 15 | blog: MaSo | Frýdek-Místek
Rozbalit Rozbalit vše Re: "Univerzální" (dis)assembler
Děkuji :-)
disassembler je relativně jednoduchý i v rámci BASHe, horší je to právě s assemblerem: gramatika, proměnně včetně doplňkových výpočtů, např.:
napr: = (b'00110100'+0x17)/2
offset equ (11+0x20)*2-napr
 movlr 'A'+offset,r3  (nebo: movr #'a'+h'1e',r4 - křížek se používal u Motoroly, ke které mám dost blízko)
výpočty udělat skrze např. 'bc' (což už mi částečně funguje, až na doplňování proměnných), tady je boj.
Pokud se mi nepodaří nějak obstojně ovládnout nějaký "tool", tak to nakonec udělám v BASHi, což potrvá :-) Anebo python, kde jsem našel jeden příklad - premiéra s Pythonem :-)
Webové síťové nástroje: http://nettools.mzettik.cz (pracuje se na tom - pomalu :-) )

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.