装配冒泡排序中的指针错误

时间:2014-04-18 05:47:59

标签: assembly masm irvine32

在我的冒泡排序程序中,我收到此错误:

  

Project.exe中0x00000006处的未处理异常:0xC0000005:Access   冲突。

这发生在程序的ret。我不确定错误是什么意思或如何解决这个问题。

INCLUDE Irvine32.inc
.data
     arrayDW SDWORD 5,6,7,3,5,3    ;array

.code
     main PROC
          mov esi, OFFSET arrayDW       ;ESI points arrayDW
          mov ecx, LENGTHOF arrayDW     ;ECX = array count
          call Bubblesort               ;sorts arrayDW
         exit
     main ENDP


     Bubblesort PROC 

          push esi      ;save esi
          push ecx      ;save ecx 
          dec ecx       ; size of array

          L1:
               push ecx                 ;save outer loop count
               mov esi, arrayDW         ;point to first value in the array was {mov esi, arrayDW}

          L2:
               mov eax, arrayDW[esi]       ; get array value, eax is the comparer
               cmp arrayDW[esi+4], eax     ; compare current value with the next value
               jg L3               ; if [ESI=eax] <= [ESI+4], do not exchange
               xchg eax, arrayDW[esi+4]   ; exchange the pair since [ESI=eax] > [ESI+4]
               mov arrayDW[esi], eax       ; place the higher value 

          L3:
               add esi, 4        ;move both pointers foward
               loop L2           ; looping inner loop

               pop ecx           ;retrieve outer loop count
               loop L1           ; else repeat outer loop

               ret
    Bubblesort ENDP



END main

1 个答案:

答案 0 :(得分:1)

我的程序集非常生疏,但是在你的起泡程序开始时它看起来像push esipush ecx而从来没有pop它们,所以你的ret指令会试图将调用者的地址从堆栈中拉出来,最后跳到ecx,即数组的长度。你的数组中有6个元素,所以你最终会跳到0x00000006

您可以通过在子例程末尾添加两条pop说明,或者在开头删除push esipush ecx来解决此问题。