2

因此,我正在为以下内容创建汇编语言:

 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

我在看什么?

4

2 回答 2

3

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

于 2011-10-31T16:51:48.690 回答
3

MOVE如果您将所有, ADD, SUB,更改CMPMOVE.B, ADD.B, , SUB.B,它将执行没有任何错误(不确定它是否进行了正确的计算,但这取决于您,因为这是家庭作业)CMP.B。我假设.B因为您的变量已声明DC.B。即使您没有收到错误,您也应该指定大小。请注意,需要更改的主要是MOVE访问内存的 s,原因如下,但实际上都应该指定它们。

无论如何,错误发生在:MOVE (A1),D4。如果您跟踪并查看寄存器,您会看到之前的类似指令 ( MOVE (A0),D3) 正在读取 WORD 而不是 BYTE 到D3: D3=00000602T它从into读取前两个字节D3MOVE (A1),D4还想读一个 WORD,这次来自J.

但是,由于您告诉汇编器DC.B,它对齐了内存,以便您可以将数组作为 BYTE 访问,而不是 WORD。由于您的MOVE指令等默认为MOVE.W,您也可以更改DC.BDC.W,错误就会消失。但是不要这样做,只是向您展示错误发生的方式和原因,您应该指定我上面提到的尺寸。

另请注意,对于像这样的指令MULU,如果您只想将单个 BYTE 相乘,则应确保将寄存器的较高 BYTE 清零,因为它将每个操作数中的至少一个 WORD 相乘。由于您没有将任何超过 BYTE 的内容移动到D3更高的 BYTE 中,因此无论如何都是 0。

另一件事,END $400通常应该是这样的END START,即:

    ORG $1000
START:
...
END START

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

于 2011-10-31T21:58:41.863 回答