LEA指令如何存储A的地址?

时间:2015-05-02 21:33:06

标签: assembly load cpu-registers computer-architecture lc3

这是基于这个问题 LEA instruction

以下是我对

有疑问的代码段
.ORIG X3700
 LEA R0, A
 .....
  A .FILL X1234
应答响应者@Paul R说:“代码的来源是x3700,你有12个指令,所以A的地址是x3700 + x0C = x370C。正如你猜测的那样,LEA R0,A加载A的地址为R0,因此在执行第一条指令后,R0将包含x370C。“

我同意保罗所说的第一部分,他的理由是为什么A的地址是x370C。那讲得通。

我对下一部分感到困惑,“LEA R0,A将A的地址加载到R0”。这是我参考LEA指令的幻灯片。 Lc3 LEA,5-23 enter image description here

与ADD和AND指令不同,LEA指令只有一种模式。(引用指定ADD和AND的两种模式。

从这个图中,LEA的第二部分,A应该是PCoffset 9.然而,A的值是4660(十进制),来自A .FILL X1234,超出了PCoffset 9的范围,即-256到255)。
谁能解释一下发生了什么?我使用错误的图表作为参考吗?还有其他LEA模式吗?

1 个答案:

答案 0 :(得分:1)

任何时候您将PCoffset视为操作码操作数

LEA R2, A    ; Loads the memory location of A into R2
             ; LEA, DR, PCoffset9

它告诉您,当您的代码被组装时,它实际上并没有将标签“A”放入LEA命令中。

请使用以下代码:

.ORIG X3700     ; Not a code line in the simulator, only used by the assembler
LEA R0, A       ; Line 1, starting at x3700
HALT            ; Line 2
A .FILL X1234   ; Line 3, located at x3702
.END            ; Not a code line in the simulator, only used by the assembler

现在在模拟器中,LEA线实际上看起来像这样:

1110 000 000000001    ; Opcode 1110 is LEA
                      ; 000 is our register R0
                      ; 000000001 gives us how many memory locations away A is

这就是偏移意味着什么。它问了一个问题“有多少块记忆是远离我的?”如果我们的变量“A”距离太多,那么我们将得到一个错误,因为我们无法在偏移量中表示该值。