[英]Assembler code MC68k . somehow a register is getting filled with a number even though I dont want to
所以我需要用汇编代码写这个。 我应该在 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
您遇到的问题是您将数据作为指令执行。
您有以下注释:
*这里什么都不应该发生,只是想让程序停止
表示您不希望执行继续超过该点。 但是,处理器不会这样做。 如评论中所述,您希望将SIMHALT
放在代码的末尾(在end
标签之后),在数据之前。 没有这个,处理器(模拟器)将继续增加程序计数器并尝试将数据作为代码执行。
线条
I DC 2
J DC 14
将字节00 02 00 0E
(big-endian,显示为十六进制)插入到程序中。 拆卸它会得到以下组件:
ORI.B #14,D2
这在常数值 14 和 D2 的当前值之间执行逐位字节大小的 OR,并将该值存储到 D2 中。 如果 D2 开始时的值为 0,这会将 14 加载到该寄存器中。 D2 的初始值也可以设置任何位1110
(显示最低有效 4 位)。
并不是 D4 的值被加载到 D2,而是您用来加载 D4 的常量恰好最终成为ORI.B
的立即值。
如果你的常数不同,你会得到不同的生成指令。 您可能跳到了其他地方,什么也没做,或者只是因为执行了无效指令而出错。 只要第一个字节保持为00
,指令就始终是ORI
。 第二个字节确定大小和有效地址。 将该值更改为03
将立即与 D3 寄存器进行或。 在字节大小的操作中,不使用第三个字节。 第四个字节是立即字节。
你有end:
label 你需要“陷阱”CPU,否则它将继续并作为指令执行你的数据。 CPU 无法区分。 这是最简单的方法,但如果不重置,您将无法从中恢复:
end:
jmp end
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.