Assembly 轻松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

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

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


注意:运行此代码时会出现错误“地址错误: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

  • 您正在将值$4E加载到
    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