Инструкция cmp не делает скачок jge в InsertionSort - PullRequest
1 голос
/ 20 июня 2019

Я пытаюсь написать итеративную версию InsertionSort с использованием MASM.После неоднократного получения неожиданных ошибок я пытался построчно пробежаться по коду и наблюдал в отладчике, что он сделал то, что ожидал.Конечно же, я не вижу, что инструкция cmp внутри моего цикла while перебрасывается каждый раз, когда она должна:

; 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

Например, если я использую данные, данные после первого 'дляитерации цикла, я попадаю в точку, где 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

1 Ответ

3 голосов
/ 20 июня 2019

jge - версия для знаковых значений - как таковое слово со значением ABAB является отрицательным - отсюда и результат сравнения.

Попробуйте jae (прыгайте, если выше или равно) вместо этого - беззнаковый эквивалент.

...