这是基于这个问题 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
与ADD和AND指令不同,LEA指令只有一种模式。(引用指定ADD和AND的两种模式。
从这个图中,LEA的第二部分,A应该是PCoffset 9.然而,A的值是4660(十进制),来自A .FILL X1234,超出了PCoffset 9的范围,即-256到255)。
谁能解释一下发生了什么?我使用错误的图表作为参考吗?还有其他LEA模式吗?
答案 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”距离太多,那么我们将得到一个错误,因为我们无法在偏移量中表示该值。