所以我需要用汇编代码写这个。我应该在D3,J在D4,K在D5。当运行代码时,一切都工作,但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
2条答案
按热度按时间mxg2im7a1#
您遇到的问题是将数据作为指令执行。
您有以下备注:
表示您不希望执行超过该点。然而,处理器不会这样做。正如注解中所指出的,您希望将
SIMHALT
放在代码的末尾(在end
标签之后),数据之前。如果不这样做,处理器(模拟器)将继续递增程序计数器,并尝试将数据作为代码执行。这些线条
将字节
00 02 00 0E
(big-endian,显示为十六进制)插入程序中。将其反汇编得到以下程序集:这会在常数值14与D2的目前值之间执行比特大小的OR,并将该值储存到D2中。如果D2开始时的值为0,这会将14载入该寄存器。D2的初始值也可以设定
1110
中的任何比特(显示最低有效的4比特)。这并不是说D4的值被加载到D2,而是你用来加载D4的常量碰巧最终是
ORI.B
的立即数。如果常量不同,就会得到不同的生成指令,可能是跳转到了其他地方,什么也没做,或者只是执行了一条无效指令而出错,只要第一个字节保持
00
,指令将始终是ORI
。第二个字节确定大小和有效地址。将该值更改为03
将立即数与D3寄存器进行OR运算。在字节大小的运算中,不使用第三个字节。第四个字节是字节立即数。1qczuiv02#
当你有
end:
标签时,你需要“诱捕”CPU,否则它会继续运行,并按照指令执行你的数据。CPU无法区分这两者。下面是最简单的方法,但你不能在不重置的情况下恢复: