我正在嘗試在程式集中實作冒泡排序。這是我的代碼。我不斷收到分段錯誤。我在下面有一個功能。我一直試圖弄清楚這一點,但我找不到 x86 的編譯器,我一直在檢查我的代碼以檢查問題所在,但無濟于事。
這是我的功能代碼:
bubble:
push ebp
mov ebp, esp
push ecx
push edx
push edi
push esi
push ebx
push eax
mov eax, 0
mov ecx, [ebp 12] ; number of elements in the array
mov edx, [ebp 8]; address of array
mov edi, 0
mov esi, 0
dec ecx; n - 1
mov esi, 1
sortOuter:
cmp esi, 0
jg sort
sort:
mov esi, 0 ;count
check:
cmp edi, ecx ; i < n - 1
jl sortInner
sortInner:
mov ebx, [edx edi*4] ; mov array[i 1] to ebx
cmp [edx], ebx ; cmp array[i] to array[i 1]
jle noswap
swap:
mov eax, ebx ; mov array[i 1] to eax
mov ebx, [edx] ; mov array[i] to array[i 1]
mov [edx], eax ; mov array[i 1] to array[i]
inc esi ; count
noswap:
inc edi ; i
jmp check
jmp sortOuter
done:
call print_nl
pop ebx
pop esi
pop edi
pop edx
pop ecx
mov esp, ebp
pop ebp
ret
uj5u.com熱心網友回復:
分段錯誤來自您創建的無限回圈
check: cmp edi, ecx ; i < n - 1 jl sortInner sortInner:
如果 EDI 小于 ECX,則跳轉到sortInner,但如果不是,則直接進入sortInner。無論如何,您總是最終在sortInner運行代碼,并且由于代碼使用的記憶體地址不斷增長,在某些時候您將嘗試讀取您無權訪問的記憶體,因此會出現分段錯誤。
現在,如果您要更正此問題,則會出現第二個無限回圈等待。
sortOuter: cmp esi, 0 jg sort sort:
其他錯誤包括:
- 在內部回圈開始時重置 ESI 而不是 EDI
- 根本不交換元素,但總是在第一個陣列元素中寫入最小值
- 忘記恢復暫存器 EAX
這是一個有效的 BubbleSort。不要只是復制它,而是找出它是如何作業的!
在具有 N 個元素的陣列中,我們最多必須進行 N-1 次比較(以使最大的值泡沫朝向后方)。
因為InnerLoop使用一個從不斷減少的OuterLoop計數器初始化的計數器,所以隨著 OuterLoop 的每次迭代,在InnerLoop中處理的陣列部分變得更小。然后我們不再處理的陣列部分包含冒泡到陣列末尾的最大元素,因此得名 BubbleSort。
已為空陣列或只有 1 個元素的陣列做出規定。始終包含一些特殊情況的代碼!
bubble:
push ebp
mov ebp, esp
push ...
mov ecx, [ebp 12] ; Number of elements in the array
sub ecx, 1 ; First time we do n = N-1
jbe Done ; Array is empty or has but 1 element
OuterLoop:
mov edx, ecx ; Current value of the OuterLoop counter (n)
mov esi, [ebp 8] ; Address of array
InnerLoop:
mov eax, [esi]
mov ebx, [esi 4]
cmp eax, ebx
jng NoSwap
mov [esi], ebx
mov [esi 4], eax
NoSwap:
add esi, 4
dec edx
jnz InnerLoop
dec ecx ; Next times we do n = n-1
jnz OuterLoop
Done:
pop ...
pop ebp
ret
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/537477.html
標籤:排序部件x86冒泡排序
