易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
让我们做一些观察:
Unadorned 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 #[=25=], CCR
在通过 ADDX
.[=30 使用扩展算法的循环开始之前明确清除 X
位=]
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
让我们做一些观察:
Unadorned
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 #[=25=], CCR
在通过ADDX
.[=30 使用扩展算法的循环开始之前明确清除X
位=]