我正在编写汇编程序代码。对于PASS#1,我遵循所有指示,但坚持以下几点 操作码=' BYTE'
时的规则if OPCODE=‘BYTE’ then
begin
find length of constant in bytes
add length to LOCCTR
end {if BYTE}
它说如果OPCODE =' BYTE'然后找到常量的长度并添加到位置计数器(LOCCTR)。我没有采取这一步骤。有人可以向我澄清一下。
我也有这个示例输入程序及其输出。
输入程序
PROG START 0
FIRST STL RETADDR
SECOND LDA =CꞌABCDꞌ
THIRD LDA =XꞌFFꞌ
J @RETADR
DEF BYTE CꞌDEFꞌ
SYM1 EQU 512
上述程序的输出
LINE# LOCCTR LABEL OPERATION OPERAND
01 00000 PROG START 0
02 00000 FIRST STL RETADDR
03 00003 SECOND LDA =C’ABCD’
04 00006 THIRD LDA =X’FF’
05 00009 J @RETADR
06 0000C DEF BYTE C’DEF’
07 00200 SYM1 EQU 512
08 0000F SYM2 EQU *
09 00003 SYM3 EQU SECOND-FIRST
10 0000F RETADDR RESW 1
11 00012 END FIRST
12 00012 * =C’ABCD’
13 00016 * =X’FF’
程序长度=(12 - 0)+ 5 = 17
当我们到达第6行时,您可以看到,其中包含LOCCTR电影到00200的下一行中的字节。我不确定它是怎么发生的。请解释一下。感谢
答案 0 :(得分:1)
EQU
指令是一个编译时指令,不会将任何内容放入内存中。它只是将左侧的符号设置为右侧的值。如果该值为星号(*),则该值为LOCCTR
的当前值。这些指令不是将当前位置放在LOCCTR
列中,而是显示分配给它们的值(以十六进制表示)。因此00200
只是512
的十六进制。同样,0000F
的{{1}}是分配给SYM2
的当前位置。 SYM2
旁边的00003
是SYM3
的值,它们是第一条和第二条指令的地址。
SECOND-FIRST
指令是一个编译时指令,它将数据从当前位置开始加载到内存中。该规则只是将数据的长度添加到BYTE
,以确定程序的下一部分将去往何处。
请注意,第6行LOCCTR
指令从位置BYTE
开始,包含字符串0000C
。这是3个字符。 'DEF'
为0000C + 3
,这是0000F
指令之后的下一个LOCCTR
值(不会将任何内容放入内存中)。