【问题标题】:How does LEA instruction store address of A?LEA指令如何存储A的地址?
【发布时间】:2015-07-12 12:24:32
【问题描述】:

这是基于这个问题 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 模式吗?

【问题讨论】:

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


    【解决方案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离我有多少内存块?”如果我们的变量“A”距离太多块,那么我们将得到一个错误,因为我们无法在偏移量中表示该值。

    【讨论】:

    猜你喜欢
    • 2014-11-10
    • 2012-11-26
    • 2012-02-27
    • 2017-11-30
    • 2021-12-07
    相关资源
    最近更新 更多