2013-03-11 274 views
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?如果對於這一點,將是非常有益

+0

幾件事看起來很可疑:'N dc.l 6' - 我很確定這隻會分配一個長單詞的存儲空間(值爲6),而不是分配長達6分鐘的存儲空間我想你想要)。 'move.l(a2,D2),D1;從索引D0處的數組中獲取數字< - 代碼或註釋都是錯誤的。它看起來像你沒有正確使用'dbra'(見例如[這裏](http://moss.csc.ncsu.edu/~mueller/codeopt/codeopt00/notes/constructs)) – user786653 2013-03-11 17:01:31

+0

@ user786653你是它應該是'(a2,D2),D1;從索引D2處的數組中獲取數字。我不知道如何正確使用dbra,我想遞減d2直到達到0,否則循環。我將如何分配6次存儲空間?謝謝 – emanyalpsid 2013-03-11 17:10:43

+0

鏈接的頁面顯示正確和不正確的'dbra'用法的例子,找到一個匹配您的需求的例子。你如何分配存儲取決於你使用的彙編程序,但通常是'ds.l'。 – user786653 2013-03-11 17:23:42

回答

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 

它可能包含你還沒有遇到了一些說明。

+0

謝謝,但LEA做什麼? – emanyalpsid 2013-03-14 18:42:57

+0

LEA(負載有效地址)與MOVE有些類似,它評估第一個參數並將結果加載到目標寄存器中。 LEA只是特定的地址(因此它總是生成完整的32位結果),更高級的MC680x0可以在地址生成單元中執行此操作,而不是ALU(它更快)。從源代碼視圖中,lea明確表示評估地址並且它的語法使其不易出錯(一個好的彙編器應該自動選擇最佳尋址模式,而不必指定它)。 – Durandal 2013-03-21 16:32:36

1

因爲我沒有獲得你使用任何彙編器/模擬器,我實際上並不能測試它一個更好的解決方案,但這裏的幾件事(一些這是在評論中已經指出):

  • dc.l聲明瞭一個長,你要ds.l(或類似)爲6個多頭
  • 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,再長的距離a2 + 5取一個4字節長...

你需要的是從地址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