精通C语言先学习汇编才是正确的学习顺序
虽然说汇编是一门独立的语言,C也是一门独立的语言,它们看上去并没有什么联系,但是学习汇编可以帮助我们分析C语言程序的设计原理。要想精通C语言,必须先学习汇编才是正确的学习顺序。
举例:【“Hello World!”程序使用汇编表现】
使用“Hello World!”程序介绍,如图3-5-1所示。
图3-5-1中,我们只看到了C语言代码,并没有看到汇编,我们该怎么查看呢?在Visual C++开发工具中,反汇编窗口,需要下断点、按F7编译、按F5调试运行才能切换到反汇编窗口。该如何下断点哪?选中“int main(void)”这一行按F9,会在这一行代码前出现一个红色的圆点,说明已经断下断点,看图3-5-2所示。【注:按F9下断点只是在Visual C++开发工具中使用】
按F9下断点后,我们接着按F7,让程序编译,程序通过编译后再按F5调试,会出现如图3-5-3所示。
出现图3-5-3的界面之后,我们点击鼠标左键,出现如图3-5-4界面。
选择Go To Disassembly,出现如图3-5-5的界面,说明成功切换到反汇编窗口,按F10 一步一步执行。
看图3-5-5中,有如下代码示例:
以上是一个完整的函数调用,也是“Hello World!”程序的运行原理。
我们也可以在C语言程序中嵌入汇编,我们称为内联汇编。接下来介绍内联汇编。
3.5.2【内联汇编】
内联汇编格式:
__asm
{
}
我们在里面添加一些代码:
#include
int main(void)
{
__asm
{
mov eax,eax
mov ecx,eax
mov edx,ecx
}
return 0;
}
我们在Visual C++中输入代码示例CH03_5_1,如图3-5-6所示。
在main函数前下断点,我们切换到反汇编窗口查看,如图3-6-7所示。
图3-6-7中的C语言代码和汇编代码如下:
1: #include
2: int main(void)
3: {
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,40h
00401016 push ebx
00401017 push esi
00401018 push edi
00401019 lea edi,[ebp-40h]
0040101C mov ecx,10h
00401021 mov eax,0CCCCCCCCh
00401026 rep stos dword ptr [edi]
4: __asm
5: {
6: mov eax,eax
00401028 mov eax,eax
7: mov ecx,eax
0040102A mov ecx,eax
8: mov edx,ecx
0040102C mov edx,ecx
9: }
10: return 0;
0040102E xor eax,eax
11: }
00401030 pop edi
00401031 pop esi
00401032 pop ebx
00401033 add esp,40h
00401036 cmp ebp,esp
00401038 call __chkesp (00401050)
0040103D mov esp,ebp
0040103F pop ebp
00401040 ret
总结“Hello World!”程序一共只写了9行代码,而编译器自动生成了很多汇编指令,同样“CH03_5_1”中的程序也只有短短的11行代码,编译器也自动生成了很多汇编指令,虽说汇编指令可以让我们知道自己写的程序运行过程的原理,但是没有C语言更直观的体现出我们想要的结果。简而言之,汇编语言更倾向于描述程序运行的过程,C语言更倾向于描述结果。
如果我们把程序运行的过程搞清楚,那么肯定能分析出程序的结果,反之,如果只知道程序的结果并不知道程序运行中是怎样一步一步实现的,那只能说我们并没有真正的学会C语言。所以这就是我们课程为什么学习汇编,为什么把汇编放在C语言之前讲的原因。