所以我正在为以下内容创建汇编语言:
X = 5
Y = 7
FOR I = 1 TO 9
Y = Y + I
IF T(I) = J(I) + X THEN J(I) = T(I) * 4 - Y
ELSE J(I) = J(I) - T(I)
END_FOR
并继续收到
"Address Error: Instruction at 418 accessing address 44f
Execution halted"
我到目前为止的代码是:
ORG $400
MOVEA #T,A0
MOVEA #J,A1
MOVE.B #1,D0 //D0 is a counter to hold I
MOVE #5,D1 //X = 5
MOVE #7,D2 //Y = 7
NEXT
ADD D0,D2 //Y = Y + I
MOVE (A0),D3
MOVE (A1),D4
MOVE D4,D5 //D5 is a temp copy of J(I)
MOVE D5,D1
CMP D5,D3 //IF T(I) = J(I) + X
BNE ELSE
SUB D2,D3
MULU #4,D3
MOVE D3,(A1)
BRA END_LOOP
ELSE
SUB D3,D4 //J(I) = J(I) - T(i)
MOVE D4,(A1)
END_LOOP
ADDA #2,A0 //POINT TO NEXT ELEMENT IN T
ADDA #2,A1 //POINT TO NEXT ELEMENT IN J
ADD #1,D0
CMP #9,D0
BNE NEXT
MOVE.B #4,D0
TRAP #15 //; halt simulator
* Variables and Strings
T DC.B 6,2,5,4,9,7,3,1,0
J DC.B 5,7,1,9,2,5,6,6,1
END $400 //; last line of source
我在俯瞰什么?
答案 0 :(得分:3)
不知道Easy68K,但在我所知道的其他汇编程序中,不会有一个名为DC.B的指令分配字节?在这种情况下,你需要adda#1,a0来迭代这些?
答案 1 :(得分:3)
如果你改变了所有MOVE
,ADD
,SUB
,那么它会毫无错误地执行(不确定它是否做正确的计算,但这取决于你,因为它是作业) ,CMP
至MOVE.B
,ADD.B
,SUB.B
,CMP.B
。我假设.B
,因为你的变量被声明为DC.B
。即使您没有收到错误,也应指定大小。 注意需要更改的主要内容是访问内存的MOVE
,原因如下,但它们都应该真正指定。
无论如何,错误发生在:MOVE (A1),D4
。如果你追踪并查看寄存器,你会看到类似的指令(MOVE (A0),D3
)正在读取WORD而不是BYTE到D3
:D3=00000602
。它将T
中的前两个字节读入D3
。 MOVE (A1),D4
也希望阅读一个WORD,这次来自J
。
但是,由于您告诉汇编程序DC.B
,它会对齐内存,以便您可以将数组作为BYTE而不是WORD访问。由于您的MOVE
指示信息默认为MOVE.W
,因此您也可以将DC.B
更改为DC.W
,错误就会消失。不要这样做,只是告诉你错误发生的方式和原因,你应该指定我上面提到的尺寸。
另请注意,使用MULU
之类的指令时,如果您只想将单个BYTE相乘,则应确保寄存器的较高BYTE为零,因为它至少会相乘一个WORD来自每个操作数。由于你没有将任何超过BYTE的内容移动到D3
,所以无论如何,更高的BYTE都是0。
另一件事,END $400
通常应该是END START
,即:
ORG $1000
START:
...
END START
编辑:我想我应该指出(如果还不是很明显)你应该修正A0
和A1
的增量,即。阅读JustinP的回答。