4.1.1 机器指令与汇编指令
机器指令的集合是机器语言,每个可执行的目标文件实际上是由一条条机器指令构成的机器代码段。它是用0和1表示的一串0/1序列,用来指示CPU 完成一个特定的操作,例如,传送指令“101110000111011000000000”将76H 存储在寄存器AX 中,加法指令“0000010 10001001000000000”将寄存器AX中的数值加上12H,减法指令“001011011000000000000000”将寄存器AX中的数值减去80H,如此等等。
例如,完成运算S=76 H+12 H-80 H 的机器指令代码段如下:
上述三行指令代码执行后,AX 寄存器中保存的结果就是要求的S值。看到这样的程序代码大家有什么样的感想呢? 如果程序里有一个“0”被误写为“1”,或者相反,又如何去查找错误呢? 上面仅是一个非常简单的小程序,就已经暴露出了机器语言的晦涩难懂和不易查错,如此小的程序尚且容易出错,何况几十行、上百行甚至上千行、上万行的程序呢? 所以,用机器语言书写和阅读程序代码段不是一件简单轻松的工作,需要记住所有抽象的二进制代码。
程序员很快就发现了使用机器语言带来的种种麻烦,它是如此难于记忆和辨别,以至于阻碍了整个产业的发展。为了便于记忆和书写指令,引入了一种与机器语言一一对应的符号化表示语言,称为汇编语言。即通常用容易记忆或简短的英文单词助记符和二进制代码建立对应关系,以方便程序员编写和阅读机器语言程序。
例如,把寄存器BX 中的内容送到AX 中的机器指令和汇编指令操作分别如下:
机器指令:1000100111011000
汇编指令:MOVAX,BX
可以看出,上述汇编指令的可读性好,因为人类明白汇编指令的含义比弄懂机器指令中的一串二进制数字要容易得多。无论用机器指令表示的机器语言程序,还是用汇编指令表示的汇编语言程序都统称为机器级程序,它是对应高级语言程序的机器级表示。任何一个高级语言程序一定存在一个与之对应的机器级程序,而且不是唯一的。因此,如何将高级语言程序生成对应的机器级程序并在时间和空间上达到最优,是编译优化要解决的问题。