public int? myInt;
if (myInt > 0)
{
Do something
}
所以我有这段代码,我想在我的nums1(偏移$ 400405)的末尾使用索引(A0),并在我的nums 2(偏移$ 400410)的末尾使用索引(A1)创建一个循环以添加索引(ADDX-(A0),-(A1))并将加结果按降序存储到nums2的末尾($ 400405,$ 400404,$ 400403等)
我还认为我需要在5个循环中使用DBRA,但由于我缺乏在68k上编程的经验,因此有点卡住了
注意:运行此代码会给我错误“地址错误:400422的指令访问地址400403”
答案 0 :(得分:0)
我相信没有限定符的ADDX
在做ADDX.L
(或ADDX.W
)。尝试改写ADDX.B
。
ADDX.B
可能不会被汇编程序接受,因为各种联机文本似乎对于ADDX.B是否存在存在分歧。 (不过,机器代码中似乎有一种编码。)
地址$ 400403的出现是因为处理器将持有$ 400405的A0
递减2个字节以访问16位字(可能是16位总线上必需的2个字访问的一部分)以获取长字)。在MC68k系列处理器中(大多数(如果不是全部)),奇数地址不能与16位数据或32位数据一起使用,因此是例外。
来自http://www.tigernt.com/onlineDoc/68000.pdf:
ADDX指令在链算术中用于相加 字节字符串(字或长字)。考虑增加 两个128位数字,每个数字存储为四个连续的数字 长字。
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
让我们观察一下
未经修饰的ADDX
用于执行32位算术。
DBRA D0, LOOP
递减16位寄存器d0.w
—但是您正在将一个字节装入d0.b
,这意味着d0.w
的高8位在技术上是未定义的(尽管模拟器可能已将所有寄存器初始设置为零)。他们正在使用的moveq
指令初始化完整的32位寄存器d0.l
。
您正在将值$ 4E加载到d0.b
(而不是4)中,因为地址中存在off by 1错误。
上面的示例使用move #$00, CCR
来肯定地清除X
位,然后再通过ADDX
使用扩展算术的循环开始。