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