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.lds.l単一の long を宣言し、 6 つの long にストレージを割り当て たい(または同様の)
  • dbraオペランドが と等しくなるまで分岐する-1ため、おそらく

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

    の中へ

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

(これは > 0 である限り機能しloop_timesます。それ以外の場合は、ループに入る前に条件を確認する必要があります)

  • 表示ループにはいくつかの問題があります。 1.配列a2の末尾を過ぎたエントリ ポイント。N2. それを修正しても、索引付けの方法が問題を引き起こします。最初のエントリで、アドレスから 4 バイトの長さをフェッチしようとしていてa2 + 6、次に長さからa2 + 5...

あなたが望むのは、アドレスからロングをフェッチすることですa2 + 0....a2 + 4それを行う1つの方法:

    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

また、DBRA は -1 までカウントダウンするため、7 つの要素で作業します。

第二に、それがどこでも -1 を取得する理由です。A2 を新しい配列へのポインターとして使用しますが、新しい配列の最初の単語を指すようにリセットしません。コピー中に要素ごとに 1 ワードずつ増やしたため、for ループが完了した後、A2は配列のの最初のワードを指します。

シミュレーターがディスプレイ ループで複数の数値を出力することは、シミュレーターが MC68000 をエミュレートしていないことを示しています。奇数 - 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 に答える