0
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 

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

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

注意:运行此代码会给我错误“地址错误:400422 处的指令访问地址 400403”

4

1 回答 1

0

我相信ADDX没有限定符正在做ADDX.L(或ADDX.W)。试着改写ADDX.B

汇编器可能ADDX.B不会接受它,因为各种在线文本似乎不同意 ADDX.B 是否存在。(不过,机器代码中似乎有它的编码。)

地址 $400403 的出现是因为处理器将保存 $400405 的 2 个字节预递减A0以访问 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. UnadornedADDX用于执行 32 位算术运算。

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

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

  4. 上面的示例用于move #$00, CCRX使用扩展算术的循环开始之前通过ADDX.

于 2019-11-14T20:23:49.350 回答