Assembly 轻松68K。如何在循环中正确使用索引?
所以我有这段代码,我想在nums1的末尾使用一个索引(A0)(偏移量$400405),在nums2的末尾使用一个索引(A1)(偏移量$400410),我想创建一个循环来添加索引(ADDX-(A0),-(A1)),并将添加结果以降序($400405、$400404、$400403等)存储到nums2的末尾 另外,我认为我的5个循环需要使用DBRA,但我有点卡住了,因为我缺乏在68k上编程的经验Assembly 轻松68K。如何在循环中正确使用索引?,assembly,easy68k,Assembly,Easy68k,所以我有这段代码,我想在nums1的末尾使用一个索引(A0)(偏移量$400405),在nums2的末尾使用一个索引(A1)(偏移量$400410),我想创建一个循环来添加索引(ADDX-(A0),-(A1)),并将添加结果以降序($400405、$400404、$400403等)存储到nums2的末尾 另外,我认为我的5个循环需要使用DBRA,但我有点卡住了,因为我缺乏在68k上编程的经验 注意:运行此代码时会出现错误“地址错误:400422处的指令访问地址400403”我认为没有限定符的AD
注意:运行此代码时会出现错误“地址错误:400422处的指令访问地址400403”我认为没有限定符的
ADDX
正在执行ADDX.L
(或ADDX.W
)。尝试编写ADDX.B
汇编程序可能不接受ADDX.B
,因为各种在线文本似乎不同意ADDX.B是否存在。(不过,机器代码中似乎有它的编码。)
地址$400403的出现是因为处理器将持有$400405的A0
预减2字节以访问16位字(可能是16位总线上获取长字所需的2字访问的一部分)。奇数地址不能与MC68k系列处理器中的16位数据或32位数据(如果不是全部的话,也可以是大多数)一起使用,因此例外
发件人:
ADDX指令用于链式运算中,用于相加
字节字符串(字或长字)。考虑增加
两个128位数字,每个数字存储为四个连续数字
长词
ORG $400400
COUNT DC.B 4
NUM1 DC.B $4E,$57,$29,$5A,$3B
NUM2 DC.B $31,$D4,$55,$E0,$9B
ORG $400410
SUBRTN MOVE.B $400401,D0
LEA $400405,A0
LEA $400410,A1
LOOP
ADDX -(A0),-(A1)
DBRA D0,LOOP
END $400410
让我们做一些观察:
ADDX
用于执行32位算术DBRA D0,LOOP
递减16位寄存器D0.w
-但您正在将一个字节加载到D0.b
,这意味着D0.w
的上8位在技术上是未定义的(尽管模拟器可能已将所有寄存器启动为初始零)。他们使用的moveq
指令初始化完整的32位寄存器d0.l
d0.b
(而不是4)中,因为地址中存在off by 1错误move#$00,CCR
在循环开始前通过ADDX
清除X
-位,该循环使用扩展算术您的计数器位于
400400
而不是400401
。另外,两个数组的结尾都错了。使用定义的标签可以避免这些错误。加载字节不会使顶部位归零。此外,没有后缀的ADDX
可能不是一个字节大小的操作。感谢@jester的回复谢谢你的回复Erik。我非常感激!:)
LEA Number1,A0 A0 points at first number
LEA Number2,A1 A1 points at second number
MOVEQ #3,D0 Four longwords to add
MOVE #$00,CCR Clear X-bit and Z-bit of the CCR
LOOP
ADDX -(A0),-(A1) Add pair of numbers
DBRA D0,LOOP Repeat until all added