[英]Descending bubblesort with 68k
我正在摩托羅拉 68k 上學習組裝,我能夠按升序而不是降序進行 BubbleSort,我不知道為什么程序會進入無限循環; 謝謝;:代碼:
ORG $2000
START LEA ARRAY,A0
CLR D0 *Flag di scambio
MOVE.B #L-1,D1 *contatore
LOOP MOVE.B (A0),D2
MOVE.B 1(A0),D3
CMP D2,D3
BLE ELSE
MOVE.B D2,1(A0)
MOVE.B D3,(A0)
MOVE.B #1,D0
ELSE ADD #1,A0
DBRA D1,LOOP
TST D0
BNE START
SIMHALT
ORG $1000
ARRAY DC.B 1,5,2,4,3
L EQU 5
END START
MOVE.B #L-1,D1 *contatore
LOOP MOVE.B (A0),D2
MOVE.B 1(A0),D3
CMP D2,D3
BLE ELSE
MOVE.B D2,1(A0)
MOVE.B D3,(A0)
MOVE.B #1,D0
ELSE ADD #1,A0
DBRA D1,LOOP
基於D1
contatore的循環運行時間過長,在一個包含 5 個元素的數組中。 您最多可以進行 4 次比較。 這就是你寫#L-1
的原因。 但是, DBRA
指令會重復直到計數為-1 ,因此在這種情況下,您仍然會得到 5 次迭代,這是 1 太多。
我不知道為什么程序會進入無限循環;
沒有為DBRA D1,LOOP
指令初始化整個 16 位計數器可能會導致無限循環! 更好地使用MOVE.W #L-1,D1
。
當非零D0
寄存器告訴您對數組進行了更改時,您重復整個代碼。 這可以正常工作,但是意識到最小的元素將冒泡到遠端並且不再需要處理會更有效。 解決方案是使用變量contatore而不是常數#L-2
(校正后)。
START MOVE.W #L-2,D4 *first_contatore
NEXT LEA ARRAY,A0
CLR D0 *Flag di scambio
MOVE.W D4,D1 *contatore
LOOP ...
...
DBRA D1,LOOP
TST.B D0
BEQ DONE *Nothing was changed, earliest exit
DBRA D4,NEXT
DONE SIMHALT
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.