易68k。如何在循环中正确使用索引?

Easy68k. How can i use the index correctly in a loop?

ORG 0400
COUNT   DC.B 4
NUM1    DC.B E,,,A,B  
NUM2    DC.B ,$D4,,$E0,B


       ORG 0410
SUBRTN MOVE.B 0401,D0
   LEA 0405,A0
   LEA 0410,A1
LOOP
   ADDX -(A0),-(A1)
   DBRA D0,LOOP
      END 0410 

所以我有这段代码,我想在我的 nums1(偏移量 $400405)的末尾使用索引 (A0),并在我的 nums 2(偏移量 $400410)的末尾使用索引 (A1),我想创建一个循环来添加索引 (ADDX -(A0),-(A1)) 并将添加结果按降序存储到我的 nums2 的末尾($400405、$400404、$400403 等)

此外,我认为我需要为我的 5 个循环使用 DBRA,但我有点卡住了,因为我缺乏在 68k 上编程的经验

注意:运行这段代码给我错误"Address Error: Instruction at 400422 accessing address 400403"

我相信没有限定词的 ADDX 就是 ADDX.L(或 ADDX.W)。尝试写成 ADDX.B

ADDX.B 可能不会被汇编程序接受,因为各种在线文本似乎不同意 ADDX.B 是否存在。 (虽然在机器代码中似乎有一个编码。)

地址 $400403 的出现是因为处理器正在将保存 $400405 的 A0 预递减 2 个字节以访问 16 位字(可能作为 16- 上必需的 2 个字访问的一部分)位总线来获取一个长字)。奇数地址不能与 16 位数据或 32 位数据一起使用(如果不是全部的话)MC68k 系列处理器,因此例外。

来自 http://www.tigernt.com/onlineDoc/68000.pdf :

The ADDX instruction is used in chain arithmetic to add together strings of bytes (words or longwords). Consider the addition of two 128-bit numbers, each of which is stored as four consecutive longwords.

    LEA Number1,A0 A0 points at first number
    LEA Number2,A1 A1 points at second number
    MOVEQ #3,D0 Four longwords to add
    MOVE #[=10=],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. Unadorned 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 #[=25=], CCR 在通过 ADDX.[=30 使用扩展算法的循环开始之前明确清除 X 位=]