LC-3 STR,R1为偏移量

时间:2017-05-18 19:26:22

标签: string lc3

我在编写这个子程序时遇到了麻烦,我正在写作。基本上,我试图建立一个子程序,我将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'代替。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

您对STR的使用有点偏差。它应该像这样使用:

STR R0,R1,#4

将寄存器R0的CONTENTS存储在(R1 +十进制4)指定的LOCATION。所以得到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< = distance< = 31.这是因为STR仅为偏移量保留6位(有符号)地址。因此,如果您确实使用它,请确保它不在该范围之外。有关操作码参考信息,请参阅lc3tutor.org,以及测试代码的工具。

答案 1 :(得分: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.