簡體   English   中英

使用 68k 的降序冒泡排序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM