我在编写这个子程序时遇到了麻烦,我正在写作。基本上,我试图建立一个子程序,我将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'代替。
任何帮助将不胜感激!
答案 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.