在我的冒泡排序程序中,我收到此错误:
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
答案 0 :(得分:1)
我的程序集非常生疏,但是在你的起泡程序开始时它看起来像push esi
和push ecx
而从来没有pop
它们,所以你的ret
指令会试图将调用者的地址从堆栈中拉出来,最后跳到ecx
,即数组的长度。你的数组中有6个元素,所以你最终会跳到0x00000006
。
您可以通过在子例程末尾添加两条pop
说明,或者在开头删除push esi
和push ecx
来解决此问题。