从C语言到汇编,从汇编到C语言
要从事“逆向工程”工作,或对其感兴趣,请必然要接触到汇编语言。然而我们在对计算机语言的了解大都是从高级语言(如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++)
00412BC7mov dword ptr ,0 // i=0; 给循环变量赋初值
00412BCEjmp myfunction+39h (412BD9h)// 跳到第一次循环处
>00412BD0mov eax,dword ptr
| 00412BD3add eax,1// i++;修改循环变量
| 00412BD6mov dword ptr ,eax
| 00412BD9cmp dword ptr ,32h //比较 i 与50的关系, 检查循环条件
| 00412BDDjge myfunction+4Ah (412BEAh)// 当 i>=50 [即 !(i<50) ] 时则跳出循环
| {
| c = c+i;
| 00412BDFmov eax,dword ptr // 变量 c
| 00412BE2add eax,dword ptr // 变量 i
| 00412BE5mov dword ptr ,eax// c=c+i;
| }
<00412BE8jmp myfunction+30h (412BD0h)// 跳回去修改循环变量
00412BEAmov eax,dword ptr
}
可以看到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;
00411A55mov eax,dword ptr
00411A58add eax,dword ptr
00411A5Bmov dword ptr ,eax
} while(c< 100);
00411A5Ecmp dword ptr ,64h
00411A62jl myfunction+35h (411A55h)
return c; 汇编指令..我看了1星期有了。 ..还没记得,,, 这不是天书夜读那本书上的那段吗,我最近看过 还不懂!!!!!! :dizzy:看不懂啊。 C语言学了半学期了。也就点皮毛- - debug版的反汇编指令和天书夜读写的差不多 都是大侠啊,真牛 汇编看的头痛:dizzy: 看对应代码还是用VC++调试器看吧,直观而又清晰