Easy68k。如何在循环中正确使用索引?

时间:2019-11-14 19:22:15

标签: assembly easy68k

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”

1 个答案:

答案 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
  

让我们观察一下

  1. 未经修饰的ADDX用于执行32位算术。

  2. DBRA D0, LOOP递减16位寄存器d0.w —但是您正在将一个字节装入d0.b,这意味着d0.w的高8位在技术上是未定义的(尽管模拟器可能已将所有寄存器初始设置为零)。他们正在使用的moveq指令初始化完整的32位寄存器d0.l

  3. 您正在将值$ 4E加载到d0.b(而不是4)中,因为地址中存在off by 1错误。

  4. 上面的示例使用move #$00, CCR来肯定地清除X位,然后再通过ADDX使用扩展算术的循环开始。