我一直收到并解决我的汇编语言的错误

时间:2011-10-31 16:25:23

标签: assembly 68000

所以我正在为以下内容创建汇编语言:

 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

我在俯瞰什么?

2 个答案:

答案 0 :(得分:3)

不知道Easy68K,但在我所知道的其他汇编程序中,不会有一个名为DC.B的指令分配字节?在这种情况下,你需要adda#1,a0来迭代这些?

答案 1 :(得分:3)

如果你改变了所有MOVEADDSUB,那么它会毫无错误地执行(不确定它是否做正确的计算,但这取决于你,因为它是作业) ,CMPMOVE.BADD.BSUB.BCMP.B。我假设.B,因为你的变量被声明为DC.B。即使您没有收到错误,也应指定大小。 注意需要更改的主要内容是访问内存的MOVE,原因如下,但它们都应该真正指定。

无论如何,错误发生在:MOVE (A1),D4。如果你追踪并查看寄存器,你会看到类似的指令(MOVE (A0),D3)正在读取WORD而不是BYTE到D3D3=00000602。它将T中的前两个字节读入D3MOVE (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

编辑:我想我应该指出(如果还不是很明显)你应该修正A0A1的增量,即。阅读JustinP的回答。