Arrays 将一个数组存储到另一个数组中
我试图将数组Arrays 将一个数组存储到另一个数组中,arrays,assembly,68000,Arrays,Assembly,68000,我试图将数组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 l
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
?如果有更好的解决方案,这将非常有帮助,因为我无法访问您正在使用的任何汇编程序/模拟器,我无法实际测试它,但这里有一些事情(其中一些已经在注释中说明):
声明一个long,您希望dc.l
(或类似)为6个long分配存储ds.l
进行分支,直到操作数等于dbra
,因此您可能需要-1
进入movw #loop_times, d0 loop .... dbra d0, loop
loop\u times
为>0,这项功能就会起作用,否则您必须在进入循环之前检查条件)
- 显示循环有几个问题:1。输入时,
点超过a2
数组的末尾。2.即使解决了这个问题,索引它的方式也会带来问题。在第一个条目中,您试图从地址N
获取一个4字节长的,然后从a2+6
获取一个长的a2+5
a2+0
,a2+4
获取long。。。。一种方法是:
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
如前所述,新数组的大小只有4个字节,您应该进行更改 直流L6至直流W6 由于DBRA的计数为-1,所以您还需要处理7个元素 第二,这就是为什么到处都是-1,使用A2作为指向新数组的指针,但不将其重置为指向新数组中的第一个单词。由于在复制过程中每个元素增加了一个单词,所以在for循环完成后,A2指向数组后面的第一个单词 您的模拟器在显示循环中输出多个数字表明,您的模拟器没有模拟MC68000,一旦A2+D2之和为奇数,真正的MC68000将在“MOVE.L(A2,D2),D1”处陷入陷阱-68000不允许W/L大小的访问奇数地址(MC68020和更高do) 清理后的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
它可能包含一些您尚未遇到的说明。一些事情乍一看似乎可疑:
N dc.l 6
-我非常确定这将只为单个长单词分配存储空间(值为6),而不是为6个长单词分配存储空间(我认为您需要)<代码>移动1(a2,D2),D1;从索引D0处的数组中获取编号@user786653您是对的,它应该是(a2,D2),D1;从索引D2处的数组中获取编号
。我不知道dbra是如何被错误使用的,我想递减d2直到它达到0,否则循环。我将如何为6个long分配存储空间?感谢链接页面显示了正确和不正确的dbra
用法示例,请查找符合您需要的。如何分配存储取决于您使用的汇编程序,但它通常类似于ds.l
。从我所看到的情况来看,我的问题可以通过转到endl
来解决,这将启动循环,或者将我的循环数减少1,因为它将循环6+1次而不是6次。我尝试了减量,但仍然不起作用,我不想使用endl
。我忘了分配存储就是使用ds.l
谢谢。看起来你的数据大小到处都是。您将地址加载为16位(好的,您将代码组织在内存中,但是…),然后复制单词,但是您尝试通过索引字节来打印它们,但加载为长单词…谢谢,但是LEA做什么?LEA(加载有效地址)有点类似于移动,它计算第一个参数并将结果加载到目标寄存器中。LEA是专门针对地址的(因此它总是生成完整的32位结果),更高的MC680x0可以在地址生成单元而不是ALU(速度更快)中执行此操作。从源代码的角度来看,lea明确表示对地址进行了计算,并且它的语法使其不太容易出错(一个好的汇编程序应该自动选择最佳的寻址模式,而无需指定它)。
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