构建 LC-3 符号 table

Constructing an LC-3 symbol table

我有一个关于符号 tables 的问题。现在根据我的教科书,符号 table 的规则如下:

  1. 找到.ORIG语句, 它告诉我们第一条指令的地址并初始化位置计数器(LC),它跟踪 当前指令。
  2. 对于程序中的每个非空行: a) 如果行包含标签,将标签和 LC 添加到符号 table。 b) 增加 LC。 – 注意:如果语句是 .BLKW 或 .STRINGZ, 将 LC 增加分配的字数。
  3. 到达 .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

注意事项。

  1. 无论何时遇到 BLKW,您都会添加它保留的地址。
  2. 每当遇到 .stringz 时,您都会添加字符串中的任意多个字符加上 1 作为 NUL 终止符。

另外(至少对于我使用的工具)一些汇编器/模拟器会在汇编时生成一个符号 table 文件,一些模拟器会明显地显示什么标签在什么地址。