2013-10-30 138 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.