繁体   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