assembly - 汇编代码 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
解决方案
您遇到的问题是您将数据作为指令执行。
您有以下注意事项:
*这里什么都不应该发生,只是想让程序停止
表示您不希望执行继续超过该点。但是,处理器不会这样做。如评论中所述,您希望将其放置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 寄存器。在字节大小的操作中,不使用第三个字节。第四个字节是立即字节。
推荐阅读
- node.js - 每当使用 Firebase 函数创建另一个集合中的另一个文档时,如何从集合中更新文档?
- reactjs - 如何使用 CDN 链接(如普通 JavaScript/Vue.js)从另一个 .js 文件中使用 React.js?
- angular - 自动刷新页面调用web服务
- php - 在 Octobercms 的页面中运行外部 PHP 脚本
- stackexchange-api - 用于正文中文本的 Stack Overflow 搜索 API
- python-3.x - 否则在 python 中不断给我无效的语法
- python - 如何导出点云以在 matlab 中查看
- python - 为什么我的表面在网格后面?希望能覆盖格子
- python - python中的嵌套三角形与乌龟
- vue.js - Nuxt 没有在刷新/ssr 上添加 bodyAttr