首页 > 解决方案 > C汇编实现冒泡排序

问题描述

我必须用汇编工具用 C 语言编写一个冒泡排序。我的 C 代码如下所示:

#include <stdio.h>

extern int arraysort(int array[],int length);
int main () {
    int array[]= {7,4,3,6,2,1};
    int length = 6;
    printf("Unsorted array: %d,%d,%d,%d,%d,%d\n",array[0],array[1],array[2],array[3],array[4],array[5]);
    arraysort(array,length);
    printf("Sorted array: %d,%d,%d,%d,%d,%d\n",array[0],array[1],array[2],array[3],array[4],array[5]);

    return 0;
}

我的汇编代码如下所示:

.intel_syntax noprefix

.text
.global arraysort
arraysort: # int sortarray(int array[],int length)

    #function prologue
    push ebp
    mov ebp, esp
    # function prologue end

    push ebx   # save ebx for cdecl convection
    # 1.argumentum [ebp + 4*2] this is the array
    # 2.argumentum [ebp + 4*3] this is the length

    mov ecx, [ebp + 12]   #array length (6)
    dec ecx               #array length (5)
    mov edx, 1            #variable j
    mov esi, [ebp + 8] #array address
loop1:
      cmp ecx, 0  # (int i =length; i> length;i--)
      jg end
    loop2:
    mov eax, [esi + 4*ecx] #array[0]
    mov ebx, [esi + 4*edx] #array[1]
    cmp eax, ebx #if eax > ebx jump to csere
    jg swap
    dec ecx  #i--
    inc edx#j++
    jz end
    jmp loop2

swap:
    mov [esi + 4*edx], eax #change the two elements
    mov [esi + 4*ecx], ebx
    jmp loop2

end: 
    pop ebx
    mov esp, ebp
    pop ebp
    ret

我不知道是什么问题,我为此苦苦挣扎。如果我将第一个循环 jg 更改为 jl,我会得到无限循环:/ 对不起我的英语和我的汇编编码技能,但我仍在学习这种语言。请帮我!谢谢

标签: cassemblyx86intelbubble-sort

解决方案


这是主要问题:

    mov ecx, [ebp + 12]   #array length (6)
    dec ecx               #array length (5)
    mov edx, 1            #variable j
    mov esi, [ebp + 8] #array address
loop1:
      cmp ecx, 0  # (int i =length; i> length;i--)
      jg end

专注于ecx那里。你基本上是在说if(--length > 0) goto end;,所以你跳过了你的功能的全部内容。

现在一旦你解决了这个问题,你就会开始遇到段错误。原因如下:

    dec ecx  #i--
    inc edx#j++
    jz end

这相当于--i; if(!++j) goto end;. 结果,您的循环将运行比您想要的更多的迭代(直到j溢出,但实际上它会首先出现段错误)。我猜你的意思是切换dec ecxand inc edx,这样循环会在i到达 0 时结束。

无论如何,也修复了该问题,您的代码将返回一个更新的数组,但它仍然是错误的。在这一点上,这只是因为你的冒泡排序是错误的,而不是因为任何与汇编相关的错误,所以我会在这里停下来。


推荐阅读