gongheng 发表于 2011-10-13 14:12:19

请高手帮忙看看一个反汇编的练习题!!!

下面是《天书夜读》的一道反汇编的练习题,我试着翻译成C语言,但是只翻译了一些程序的片断出来,不能组成一个完整的程序,请高手帮忙看看,到底能不能翻译成一个完整的程序!谢谢!(练习题下面有我翻译的片断)

====================================================================

;下面是一个练习,内容是把下面的汇编代码还原成c语言(后面的注释是我自己分析的,也不知道对不对)
00411A20push      ebp                                             ;保存ebp

00411A21mov         ebp,esp                                        ;esp的值送给ebp(此时esp==ebp)
00411A23sub         esp,0E8h                                       ;开辟 0E8h 字节的栈空间
00411A29push      ebx                                              ;保存 ebx esi edi 三个寄存器
00411A2Apush      esi
00411A2Bpush      edi
00411A2Clea         edi,                               ;把上面开辟的 0E8h 字节大小的栈空间地址
         ;送入edi中
00411A32mov         ecx,3Ah                                        ;设定装载 0CCCCCCCCh 次数(0E8h/4=3Ah)
00411A37mov         eax,0CCCCCCCCh
00411A3Crep stos    dword ptr                             ;用eax的值初始化
00411A3Emov         eax,dword ptr                          ;eax=a
00411A41add         eax,dword ptr                            ;eax=a+b
00411A44mov         dword ptr ,eax                         ;b=eax   b=a+b
00411A47mov         dword ptr ,1                               ;i=1
00411A4Emov         dword ptr ,0                           ;c=0
00411A55cmp         dword ptr ,64h                         ;c与100比较
00411A59jge         myfunction+46h (411A66h)          ;如果 c>=100 跳转到 411A66h 处
00411A5Bmov         eax,dword ptr                          ;eax=c
00411A5Eadd         eax,dword ptr                             ;eax=c+i
00411A61mov         dword ptr ,eax                         ;c=eax   c=c+i
00411A64jmp         myfunction+35h (411A55h)          ;无条件跳转到 411A55h 处(进入下次循环)
00411A66mov         eax,dword ptr                         ;c的值送入eax
00411A69mov         dword ptr ,eax             ;eax(c)的值送入栈保存
00411A6Fcmp         dword ptr ,0               ;eax(c)的值与0比较 (case 0:)
00411A76je          myfunction+63h (411A83h)             ;如果eax(c)=0,则跳到 411A83h 处
00411A78cmp         dword ptr ,1               ;eax(c)的值与1比较 (case 1:)
00411A7Fje          myfunction+6Ah (411A8Ah)            ;如果eax(c)=1,则跳到 411A8Ah 处
00411A81jmp         myfunction+72h (411A92h)         ;无条件跳转到 411A92h 处 (default)
00411A83mov         dword ptr ,1                              ;d=1
00411A8Amov         eax,dword ptr                            ;c送入eax
00411A8Dmov         dword ptr ,eax                         ;d=c(eax)
00411A90jmp         myfunction+79h (411A99h)          ;无条件跳转到 411A99h 处
00411A92mov         dword ptr ,0                              ;d=0
00411A99mov         eax,dword ptr                         ;d送入eax(return d)
00411A9Cpop         edi                                                 ;恢复 edi esi ebx esp ebp 的值
00411A9Dpop         esi
00411A9Epop         ebx
00411A9Fmov         esp,ebp
00411AA1pop         ebp
00411AA2ret
====================================================================

下面是我翻译的片断:

====================================================================

b = a + b;
i = 1;
c = 0;
while ( c<100 )
       {
          c = c + i;
       }

switch ( c )
{
    case 0:
         {
            d = 1;
            d = c;
         }
         break;
   case 1:
       {
          d = c;
       }
         break;
default:
d = 0;
}
return d;

gongheng 发表于 2011-10-13 14:13:10

晕,怎么字体都变了{:5_94:}

hkylin 发表于 2011-10-13 16:50:27

没有原程序麽?

gongheng 发表于 2011-10-13 18:38:30

hkylin 发表于 2011-10-13 16:50 static/image/common/back.gif
没有原程序麽?

没有源程序,有的话,我就知道它是个完整的程序了,现在就是不知道它到底是不是完整的程序
页: [1]
查看完整版本: 请高手帮忙看看一个反汇编的练习题!!!