Assembly 如何在平面汇编程序中进行气泡排序? 我在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]+ “ ” ; } int[]arr={5,8,7,4,1,9} int n=6//数组大小 对于(i=0;i

Assembly 如何在平面汇编程序中进行气泡排序? 我在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]+ “ ” ; } int[]arr={5,8,7,4,1,9} int n=6//数组大小 对于(i=0;i,assembly,bubble-sort,fasm,Assembly,Bubble Sort,Fasm,冒泡排序的(现在是经典)片段是: ; 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

冒泡排序的(现在是经典)片段是:

; 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中传递数组中的项数


我第一次看到它是在。

有几个现有的NASM BubbleSort实现,而且FASM语法与NASM非常接近。(不幸的是,
站点:stackoverflow.com NASM bubble sort的google结果的第一页要么没有答复,要么只是在注释中。)但无论如何,我们不会为您做家庭作业;您至少需要在asm中进行尝试;您可以像调试模式编译器一样,一次一个地翻译每个C语句。否则,您最好只使用C编译器。
xchg
对于代码大小很好,但速度非常慢。(隐式
lock
prefix,因此它是一个具有完整内存屏障的原子RMW。)此外,使用EBX而不是EDX是很奇怪的;在大多数调用约定中,EBX保留调用,但EDX可以被删除。这看起来主要是针对代码大小而不是速度进行了优化。我认为它的算法基本上与我的codegolf.SE答案相同(但该版本在大小上更倾向于以牺牲速度为代价,例如在内部循环中使用
scasd
,并复制ECX以倒计时,而不是使用结束指针)。无论如何,此算法是跳降排序,而不是冒泡排序-每次找到新的最小值时,它都会进行交换,不一定是相邻的元素。请参阅。这就是为什么内部循环中的reg和内存之间可以进行一次交换,以及为什么在内部循环后进行存储(
stosd
)是必需的。它是选择排序和冒泡排序的混合。感谢您的澄清-我认为这是冒泡排序已经20多年了。我从来没有在软件中实际使用过它,因为快速排序在代码方面没有那么大,但一直享受着创造性思维的代码密度。