我需要在一個 proc 中對陣列進行排序,并且最小的數字應該與第一個數字交換它的位置。比第二個較小的數字和第二個數字等等......我剛剛在 ds:0000 中寫了 00 00 00 00
proc min
push bx
push ax
mov si,bx
inc bx
checkminnum: ; the outer loop for checking all the numbers
mov al, [byte ptr si]
cmp [byte ptr bx] , al
jb smaller
mov si, bx; the offset of the smaller num is saved in si
smaller:
inc bx
cmp [byte ptr bx], '$' ; check when the loop should end
jne checkminnum
pop ax
pop bx
ret
endp min
proc swap
push bx
mov bx, offset array
repos:
call min
mov al, [byte ptr bx]
push ax
mov al, [byte ptr si]
mov [byte ptr bx], al
pop ax
mov [byte ptr si], al
inc bx
cmp [byte ptr bx], '$'
jne repos
pop bx
ret
endp swap
uj5u.com熱心網友回復:
該分鐘PROC表現出這兩種錯誤:
- 您正在使用與找到最小值所需的條件相反的條件。
- 您的代碼將在其最后一次迭代中將 $-終止符視為陣列元素。在與后面的陣列元素進行比較之前,您必須檢查終止符,因為所述元素可能不存在。
代碼所做的是按升序進行 InsertionSort。
; IN (bx) OUT (al='$',si) MOD ()
proc min
push bx
SetMin:
mov si, bx ; Position of minimum
Cont:
inc bx
mov al, [bx]
cmp al, '$'
je Done
cmp al, [si] ; Compare with current minimum
jb SetMin ; Smaller, so record position
jmp Cont ; Not smaller, so just continue
Done:
pop bx
ret
endp min
在交換程序中,如果最小值的位置等于陣列的當前前端,最好根本不交換元素。
并且不要使用堆疊并使用單個暫存器AL,而是使用額外的暫存器,例如CL和DL以提高效率。
; IN () OUT () MOD (al,cl,dl)
proc swap
push bx
push si
mov bx, offset array
More:
call min ; -> AL='$' SI
cmp si, bx
je Skip
mov cl, [bx]
mov dl, [si]
mov [bx], dl
mov [si], cl
Skip:
inc bx
cmp [bx], al ; AL='$'
jne More
pop si
pop bx
ret
endp swap
使用終止符處理陣列的一個缺點是值 36($ 字符的 ASCII 代碼)不能出現在陣列本身中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/384838.html
