显而易见,用汇编语言编程与用一般的高级语言编程相比可谓有天壤之别。幸运的是,本书中我们只需看懂有关汇编语言的内容,能分析编译器的输出就行了;不必能够从头编写汇编语言程序。如果理解汇编程序的写法,就能理解编译器发出某些代码序列的原因。到那个时候,我们再谈汇编语言程序员以及编译器是如何“思考”的。
汇编语言编程范型
的最基本方面,就是将需要完成的任务分解成机器能处理的许多小块。CPU在原则上于某个时刻只能执行一个微操作,这对复杂指令集计算机(complex instruction set computer,CISC)的CPU同样成立。因此,像高级语言语句中的复杂操作,只能被分解成机器能直接执行的多条小操作。作为示例,请看下列Visual Basic(VB)的赋值语句:
哪个CPU都无法用一条机器指令就执行完此VB语句,都要将其分解为机器指令序列,执行该赋值语句的各个组成部分。比如,许多CPU提供 subtract 指令,用于将某机器寄存器的值减去某个值。由于该赋值语句包含3个减法运算,必须将此赋值操作分解为至少3条减法指令。
80x86 CPU家族提供了相当灵活的减法指令sub。这一指令可允许执行如下形式的减法运算(以HLA语法给出):
假设前面VB代码的标识符都表示变量,我们就可以使用80x86的sub和mov指令实现上述操作,其HLA代码序列如下:
这段代码将单条VB语句分解成了5条不同的HLA语句,每句完成整个运算的一部分。汇编语言编程范型的诀窍在于要知道如何将复杂操作分解成一串机器指令的简单序列,就像本例所做的那样。我们在第13章还会探讨这一过程。
高级语言控制结构属于另一个将复杂操作分解为较简单语句序列的范畴。例如,我们来看如下Pascal语言的if语句:
CPU不支持机器指令if,但它可比较两个值,以此设置条件码标志位,再通过条件转移指令检验这些条件码的结果。常见办法是将高级语言的if语句转换成下列汇编代码:倘若检验出相反条件(i<>j),就跳过原始条件(i=j)为true时要执行的语句。例如,这里将前面Pascal的if语句转换为“纯粹”的HLA汇编语言,而非HLA类似高级语言的结构:
高级语言控制结构中的布尔表达式越复杂,对应的机器指令数目也就越多,但过程都是一样的。后面我们将会探讨编译器将高级语言控制结构转换到汇编语言的原理,请参看第13章和第14章。
向过程或函数传递参数、在过程或函数中访问这些参数,以及访问过程或函数中的其他数据,这些都是汇编语言比一般高级语言复杂得多的地方。本章不再赘述,我们在第15章会谈到这一重要课题。
总的原则是,当将某个算法从高级语言转换过来时,必须将问题分解成许多较小的块,以便能用汇编语言编码。正如前面所述,我们不必猜测要用什么机器指令,只要阅读汇编语言代码就行了—生成代码的编译器或汇编语言程序员已经替我们做了这些工作,这样多好!我们只需将高级语言代码与汇编代码对应起来。至于如何对应,则是本书后面很多部分要完成的课题。