代码之家  ›  专栏  ›  技术社区  ›  Jishan

masm x86中的冒泡排序在几个交互之后没有排序

  •  2
  • Jishan  · 技术社区  · 7 年前

    因此,我尝试使用以下代码作为模板来实现BubbleSort:

        int n = arr.length;  
        int temp = 0;  
         for(int i=0; i < n; i++){  
                 for(int j=1; j < (n-i); j++){  
                          if(arr[j-1] > arr[j]){  
                                 //swap elements  
                                 temp = arr[j-1];  
                                 arr[j-1] = arr[j];  
                                 arr[j] = temp;  
    

    但是,我的汇编代码只对前1-2次进行排序,并产生错误的结果。我试过多次运行调试器,但我天真的眼睛看不到翻译中的任何错误。

    .data
    arr DWORD 3,2,1,4,5
    temp DWORD 0
    arr_j DWORD 0
    ; Bubble Sort
    .code
    main proc
    mov esi, OFFSET arr
    mov eax, 0 ; for outer loop
    mov ebx, 1 ; for inner loop
    
    OuterLoop:
    
         InnerLoop:
    
            ; swap elements
            ; referencing j in array
            call MULTIPLY
            add edx, esi ; edx = esi + 4*ebx that is *arr[j]
            mov edi, [edx]
            mov [arr_j], edi ; store arr[j]
            sub edx, 4
            mov edi, [edx] ; store arr[j - 1]
    
            cmp edi, [arr_j] ; if(arr[j-1] > arr[j]) -> swap elements
            jle FAIL_SWAP
    
            ; swap elements here
            mov [temp], edi
            mov edi, [arr_j]
            mov ebp, [temp]
            mov [edx], edi ; arr[j - 1] < arr[j]
            add edx, 4
            mov [edx], ebp
    
            FAIL_SWAP:
    
         inc ebx
         mov ecx, LENGTHOF arr
         sub ecx, eax
         cmp ebx, ecx
         jl InnerLoop
    
    inc eax
    cmp eax, LENGTHOF arr
    jl OuterLoop     
    
    
    invoke ExitProcess,0
    main ENDP
    
    MULTIPLY PROC ; multiply 4 with ebx, store at edx
        push esi
    
        xor esi, esi
        mov esi, 1
    
        mov edx, ebx
    
        LOOPER:
        add edx, ebx
    
        inc esi
        cmp esi, 4
        jl LOOPER
    
        pop esi
        ret
    MULTIPLY ENDP
    END main
    

    任何帮助都非常感谢。谢谢。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Sep Roland    7 年前
    int n = arr.length;  
      int temp = 0;  
        for(int i=0; i < n; i++){  
          for(int j=1; j < (n-i); j++){
            ...
    


    mov eax, 0 ; for outer loop
    mov ebx, 1 ; for inner loop
    OuterLoop:
        InnerLoop:
    

    BX=5 BX

    mov eax, 0 ; for outer loop
    OuterLoop:
        mov ebx, 1 ; for inner loop
        InnerLoop:
    

    EAX

    mov eax, LENGTHOF arr
    dec eax
    OuterLoop:
        mov ebx, 1 ; for inner loop
        InnerLoop:
            ...
            inc ebx
            cmp ebx, eax
            jbe InnerLoop
        dec eax
        jnz OuterLoop
    

    AX

    AX   BX
    4    1 to 4
    3    1 to 3
    2    1 to 2
    1    1 to 1