构建 LC-3 符号 table
Constructing an LC-3 symbol table
我有一个关于符号 tables 的问题。现在根据我的教科书,符号 table 的规则如下:
- 找到.ORIG语句,
它告诉我们第一条指令的地址并初始化位置计数器(LC),它跟踪
当前指令。
- 对于程序中的每个非空行:
a) 如果行包含标签,将标签和 LC 添加到符号 table。
b) 增加 LC。
– 注意:如果语句是 .BLKW 或 .STRINGZ,
将 LC 增加分配的字数。
- 到达 .END 语句时停止。
我对第二条规则有疑问。具体来说,关于 .BLKW 或 .STRINGZ 的声明(根据分配的字数增加 LC)。我在教科书中找不到任何可以帮助我理解这一点的例子,但我确实在网上找到了一些代码。
在我的示例代码中,包含.BLKW 和.STRINGZ 的语句的地址是什么?
01 .ORIG x 3000
02
03 INIT
04 LEA R0, START.STR
05 JSR PRINST.STR
06 LD R0, TEN
07 LEA R1, DATA.B
08
09 STORE_LOOP
10 STR RO, R1, %0
11 ADD R1, R1, %1
12 ADD R0, R0, %-1
13 BRp ST.LOOP
14
15 LD R0, TEN
16 ADD R1, R1, %-1
17 AND R2, R2, %0
18
19 ADD_LOOP
20 LDR R3, R1, %0
21 ADD R2, R3, R2
22 ADD R1, R1, %-1
23 ADD R0, R0, %-1
24 BRp ADD_LOOP
25
26 STORE_SUM
27 ST R2, RESULT
28 TRAP %25
29
30 PRINT_STR
31 ST R7, SAVE.R7
32 PUTS
33 LD R7, SAVE.R7
34 RET
35
36 TEN .FILL #10
37 SAVE.R7 .BLKW #1
38 DATA.B .BLKW #10
39 START_STR .STRINGZ "Starting..."
40 RESULT .FILL #0
41 END
代码注释显示每个地址。
01 .ORIG x 3000
02
03 INIT ; x3000
04 LEA R0, START.STR ; x3000
05 JSR PRINST.STR ; x3001
06 LD R0, TEN ; x3002
07 LEA R1, DATA.B ; x3003
08
09 STORE_LOOP ; x3004
10 STR RO, R1, %0 ; x3004
11 ADD R1, R1, %1 ; x3005
12 ADD R0, R0, %-1 ; x3006
13 BRp ST.LOOP ; x3007
14
15 LD R0, TEN ; x3008
16 ADD R1, R1, %-1 ; x3009
17 AND R2, R2, %0 ; x300A
18
19 ADD_LOOP ; x300B
20 LDR R3, R1, %0 ; x300B
21 ADD R2, R3, R2 ; x300C
22 ADD R1, R1, %-1 ; x300D
23 ADD R0, R0, %-1 ; x300E
24 BRp ADD_LOOP ; x300F
25
26 STORE_SUM ; x3010
27 ST R2, RESULT ; x3010
28 TRAP %25 ; x3011
29
30 PRINT_STR ; x3012
31 ST R7, SAVE.R7 ; x3012
32 PUTS ; x3013
33 LD R7, SAVE.R7 ; x3014
34 RET ; x3015
35
36 TEN .FILL #10 ; x3016
37 SAVE.R7 .BLKW #1 ; x3017
38 DATA.B .BLKW #10 ; x3018
39 START_STR .STRINGZ "Starting..."; x3022
40 RESULT .FILL #0 ; x302E
41 END
注意事项。
- 无论何时遇到 BLKW,您都会添加它保留的地址。
- 每当遇到 .stringz 时,您都会添加字符串中的任意多个字符加上 1 作为 NUL 终止符。
另外(至少对于我使用的工具)一些汇编器/模拟器会在汇编时生成一个符号 table 文件,一些模拟器会明显地显示什么标签在什么地址。
我有一个关于符号 tables 的问题。现在根据我的教科书,符号 table 的规则如下:
- 找到.ORIG语句, 它告诉我们第一条指令的地址并初始化位置计数器(LC),它跟踪 当前指令。
- 对于程序中的每个非空行: a) 如果行包含标签,将标签和 LC 添加到符号 table。 b) 增加 LC。 – 注意:如果语句是 .BLKW 或 .STRINGZ, 将 LC 增加分配的字数。
- 到达 .END 语句时停止。
我对第二条规则有疑问。具体来说,关于 .BLKW 或 .STRINGZ 的声明(根据分配的字数增加 LC)。我在教科书中找不到任何可以帮助我理解这一点的例子,但我确实在网上找到了一些代码。
在我的示例代码中,包含.BLKW 和.STRINGZ 的语句的地址是什么?
01 .ORIG x 3000
02
03 INIT
04 LEA R0, START.STR
05 JSR PRINST.STR
06 LD R0, TEN
07 LEA R1, DATA.B
08
09 STORE_LOOP
10 STR RO, R1, %0
11 ADD R1, R1, %1
12 ADD R0, R0, %-1
13 BRp ST.LOOP
14
15 LD R0, TEN
16 ADD R1, R1, %-1
17 AND R2, R2, %0
18
19 ADD_LOOP
20 LDR R3, R1, %0
21 ADD R2, R3, R2
22 ADD R1, R1, %-1
23 ADD R0, R0, %-1
24 BRp ADD_LOOP
25
26 STORE_SUM
27 ST R2, RESULT
28 TRAP %25
29
30 PRINT_STR
31 ST R7, SAVE.R7
32 PUTS
33 LD R7, SAVE.R7
34 RET
35
36 TEN .FILL #10
37 SAVE.R7 .BLKW #1
38 DATA.B .BLKW #10
39 START_STR .STRINGZ "Starting..."
40 RESULT .FILL #0
41 END
代码注释显示每个地址。
01 .ORIG x 3000
02
03 INIT ; x3000
04 LEA R0, START.STR ; x3000
05 JSR PRINST.STR ; x3001
06 LD R0, TEN ; x3002
07 LEA R1, DATA.B ; x3003
08
09 STORE_LOOP ; x3004
10 STR RO, R1, %0 ; x3004
11 ADD R1, R1, %1 ; x3005
12 ADD R0, R0, %-1 ; x3006
13 BRp ST.LOOP ; x3007
14
15 LD R0, TEN ; x3008
16 ADD R1, R1, %-1 ; x3009
17 AND R2, R2, %0 ; x300A
18
19 ADD_LOOP ; x300B
20 LDR R3, R1, %0 ; x300B
21 ADD R2, R3, R2 ; x300C
22 ADD R1, R1, %-1 ; x300D
23 ADD R0, R0, %-1 ; x300E
24 BRp ADD_LOOP ; x300F
25
26 STORE_SUM ; x3010
27 ST R2, RESULT ; x3010
28 TRAP %25 ; x3011
29
30 PRINT_STR ; x3012
31 ST R7, SAVE.R7 ; x3012
32 PUTS ; x3013
33 LD R7, SAVE.R7 ; x3014
34 RET ; x3015
35
36 TEN .FILL #10 ; x3016
37 SAVE.R7 .BLKW #1 ; x3017
38 DATA.B .BLKW #10 ; x3018
39 START_STR .STRINGZ "Starting..."; x3022
40 RESULT .FILL #0 ; x302E
41 END
注意事项。
- 无论何时遇到 BLKW,您都会添加它保留的地址。
- 每当遇到 .stringz 时,您都会添加字符串中的任意多个字符加上 1 作为 NUL 终止符。
另外(至少对于我使用的工具)一些汇编器/模拟器会在汇编时生成一个符号 table 文件,一些模拟器会明显地显示什么标签在什么地址。