在和系主任讨论后没多长时间,我就发现汇编器不必改变汇编语言的语义,完全可以吸纳更多的高级语言语法。打个比方,请看下面用C/C++和Pascal声明整型数组变量的语句:
再考虑用MASM声明来实现同样的变量声明:
尽管C/C++和Pascal的声明各不相同,汇编语句随着版本差异也不是一成不变的,但即使从未见过Pascal代码,C/C++程序员也能琢磨出Pascal声明的含义,反过来也一样。然而C/C++和Pascal程序员大概会对汇编语言的声明摸不着头脑。这只是高级语言程序员初次学习汇编语言所遇到的问题之一。
这种情况实在可悲,为什么非要让汇编语言的变量声明和高级语言不同呢?变量声明语法在最终的可执行文件中与汇编器结果并无区别。既然如此,汇编器为何不用类似高层语言的语法,以使人们从高级语言转而学习汇编语言比较容易呢?这正是引发我深思的问题,也促使我开发了新的汇编器— HLA ,它特别适合面向汇编语言编程的教学,可以供已掌握了高级语言编程的学生使用。例如在HLA中,先前提到的数组声明是这样的:
HLA的语法尽管与C/C++、Pascal有少许区别,因为它其实是后两者语法的结合,但大多数高级语言程序员能够领会该声明的意思。
设计HLA完全是为了创造一个汇编语言编程环境,使其与传统的命令式高级语言环境尽可能相似,又不丧失编写真正汇编语言程序的能力。语言中那些与机器指令毫不相干的地方采用了人们熟悉的高级语言语法,而机器指令仍可一一对应到底层的80x86机器指令。
通过将HLA汇编器做得尽量和各种高级语言相似,学生学习汇编语言时就不必花费太多时间去适应大相径庭的语法,而可以运用其已有的高级语言知识,这使得学生学习汇编语言更快、更容易。
有了顺眼的声明语法和一些类似于高级语言的控制语句,还不足以使汇编语言的学习足够有效率。学习中常见的抱怨是汇编语言为程序员提供的支持太少,写程序时程序员只好不断地重新“发明车轮”。举个例子,当用MASM学习汇编语言编程时,我们很快发现汇编语言不提供有用的I/O机制,例如将整数值作为字符串显示到用户控制台,汇编语言程序员要自己负责编写这些代码。不幸的是,写个像样的I/O子程序(或称为“例程”)就需要有汇编语言编程的复杂知识,而要获得那些知识又得先写相当多的代码。因此,好的汇编语言教学工具还应提供一套I/O子程序,使新手能在自己有本事写出这种子程序前完成简单的I/O任务,比如读/写整数值。HLA以“HLA标准库”的形式提供了这种功能。该标准库是一个子程序和宏的集合,使得编写复杂应用程序变得非常容易。
由于HLA汇编器日益受到人们的欢迎,而且HLA是免费、开源且运行于Windows、Linux上的大众化软件,因此本书将使用HLA语法来表示无关于特定编译器的汇编语言例子。尽管HLA已经有超过20年的历史,且只支持32位Intel指令集,但它依然是学习汇编语言编程的利器。虽然最新Intel的CPU直接支持64位寄存器和操作,但学习32位汇编语言编程能让高级语言程序员对64位汇编语言触类旁通。