为了翻译汇编语言程序,汇编器需要知道两件事情:每个助记符的操作码和每个标号的地址。操作码信息以表形式内置在汇编器中,该表给出对应每个助记符的操作码。这个表被称为操作码表。
对庆标号的地址必须由汇编器通过扫描源程序确定。汇编器第一遍扫描源程序只是为了确定每个标号的地址。只要在某行的开始发现标号,汇编器就将该标号及其地址输入到符号表中。在第一遍扫描结束时,符号表将包含程序中使用的所有标号及其地址。汇编器然后执行第二遍扫描,使用操作码表和符号表中的信息汇编每条指令。
ld x location_counter
st y 3(address)
halt
第一遍扫描此处----> x : dw 5
y: dw 0
z: dw x
图3-19
汇编器首先将内部变量location_counter初始化为0.在第一遍扫描时,汇编器从上向下一次一行地扫描程序。每次移到下一行,汇编器就将location_counter加1。因此location_counter中的值总是等于当前行的地址。如果在某行的开始发现标号,汇编器就将该标号和location_counter中的当前值输入到符号表。例如,当汇编器在图3-19中第一条dw所在的行发现 x 时,location_counter包含3(这是 x 的地址)。汇编器将 x 和3输入到符号表中,将lcoation_counter加1,然后继续扫描下一行。在第一遍扫描结束时,汇编器已经建立起如图3-20所示的符号表。
符号表
(由汇编器创建)
符号 | 地址(十六进制)
----------------
x | 3
y | 4 图3-20
z | 5
在第二遍扫描时,汇编器根据操作码表和符号表中的信息“汇编”每条指令。例如,在第二遍扫描过和中处理
ld x 指令时,汇编器在操作码表中查找助记符 ld ,在符号表中查找符号 x ,并检索它们的值(分别是0和3).然后汇编器使用适当的位数(操作码4位,地址12位),将这两个值汇编成机器指令0000 0000 0000 0010(十六制表示是:0003)。
如果汇编语言指令或伪指令中的地址是绝对地址,则汇编器必须将基转换成二进制。