【问题标题】:Descending bubblesort with 68k使用 68k 的降序冒泡排序
【发布时间】:2022-01-10 05:00:14
【问题描述】:

我正在摩托罗拉 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  

【问题讨论】:

  • BNE START 一直到程序的开头,如果它被占用,重置你的循环计数器。用伪代码或 C 语言写下逻辑,以确定两个循环之前与外循环内部应该是什么。

标签: assembly motorola 68000 easy68k


【解决方案1】:
      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.L  D0        *Flag di scambio      
      MOVE.W D4,D1     *contatore      
      
LOOP  MOVE.B (A0),D2
      MOVE.B 1(A0),D3
      CMP.B  D2,D3
      BLE    ELSE
      MOVE.B D2,1(A0)
      MOVE.B D3,(A0)
      MOVEQ  #1,D0      
ELSE  ADDQ.L #1,A0
      DBRA   D1,LOOP
      TST.L  D0
      BEQ    DONE      *Nothing was changed, earliest exit
      DBRA   D4,NEXT

DONE  SIMHALT

提示:不要忽略大小后缀。如果将几个字节大小的数组元素移动到几个数据寄存器,然后比较这些寄存器而不指定大小,则正确的结果将取决于特定汇编程序使用的默认值。如果默认大小恰好是 .L 或 .W,那么您的代码将出错。
因此,请始终说明您的需求并将CMP D2,D3 更改为CMP.B D2,D3。小努力,大收获!

【讨论】:

    猜你喜欢
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多