Optimalizátor zdrojového textu v ASM ?
Pavel Troller
patrol na sinus.cz
Sobota Září 24 10:40:07 CEST 2011
Zdravím při víkendu,
pomalu dokončuji reverzní inženýring firmware jednoho hezkého zařízení
a chtěl bych ho po svých autorských změnách přeložti zpětně do bináru a
spustit. V zařízení je použita klasická 8052.
Problém je, že původní firmware je buďto přeložen z jiného (asi mírně
vyššího) jazyka jako je C, nebo psán v nějakém makroassembleru s nevhodně
navrženými makry, takže je vyloženě skličující jej číst a studovat a je
mi líto chudáka MCU, ten si taky myslí svoje. Zcela reprezentativní je
například tento kousek:
MOV DPTR,#SOMETHING
MOVX A, na DPTR
MOV DPTR,#SOMETHING
PUSH ACC
CLR A
MOVX @DPTR,A
POP ACC
MOV R6,A
MOV A,R6
CJNE A,#1,nekam
MOV A,R6
CJNE A,#2,jinam
MOV A,R6
CJNE A,#3,estejinam
...
Zkrátka odhadem třetina (nepřeháním, to číslo zhruba sedí) instrukcí je
v programu zcela zbytečných.
Program generuje 48k bináru. Zatím nevím, kolik má přesně source (ještě
jsem jej nevyexportoval z IDA), ale jistě uznáte, že na manuální
optimalizaci je to moc.
V uvedené ukázce bych rád optimalizaci alespoň takovou, aby to vyhodilo
druhý MOV DPTR a samozřejmě všechny instrukce pracující s R6, které jsou tam
naprosto zbytečné - do žádného místa programu se zvenčí neskáče a R6 je
vzápětí využit zase jako dočasný registr pro podobně nesmyslnou operaci.
Ještě lepší optimalizaci, kdy např. ke přesunu do R6 by došlo ihned po
prvním MOVX, pak by se eliminovaly i PUSH/POP a a CJNE by byly s R6 místo
s A, už nevyžaduji, ikdyž samozřejmě by byla pěkná.
Existuje nějaký program tohoto schopný ? Vím, že třeba GNU toolchain
optimalizovat umí, ale nevím zdaleka, nakolik to dělá na úrovni ASM a nadto
by to asi nezvládl na mnemonice I8051, ale to by se možná dalo udělat
nějakým předpřekladem do toho jeho "metaassembleru". Nicméně nějaký
specializovanější nástroj by samozřejmě byl lepší.
Zdraví Pavel
Další informace o konferenci Hw-list