【问题标题】:LC-3 STR with R1 as offsetLC-3 STR 与 R1 作为偏移量
【发布时间】:2017-05-18 19:26:22
【问题描述】:

我无法让我正在编写的这个子例程正常工作。基本上,我试图有一个子例程,我将在其中将R0 设置为某个array (R3) 中的一个值,偏移量为R1

R0_ORIGINAL .FILL 0
R1_ORIGINAL .FILL 0
R2_ORIGINAL .FILL 0
R3_ORIGINAL .FILL 0

LOAD
        ST R0, R0_ORIGINAL
        ST R1, R1_ORIGINAL
        ST R2, R2_ORIGINAL
        ST R3, R3_ORIGINAL

        AND R0, R0, #0
        ADD R0, R0, R2
        BRz SKIP
        AND R3, R3, #0
        LD R3, FIFTY
        ADD R1, R1, R3
SKIP    AND R3, R3, #0
        LEA R3, CIPHER_ARRAY
        STR R0, R3, R1
        LD R0, R0_ORIGINAL
        LD R1, R1_ORIGINAL
        LD R2, R2_ORIGINAL
        LD R3, R3_ORIGINAL
        RET

CIPHER_ARRAY .BLKW #100
FIFTY .FILL #50

这是我要开始工作的路线:

STR R0, R3, R1

它给了我错误:

应为 6 位有符号数,但找到的是 'R1'。

任何帮助将不胜感激!

【问题讨论】:

    标签: string lc3


    【解决方案1】:

    STR 用法如下:

    STR SR BaseR Offset6
    相当于memory[address stored in BaseR + Offset6] = SR

    SR 是源寄存器,BaseR 是要偏移的内存地址,Offset6 是 6 位数字。您的代码的问题是您传递了一个寄存器,而不是寄存器的内容,作为偏移量,导致错误。

    您可以通过在 BaseR 上进行算术并使用偏移量零来修复它: ADD R3, R3, R1 ; Add R1 to R3 to offset. STR R0, R3, 0 ; Store R3 in R0 (which you already offset) 如果需要保留值,可以使用临时寄存器进行算术运算。

    当你遇到这样的神秘错误时,阅读 LC3 指令集通常很有用,你可以找到 here.

    【讨论】:

      【解决方案2】:

      你对 STR 的使用似乎有点不对劲。应该这样使用:

      STR R0, R1, #4

      将寄存器R0 的内容存储在(R1+decimal 4) 指定的位置。所以得到R1的值(希望是地址),加上4产生最终地址。那是你将存储R0 内容的地方。

      因为你有:

      STR R0, R3, R1

      汇编器指出R1 是错误的。

      假设您试图将R3 偏移一些小值,则需要用#4 等数字表示该小值。

      通过查看您的代码,我猜您正在尝试将R0 存储在由 (R3 + R1) 表示的地址。一种方法很简单:

      ADD R3, R3, R1; 即:R3 = R3 + R1(现在R3 具有组合地址)。 STR R0, R3, #0; 在这里,我们将 R0 存储在地址 (R3 + #0) 中。基本上 STR 操作码的偏移功能什么都不做。

      尽管在这种情况下您不需要#0,但请记住,它不能表示超出此范围的偏移量:-32

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-19
        • 1970-01-01
        • 2018-04-03
        相关资源
        最近更新 更多