2

我正在尝试将数组复制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在输出中?如果对此有更好的解决方案,那将非常有帮助

4

2 回答 2

1

由于我无法访问您正在使用的任何汇编器/模拟器,因此我无法对其进行实际测试,但这里有一些事情(其中一些已经在评论中注明):

  • dc.l声明一个 long,您希望ds.l(或类似的)为 6 个 long 分配存储空间
  • dbra分支直到操作数等于-1,所以你可能想要转

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

    进入

    movw #loop_times-1, d0
    loop
       ....
       dbra d0, loop
    

(只要loop_times大于 0 就可以工作,否则你必须在进入循环之前检查条件)

  • 您的显示循环有几个问题: 1. 在数组a2末尾之后的入口点上。N2. 即使修复它,索引它的方式也会导致问题。在第一个条目中,您尝试从 address 获取 4 字节长a2 + 6,然后从a2 + 5...

您想要的是从 address 中获取 longs 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
于 2013-03-11T17:45:26.337 回答
0

正如已经指出的那样,您的新数组大小只有 4 个字节,您应该更改

dc.l 6 到 ds.w 6

并且您还处理 7 个元素,因为 DBRA 倒计时到 -1。

其次,这就是为什么你到处都得到 -1 的原因,你使用 A2 作为指向新数组的指针,但你没有将它重置为指向新数组中的第一个单词。由于在复制过程中每个元素增加了一个单词,因此在 for 循环完成后,A2 指向数组后面的第一个单词。

您的模拟器在显示循环中输出多个数字表明您的模拟器没有模拟 MC68000,只要 A2+D2 的总和,真正的MC68000 就会在“MOVE.L (A2,D2),D1”处陷入陷阱是奇数 - 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

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

于 2013-03-14T12:03:18.183 回答