簡體   English   中英

cmp指令沒有在InsertionSort中進行jge跳轉

[英]cmp instruction not making jge jump within InsertionSort

我正在嘗試使用MASM編寫一個迭代版本的InsertionSort。 在反復出現意外錯誤后,我嘗試逐行運行代碼並在調試器中觀察它是否達到了我的預期。 果然,我的'while循環'中的cmp指令似乎並不是每次都應該跳轉:

; store tmp in edx
    movzx edx, word ptr[ebx + esi * 2];   edx: tmp = A[i]
    ...
    //blah blah

while_loop :
...
    movzx eax, word ptr[ebx + 2 * edi]
    cmp dx, ax
    jge exit_while

例如,如果我使用給定的數據,在第一次'for循環'迭代之后,我到達EDX = 0000ABAB和EAX = 00003333的點。 我到達了界限:

cmp dx, ax
jge exit_while

既然ABAB> 3333,我希望它能跳到exit_while,但事實並非如此!

這里發生了什么??? 我完全失去了。

.data
arr word 3333h, 1111h, 0ABABh, 1999h, 25Abh, 8649h, 0DEh, 99h
sizeArr dword lengthof arr
printmsg byte "The array is: [ ", 0
comma byte ", ", 0
endmsg byte " ]", 0

.code
main proc
    call printArr
    call crlf
    push sizeArr
    push offset arr
    call insertionsort
    call crlf
    call printArr
    call crlf
    call exitprocess
main endp


insertionsort proc
    push ebp
    mov ebp, esp
    _arr = 8
    len = _arr + 4

    mov ebx, [ebp + _arr]
    mov ecx, [ebp + len]
    dec ecx
    mov esi, 1; store i in esi, with i=1 initially

;   for (i = 1; i < SIZE; i++)
forloop:

; store tmp in edx
    movzx edx, word ptr[ebx + esi * 2];   edx: tmp = A[i]

; store j in edi, where in initially j = i
    mov edi, esi
;set j=i-1
    dec edi

;while (j >= 0 &&   tmp<arr[j])
while_loop :
    cmp edi, 0
    jl exit_while
    movzx eax, word ptr[ebx + 2 * edi]
; cmp dx, [ebx + 2 * edi]
    cmp dx, ax
    jge exit_while

; A[j] = A[j-1]
    push word ptr [ebx+2*edi]
    pop word ptr [ebx+2*edi+2]
; j = j - 1
    dec edi
    jmp while_loop

exit_while:
    push dx
    pop word ptr[ebx + 2*edi+2]
    ; mov[ebx + edi], dx;    A[j] = tmp
    inc esi;     i = i + 1
    loop forloop

finished:
    mov esp, ebp
    pop ebp
    ret 8
insertionsort endp



printArr proc
    push ebp
    mov ebp, esp
    mov ebx, offset sizeArr
    mov ecx, [ebx]
    mov esi, offset arr
    mov edx, offset printmsg
    call writestring
    mov edx, offset comma
loop1 :
    movzx eax, word ptr [esi]
    call writeHex
    call writestring
    add esi, 2
loop loop1

    mov edx, offset endmsg
    call writestring
    mov esp, ebp
    pop ebp
    ret
printArr endp

jge是有符號值的版本 - 因此,值為ABAB的單詞為負數 - 因此您會看到比較結果。

嘗試jae (如果大於或等於跳躍) - 無符號等價物。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM