Ну, например, буквально вчера сталкнулся с ЗЫЧевским асмом. Вот процедурка с аналогами инструкций на Дельфи справа (декриптует данные в Сайлент Хилле):
a0: Куда декриптовать a1: Откуда a2: Размер ADDU a3,r0,r0; a3:=r0*2 SRA a2,a2,02; a2:=a2 SHR 2 BLEZ a2,80010B1C; If a2<=0 Then GoTo 80010B1C (JR ra) ADDU v1,a3,r0 ; v1:=a3+r0 LUI t1,0130; t1:=01300000 ORI t1,t1,9125; t1:=t1 OR 9125 LUI t0,03A4; t0:=03A40000 ORI t0,t0,52F7; t0:=t0 OR 52F7 begin: ADDU v0,a3,t1; v0:=a3+t1 MULT v0,t0 ; Lo:=v0*t0 ADDIU v1,v1,0001; Inc(v1) LW v0,0000(a1); Load v0 on a1 ADDIU a1,a1,0004; Inc(a1,4) MFLO a3,Lo ; a3:=Lo XOR v0,v0,a3; v0:=v0 XOR a3 SW v0,0000(a0); Write v0 on a0 SLT v0,v1,a2; v0=(v1<a2) BNE v0,r0,begin; If r0<>v0 Then GoTo begin ADDIU a0,a0,004; Inc(a0,4)
А вот уже мной написанная процедура на Дельфи:
Procedure SHDecrypt(var Buf: Pointer; Size: Integer); var Pos,Mn: Integer; I: ^Integer; begin Mn:=0; Pos:=0; I:=Addr(Buf^); While Pos<Size div 4 do begin Mn:=(Code2+Mn)*Code1; I^:=I^ XOR Mn; Inc(I); Inc(Pos); end; end;
Основная проблема заключалась в том, чтобы понять, что делает процедура, а не слепо переписывать инструкции, переводя их на код Дельфи.
Даже назначения инструкций знать вовсе необязательно - справочник в зубы - и вперёд
Отредактировано HoRRoR (2007-10-21 09:48:44)