2013-10-30 62 views
1

因此,對於我的任務,我應該在彙編程序中編寫BubbleSort。我在此Java BubbleSort循環上基於我的彙編程序代碼。出於某種原因,彙編程序一直認爲數組A和B是一個大數組,並試圖對整個事物進行排序。我似乎無法得到它停止一旦它與一個做了排序,並與B.BubbleSort與彙編程序

while (Done == 0) 
{ 
    Done = 1;   // 1 represents true. 
    i = 0; 
    while (i < N-k) 
    { 
    if (A[i] > A[i+1]) 
    { 
     Help = A[i]; 
     A[i] = A[i+1]; 
     A[i+1] = Help; 
     Done = 0;   // Not sorted... 
    } 
    i++; 
    } 
    k = k + 1; 
} 

這裏的彙編代碼重新開始。格式化有點搞砸了,但希望它仍然可讀。

Start: 
move.l #A, D0 
move.l #5, D1 
bsr BubbleSort * Sort array A 

move.l #0, i 

Print1: 
move.l #5, D0 
move.l i, D5 
cmp.l i, D0 
beq Start2 ********** 

move.l #A, A0 
move.l i, D0 
muls #4, D0 
move.l 0(A0, D0.w), D0 
jsr WriteInt 

addi.l #1, i 
bra Print1 

Start2: 
move.l #str, A0 ************ 
move.l #5, D0 
jsr WriteLn 

move.l #B, D0 
move.l #10, D1 
bsr BubbleSort * Sort array B 

move.l #0, i 

Print2: 
move.l #10, D0 
cmp.l i, D0 
beq Stop 

move.l #B, A0 
move.l i, D0 
muls #4, D0 
move.l 0(A0, D0.w), D0 
jsr WriteInt 

addi.l #1, i 
bra Print2 

*D0 = address of int array to be sorted 
*D1 = N 

BubbleSort: 
movea.l #A, A0 
move.l #0, i 
move.l #0, D *Done is 0 
move.l D, D2 *pass Done to D2 
move.l D1, N *N is number of elements 
move.l #0, k 

WhileStart: 
cmp.l #0, D2 * compare if D2 == 0 
BNE WhileEnd *if not 0, go to WhileEnd 
move.l #1, D2 * D2=1 
move.l #0, i * i = 0 
move.l i, D3 *pass i to D3 
move.l k, D4 * pass k to D4 
move.l N, D7 * pass N to D7 
sub.l D4,D7  * D7 = N-k 

WhileStart2: 
cmp.l D7, D3 *Compare i with N-k 
BGE WhileEnd2 
move.l i, D3 
muls #4 D3 
move.l 0(A0, D3.w), D5 *D5 = A[i] 
move.l i, D4 
add.l #1, D4 *i+1 
muls #4, D4 
move.l 0(A0, D4.w), D6 *D6 = A[i+1] 

IfStart: 
cmp.l D6, D5 *compare A[i] with A[i+1] 
BLE IfEnd 
move.l D5, 5000 * pass A[i] to memory location 5000 
move.l D6, 0(A0, D3.w) *A[i] = A[i+1] 
move.l 5000, 0(A0, D4.w) *A[i+1] = whatever was at location 5000 (old A[i]) 
move.l #0, D2  * D2=0 again 
move.l i, D3  * passing i to D3 
bra IfEnd *End of If loop 

IfEnd: 
move.l i, D3 *i++ 
add.l #1, D3 
move.l D3, i 
bra WhileStart2 *Go back and compare i with N-k 

WhileEnd2: 
move.l k, D4 *k = k + 1 
add.l #1, D4 
move.l D4, k 
bra WhileStart * go back 

WhileEnd: 
rts *** I have added a rts to make sure your function returns.... 
+2

這是什麼彙編? –

+0

針對哪個體系結構的彙編代碼,這不是x86 - 這是肯定的。在問題和標籤中包含的重要信息。 –

回答

1

這是M68K裝配。這裏有一個很好的參考:http://wpage.unina.it/rcanonic/didattica/ce1/docs/68000.pdf

我看到你的代碼中有兩處錯誤語義:你裏面泡

1)排序過程,你永遠不會使用呼叫者已經擺在D0值。你實際上用第一條語句將數組的地址硬編碼爲A:

movea.l #A, A0 

這將保持數組B不被排序。我建議你用這個代替:

move.l D0, A0 

2)你的元素尋址包括2。例如一個額外的因素,你使用D4作爲索引在這個片段中註冊過的A0:

muls #4, D4 
    move.l 0(A0, D4.w), D6 *D6 = A[i+1] 

「地址寄存器間接指數」尋址模式(在http://www.freescale.com/files/archives/doc/ref_manual/M68000PRM.pdf秒2.2.8)將已經由2比例索引寄存器(D4)的內容的基礎上在32位操作數大小(即,」。 l「in move.l)和16位索引寄存器規格(即D4.w中的」.w「)。所以,你的muls指令只應該乘以2.更好的是,你可以省略muls指令,並簡單地將「D4.w」改爲「D4.l」。

它看起來像你所有的訪問數組有這個相同的X2索引錯誤。假設你在鄰近的存儲單元中聲明瞭A和B,這個x2索引錯誤將導致你的排序例程在調用A時訪問B的元素,當然在這個過程中對這兩個數組施加一些偏序。這看起來像你的排序例程是同時排序A和B.