从C语言到汇编,从汇编到C语言
时间:2010-09-10 来源:qqmmcc123
要从事“逆向工程”工作,或对其感兴趣,请必然要接触到汇编语言。然而我们在对计算机语言的了解大都是从高级语言(如C、VB、Dephi)开始的。那当我们阅读由高级语言翻译成的机器语言时肯定会遇到很多障碍。 ... 要从事“逆向工程”工作,或对其感兴趣,请必然要接触到汇编语言。然而我们在对计算机语言的了解大都是从高级语言(如C、VB、Dephi)开始的。那当我们阅读由高级语言翻译成的机器语言时肯定会遇到很多障碍。下面是我在看了相关书籍后,做的一些笔记,希望有点参考价值! 一、循环语句与发汇编后的机器语言 1、for循环 下面是一段C语言的代码,我们的目的是来看其反汇编的结果: int myfunction(int a,int b) { int c = a+b; int i; for(i=0;i<50;i++) { c = c+i; } return c; } 前面的反汇编暂时不理它,这里从for的地方开始反汇编,结果如下: for(i=0;i<50;i++) 00412BC7 mov dword ptr [i],0 // i=0; 给循环变量赋初值 00412BCE jmp myfunction+39h (412BD9h)// 跳到第一次循环处 > 00412BD0 mov eax,dword ptr [i] | 00412BD3 add eax,1 // i++;修改循环变量 | 00412BD6 mov dword ptr [i],eax | 00412BD9 cmp dword ptr [i],32h // 比较 i 与50的关系, 检查循环条件 | 00412BDD jge myfunction+4Ah (412BEAh) // 当 i>=50 [即 !(i<50) ] 时则跳出循环 | { | c = c+i; | 00412BDF mov eax,dword ptr [c] // 变量 c | 00412BE2 add eax,dword ptr [i] // 变量 i | 00412BE5 mov dword ptr [c],eax // c=c+i; | } < 00412BE8 jmp myfunction+30h (412BD0h) // 跳回去修改循环变量 00412BEA mov eax,dword ptr [c] } 可以看到for循环主要用这么几条指令来实现:mov进行初始化。jmp跳过循环变量改变代码。cmp实现条件判断,jge根据条件跳转。 用jmp回到循环改变代码进行下一次循环。所以for结构有以下的显著特征: mov <循环变量>,<初始值> ; 给循环变量赋初值 jmp B ;跳到第一次循环处 A: (改动循环变量) ;修改循环变量。 … B: cmp <循环变量>,<限制变量> ;检查循环条件 jgp 跳出循环 (循环体) … jmp A ;跳回去修改循环变量 2、do循环 再看一下do循环,因为 do循环没有修改循环变量的部分,所以比for循环要简单一些。 do { c = c+i; 00411A55 mov eax,dword ptr [c] 00411A58 add eax,dword ptr [i] 00411A5B mov dword ptr [c],eax } while(c< 100); 00411A5E cmp dword ptr [c],64h 00411A62 jl myfunction+35h (411A55h) return c; |
相关阅读 更多 +