【问题标题】:DOS Assembly - swapping values in bubblesortDOS 程序集 - 在冒泡排序中交换值
【发布时间】:2014-06-09 14:06:35
【问题描述】:

我正在尝试在 16b dos 程序集中实现冒泡排序(我正在使用 NASM)。我的程序成功生成了 1024 个随机 16b 数字的表,现在我必须按降序对它们进行排序,我决定使用冒泡排序,但我交换它们的方式并没有按照我认为的方式工作。这是交换两个数字的代码:

mov ax, [table+di]
cmp ax, [table+di+1]
jae dont_swap
mov bx, [table+di+1]
mov [table+di+1], ax
mov [table+di], bx

它应该只是将“di”指向的数字与表中的下一个数字交换。我很难解释效果,所以看看程序给出的一些输出:

-first few randomly generated numbers: 61923, 48369, 17084, 52802, 49358
-after sorting: 28482, 17007, 16962, 16962, 16962...

它只是重复最后一个数字。排序后的值甚至不在原始表中。 我确信问题不在我提供的代码之外,因为如果我删除它,重新编译程序它会完美地重复生成的表。

编辑 非常感谢所有做出贡献的人。问题是没有根据变量的大小缩放偏移量。当我遍历字节时,表存储单词变量。

【问题讨论】:

  • 除了你的问题,这可能是你对字长数据进行字节宽访问的结果,你可以简化:而不是从表中读取进行比较,然后再次读取仍然存在的值在一个寄存器中,只需重复使用那个。除非交换,否则将其保存在整个排序过程中。为此目的有一个 XCHG 指令。简化会有所帮助,因为它降低了复杂性,并且在剩余指令更少时更容易发现错误。
  • 我通常的建议是采取小步骤 - 从一个包含 2 个顺序不正确的数字的表格开始,并确保您的代码适用于这些数字。然后对其进行更改,以使它们已经井然有序,并确保其有效。然后移动最多 3 个元素,并尝试所有排列并确保排序适用于所有这些。 那么您应该决定是否跳转到 1024 个数字和/或随机化条目。
  • 考虑一下冒泡排序需要一次性实现的目标,而不是“交换”,而是“查找最高/最低数字”。

标签: assembly dos nasm swap


【解决方案1】:

由于您要比较和交换单词,因此您需要相应地缩放偏移量。下一个元素将在当前元素之后 2 个字节,即[table+di+2]

您还没有向我们展示您是如何计算/更新 di 的,所以不要忘记它还需要每个元素移动 2 个字节。

【讨论】:

  • 表是这样声明的:table times 1024 dw 0 你的建议还适用吗?
  • 是的。该声明实际上只说明了您为阵列保留了多少存储空间。 table 实际上是一个存储 2048 字节的地址,可以保存任何类型的数据。重要的是您如何在代码中访问该地址。如果您尝试从/向它读/写字,则需要使用相隔 2 个字节的地址,因为这是 x86 处理器上一个字的大小。
猜你喜欢
  • 1970-01-01
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 2019-04-21
  • 2018-10-01
  • 2015-04-10
相关资源
最近更新 更多