【问题标题】:How to make bubble sort in Flat Assembler?如何在 Flat Assembler 中进行冒泡排序?
【发布时间】:2021-06-04 13:17:08
【问题描述】:

我用 C++ 编写了一些冒泡排序代码。现在我想用平面汇编程序编写它,但它似乎比我预期的要难。有人可以帮助或提供相关资源吗? 这是我的 C++ 代码:

int[] arr= {5,8,7,4,1,9}
int n =6    //array size

for (i = 0; i < n-1; i++){   
// Last i elements are already in place
             for (j = 0; j < n-i-1; j++){
                            if (arr[j] > arr[j+1]){
                                             int x=arr[j];
                                            arr[j] = arra[j+1];
                                             arr[j+1] = x
                            }
}
}

For (int i=0; I < n ;i++){
            Cout << “  ”+arr[i]+ “  ” ;
}

【问题讨论】:

  • 现有的 NASM BubbleSort 实现有几种,FASM 语法与 NASM 足够接近。 (不幸的是,site:stackoverflow.com nasm bubble sort 的谷歌搜索结果的第一页要么没有答案,要么只在 cmets 中。)但无论如何,我们不会为你做功课。你至少需要尝试in asm;您可以从一次翻译每个 C 语句开始,就像调试模式编译器一样。否则,您还不如只使用 C 编译器。

标签: assembly bubble-sort fasm


【解决方案1】:

冒泡排序的(现在经典的)sn-p 是:

; by Andrew Howe

outerloop:  lea     ebx,[edi+ecx*4]
            mov     eax,[edi]
cmploop:    sub     ebx,4
            cmp     eax,[ebx]
            jle     notyet
            xchg    eax,[ebx]
notyet:     cmp     ebx,edi
            jnz     cmploop
            stosd
            loop    outerloop

您只需定义数据数组并在 EDI 中传递地址,并在 ECX 中传递数组中的项目数。

我第一次看到它是在AZillionMonkeys

【讨论】:

  • xchg 对代码大小有好处,但速度很慢。 (隐式 lock 前缀,所以它是一个具有完整内存屏障的原子 RMW。)此外,使用 EBX 而不是 EDX 很奇怪;在大多数调用约定中,EBX 是调用保留的,但 EDX 可以被破坏。
  • 这看起来优化了代码大小而不是速度,主要是。我认为这与我在Sort an Integer List 上的 codegolf.SE 答案基本相同(但该版本以牺牲速度为代价更注重尺寸,例如在内部循环中使用scasd,并将 ECX 复制到倒计时而不是使用结束指针)。
  • 无论如何,这个算法是 JumpDown 排序,而不是冒泡排序 - 每次你找到一个新的最小值时它都会交换,不一定是相邻的元素。见Bubble Sort: An Archaeological Algorithmic Analysis。这就是为什么内部循环中的 reg 和 memory 之间的一次交换可以工作,以及为什么需要在内部循环 (stosd) 之后进行存储。它是选择排序和冒泡排序的混合体。
  • 感谢您的澄清 - 我一直认为这是 20 多年的冒泡排序。我从来没有真正在软件中使用过它,因为快速排序在代码方面并不是那么大,但我一直很喜欢创造性思维的代码密度。
猜你喜欢
  • 2018-05-09
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 2022-01-19
  • 1970-01-01
  • 2016-04-13
  • 2019-06-14
相关资源
最近更新 更多