Portál AbcLinuxu, 10. května 2025 05:44
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.
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.
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.
whitespace + identifikátor + whitespace + číslo/jmémo proměnné + whitespaceA 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í.
jestli nepůjde zjednodušit stylemNo 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
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í.
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.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.