汇编语言在C语言学习中的应用
2017-05-24曹挚
曹挚
摘 要:汇编语言是和机器语言一一对应的一种符号语言。通过汇编语言能够看到程序执行的全过程。通过查看高级语言(这里以C语言为例)对应的汇编语句,可以更加深入地理解程序的执行步骤。本文通过一个C语言表达式的例子来说明利用汇编指令能够解释C语言中晦涩难懂的语句的执行过程。
关键词:汇编语言;机器语言;符号语言;高级语言
一、引言
在C语言的学习过程中,不同的读者会使用不同的编译器进行程序的运行和调试,不同的C语言编译器由于开放厂商不同,对于C语言的某些晦涩难懂的表达式产生不同的结果。尽管这些问题只占C语言学习过程中的小部分,但是对于C语言的初学者来说会有学习障碍并产生畏难情绪。目前很多编译器都有一个反汇编功能。这里的反汇编特指将C程序源代码反向编译成汇编语言的代码。由于汇编语言和机器语言是一一对应的,因此通过汇编语言能够看到对应的C语言代码在机器中的运行全过程,这个过程仅仅通过C程序代码来看是不够清晰的。本文以一个表达式的例子来说明反汇编后的语句能够解释C代码中的疑难问题。特别说明的是这里需要读者对汇编语言有简单的了解。
二、汇编语言与高级语言
计算机能够识别的只有二进制的机器指令,然而由于机器指令繁琐且难懂,因此产生了一种符号语言即汇编语言。汇编语言用一些常见的英文字母和数据表示一个指令,同时汇编语言中的汇编指令与机器指令是一一对应的,而目前流行的高级语言是做不到的。汇编语言是机器语言的助记符,在各种计算机语言中,除了机器语言,汇编语言是执行速度最快的语言,所占的内存空间也很小。汇编语言曾经是非常流行的程序设计语言,但是随着软件规模的不断增长,人们对于软件开发的进度和效率的要求越来越高,汇编语言显得有些力不从心,高级语言就逐渐代替了汇编语言。汇编语言的应用逐渐转向了嵌入式领域和工业控制领域。但是高级语言并不能完全代替汇编语言,汇编语言能够最大限度地发挥硬件的性能。
我们经常接触的C语言、C++语言、Java语言、C#语言都属于高级语言的范畴,高级语言和机器语言有一定的鸿沟,它属于偏向人类自然语言的一种计算机语言。高级语言中的语句类似于数学表达式,人们更加容易理解,因此高级语言成为了目前主流的计算机语言。尤其是近些年来,面向对象的思想能够更加准确地模拟了自然界的行为,因此面向对象的高级语言(如C++、Java、C#)成为了软件设计的主流语言。
三、一个例子
这里举一个C语言的例子,程序输出由三个自增运算符相加后的结果。运行的环境是VC++6.0。这里有必要说明的是,该语句在不同的编译器下面可能会产生不同的结果。而对于不同结果的解释则要通过将C语言转换成对应的汇编语言才能够解释清楚。限于篇幅,这里只将程序的核心语句列出:
int i = 1; int s; s = (++i) + (++i) + (++i); printf("%d\n", s);
很多初学者看到这个表达式,不假思索地就会得出6,因为他们认为i初始值为1,自增后都为2,因此结果为6。还有一部分人想得深入一些,他们认为编译器会先计算第一个++i,i自增以后为2,然后计算第二个++i,自增后i的值是3,最后计算第三个++i,得到4,计算2+3+4值为9。这种想法看似合理,然而通过编译器VC++6.0运行后的结果是10。这个结果让人无法理解,这里只有通过该表达式对应的汇编语言才能解释清楚。通过VC++6.0中的反编译工具,得到了语句s = (++i) + (++i) + (++i)所对应的汇编语言如下:
mov ecx, dword ptr[ebp-8]
add ecx, 1
mov dword ptr [ebp-8], ecx
mov edx, dword ptr [ebp-8]
add edx, 1
mov dword ptr [ebp-8], edx
mov eax, dword ptr [ebp-8]
add eax, dword ptr [ebp-8]
mov ecx, dword ptr [ebp-8]
add ecx, 1
mov dword ptr [ebp-8], ecx
add eax, dword ptr [ebp-8]
mov dword ptr [ebp-0Ch], eax
从对应的汇编语言中可以看出,VC++对该语言进行了优化。先算的是前两个++i,即此时i的值为3,前后两个i都为3。然后相加后再计算第三個++i,此时i的值为4,这样最后的结果就是3+3+4的和为10,和程序运行后的结果一致。这里体现出了汇编的思维,而不仅仅是用C语言的语法来解释。
四、总结与展望
通过前面的例子可以看出,在学习C语言之前,适当了解一些汇编语言的语法和计算机底层硬件的知识是大有好处的,因为汇编语言和机器语言能够做到一一对应,而高级语言则无法做到,因此将高级语言(如C语言)通过编译器转化成汇编语言,可以清晰地看到程序在机器上的运转过程。对于程序中含义模糊的语句就可以一目了然了。通过上面的例子也可以看出,学习C语言最好要有点汇编语言的思维,C语言里面晦涩难懂的语句可以通过其对应的汇编语言来解释。另外学习汇编语言可以让你真正了解计算机,理解高级语言的本质与真谛。对于一个全面了解微机原理的程序员,汇编语言是必修语言。