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