Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 将一个数组存储到另一个数组中_Arrays_Assembly_68000 - Fatal编程技术网

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
?如果有更好的解决方案,这将非常有帮助,因为我无法访问您正在使用的任何汇编程序/模拟器,我无法实际测试它,但这里有一些事情(其中一些已经在注释中说明):

  • dc.l
    声明一个long,您希望
    ds.l
    (或类似)为6个long分配存储
  • dbra
    进行分支,直到操作数等于
    -1
    ,因此您可能需要

    movw #loop_times, d0
    loop
       ....
       dbra d0, loop
    
    进入

(只要
loop\u times
为>0,这项功能就会起作用,否则您必须在进入循环之前检查条件)

  • 显示循环有几个问题:1。输入时,
    a2
    点超过
    N
    数组的末尾。2.即使解决了这个问题,索引它的方式也会带来问题。在第一个条目中,您试图从地址
    a2+6
    获取一个4字节长的,然后从
    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