我正在尝试将数组A
复制到数组N
中,然后打印数组(以测试它是否有效)但所有输出都是-1
这是我的代码:
ORG $1000
START: ; first instruction of program
clr.w d1
movea.w #A,a0
movea.w #N,a2
move.w #6,d2
for move.w (a0)+,(a2)+
DBRA d2,for
move.w #6,d2
loop
move.l (a2,D2),D1 ; get number from array at index D2
move.b #3,D0 ; display number in D1.L
trap #15
dbra d2,loop
SIMHALT ; halt simulator
A dc.w 2,2,3,4,5,6
N dc.l 6
END START ; last line of source
为什么-1
仅在输出中?如果有更好的解决方案,这将是非常有帮助的
答案 0 :(得分:1)
由于我无法访问您正在使用的任何汇编程序/模拟器,我实际上无法对其进行测试,但这里有一些内容(其中一些已经在评论中注明):
dc.l
声明一个long,你希望ds.l
(或者类似)为6个longs分配存储空间 dbra
分支,直到操作数等于-1
,所以你可能想要转
movw #loop_times, d0
loop
....
dbra d0, loop
进入
movw #loop_times-1, d0
loop
....
dbra d0, loop
(只要loop_times
> 0就可以使用,否则您必须在进入循环之前检查条件)
a2
数组的末尾超过N
数组。 2.即使修复它,你索引它的方式也会引起问题。在第一个条目中,您尝试从地址a2 + 6
获取4字节长,然后从a2 + 5
获取长... 你想要的是从地址a2 + 0
,a2 + 4
获取多头......一种方法:
move.w #6-1, d2 ; note the -1
movea.l #N, a2
loop
move.l (a2)+,D1 ; get next number from array
; use d1 here
dbra d2,loop
答案 1 :(得分:0)
正如已经指出的那样,你的新数组大小只有4个字节,你应该改变
dc.l 6到ds.w 6
并且你也可以处理7个元素,因为DBRA计数到-1。
其次,这就是为什么你到处都得到-1,你使用A2作为指向新数组的指针,但是你没有将它重置为指向新数组中的第一个单词。由于在复制期间每个元素增加了一个单词,因此在for循环完成后,A2指向数组后的第一个单词。
您的模拟器在显示器循环中输出多个数字表示您的模拟器未模拟MC68000,真实 MC68000将在“MOVE.L(A2,D2),D1处捕获陷阱“一旦A2 + D2之和为奇数,68000就不允许W / L大小访问奇数地址(MC68020及更高版本)。
清理过的MC68000兼容代码可能如下所示:
lea A,a0
lea N,a2
moveq #5,d2
for move.w (a0)+,(a2)+
dbra d2,for
lea N,a2
moveq #5,d2
loop
move.w (a2)+,D1 ; get number (16 bits only)
ext.l d1 ; make the number 32 bits
moveq #3,D0 ; display number in D1.L
trap #15
dbra d2,loop
它可能包含您尚未遇到的一些说明。