首页 > 解决方案 > 汇编代码 MC68k 。不知何故,一个寄存器被填满了一个数字,即使我不想

问题描述

所以我需要用汇编代码写这个。我应该在 D3,D4 中的 J 和 D5 中的 K。运行代码时,一切正常,但 D2 中填充了 D4 中的信息。这是为什么?

    ORG    $0
    DC.L   $8000
    DC.L   START
    ORG    $1000
    
START:  
               
    MOVE.W I,D3
    MOVE.W J,D4
    CMP.W  D4,D3
    BLT  LT
    BRA  ELSE

LT:

    MOVE #1,D5
    BRA  end
    
ELSE:

    MOVE #0,D5

end:

   *nothing should happen here, just want program to stop

* these are my variables and constants
 
I   DC   2

J   DC   14

    SIMHALT
    END    START        ; last line of source

标签: assembly68000

解决方案


您遇到的问题是您将数据作为指令执行。

您有以下注意事项:

*这里什么都不应该发生,只是想让程序停止

表示您不希望执行继续超过该点。但是,处理器不会这样做。如评论中所述,您希望将其放置SIMHALT在代码的末尾(end标签之后),数据之前。没有这个,处理器(模拟器)将继续增加程序计数器并尝试将数据作为代码执行。

线条

I   DC   2
J   DC   14

将字节00 02 00 0E(大端,显示为十六进制)插入程序。拆卸它会得到以下组件:

ORI.B   #14,D2

这在常数值 14 和 D2 的当前值之间执行按位字节大小的 OR,并将该值存储到 D2 中。如果 D2 开始时的值为 0,这会将 14 加载到该寄存器中。D2 的初始值也可以1110设置任何位(显示最低有效 4 位)。

并不是 D4 的值被加载到 D2,而是您用来加载 D4 的常量恰好最终成为ORI.B.

如果你的常数不同,你会得到不同的生成指令。您可能跳到了其他地方,什么也没做,或者只是因为执行了无效指令而出错。只要第一个字节仍然存在00,该指令将始终是一个ORI. 第二个字节确定大小和有效地址。将该值更改为03将 OR 立即数与 D3 寄存器。在字节大小的操作中,不使用第三个字节。第四个字节是立即字节。


推荐阅读