美河学习在线 www.eimhe.com 仅学习参考
从 C 语言到汇编,从汇编到 C 语言
要从事“逆向工程”工作,或对其感兴趣,请必然要接触到汇编语言。然而我们在对计算
机语言的了解大都是从高级语言(如 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: (改动循环变量) ;修改循环变量。
评论0
最新资源