注意,汇编器如何知道LXI指令必须将寄存器DE的值设置为地址0109h(Text的地址)。如果LXI指令本身被存放在地址0100h处(CP/M将程序加载至内存开始运行时的起始地址),而0109h则是Text字符串的起始地址。一般来说,程序员在使用汇编器时有很多方便之处,其中一点就是不需要关心汇编程序各部分在内存中的存放地址。
第一个编写汇编器的人需要手工对程序汇编。如果要为机器写一个新的汇编器(或者对其修改),则可以使用汇编语言编写该程序,然后使用原有的汇编器对其汇编。一旦新的汇编器通过了汇编,则它也就可以对自身进行汇编。
每当一种新的微处理器面世,就需要为其编写新的汇编器。然而,新的汇编器可以在已有的计算机上编写,并利用其汇编器进行汇编。这种方式称为交叉汇编(cross-assembler),即利用计算机A的汇编器对运行在计算机B上的程序汇编。
虽然汇编器的引入消除了汇编语言编程中重复性的劳动部分(即手动汇编部分),但汇编语言仍然存在两个主要问题。第一个问题(也许你已经意识到了),使用汇编语言编程非常乏味,因为这是在微处理器芯片级的编程,因此不得不考虑每一个微小的细节。
汇编语言存在的第二个问题是不可“移植”(portable)。如果你为Intel 8080写了一个汇编语言程序,则该程序不能在Motorola6800上运行,你必须在6800上重写一个相同功能的汇编语言程序。编写类似程序的过程也许没有编写第一个程序那么困难,因为你应经解决了程序的组织和算法问题,但仍然还有很多工作要做。
上一章介绍了现代微处理器集成浮点运算机器码指令的原理。不可否认,这已经为我们带来了很大的便利,但仍不能令人特别满意。一种更好的方式是:完全放弃那些实现每个基本操作的机器码指令,这些指令与处理器相关,因而导致程序缺乏移植性。我们采用的替代策略是使用一些经典的数学表达式来描述复杂的数学运算。下面是一个表达式的例子:
$$
A \times S i n ( 2 \times \mathrm { P I } + B ) / C
$$
上式中的A,B,C代表数字,而PI=3.14159。
这看起来不错,为什么不动手尝试一下呢?假设在某个文本文件中有这样一个表达式,那么我们可以尝试编写一个汇编语言程序来读取该文本文件,并将其中的数学表达
编码—隐匿在计算机软硬件背后的语言
384