将数组存储到另一个数组中

时间:2013-03-11 16:51:55

标签: 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
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仅在输出中?如果有更好的解决方案,这将是非常有帮助的

2 个答案:

答案 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就可以使用,否则您必须在进入循环之前检查条件)

  • 您的显示循环有一些问题:1。在a2数组的末尾超过N数组。 2.即使修复它,你索引它的方式也会引起问题。在第一个条目中,您尝试从地址a2 + 6获取4字节长,然后从a2 + 5获取长...

你想要的是从地址a2 + 0a2 + 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

它可能包含您尚未遇到的一些说明。