Невозможно найти отрицательные числа для самой длинной убывающей последовательности - PullRequest
0 голосов
/ 05 января 2020

Я написал код сборки в сочетании с C. Это работает, только если числа в массиве являются положительными числами. Если я хочу проверить отрицательные числа, он пропускает числа.

Вот мой код сборки:

INCLUDE Irvine32.inc

.data

; LSD
bestIndex dword 0
bestLen dword 0
curIndex dword 0
curLen dword 1
i dword 1
strLSD byte "Longest Decreasing Sequence: ", 0
strBestIndex byte "Begins at index ", 0
strBestLen byte " and has a length of ", 0

.code

findLDS proc C arr:sdword, len:dword
;arr - array passed from C
;len is the length of the array

mov ecx, len
mov esi, arr
add esi, type arr

compare:
    .IF i <= ecx
    jmp cont
    .ELSE
    jmp ex
    .ENDIF

cont:
    mov eax, dword ptr [esi - type arr]
    .IF dword ptr [esi] <= eax
    jmp incCurLen
    .ELSE
    jmp setCurLen
    .ENDIF

incCurLen:
    inc curLen
    jmp compareCurLen

setCurLen:
    mov curLen, 1
    mov eax, i
    mov curIndex, eax
    jmp compareCurLen

compareCurLen:
    mov eax, bestLen
    .IF curLen > eax
    jmp changeBest
    .ELSE
    jmp incI
    .ENDIF

changeBest:
    mov eax, curIndex
    mov bestIndex, eax
    mov eax, curLen
    mov bestLen, eax
    jmp incI

incI:
    inc i
    add esi, type arr
    jmp compare

ex:
    ; when our loop ends, print the sequence
    mov ecx, bestLen
    mov ebx, bestIndex
    mov edx, offset strLSD
    call writestring

    L1:
        push ecx
        mov esi, arr
        mov eax, dword ptr [esi + type arr*ebx]
        call writeint
        mov al, ','
        call writechar
        mov al, ' '
        call writechar
        inc ebx
        pop ecx
        loop l1

call crlf
mov edx, offset strBestIndex
call writestring
mov eax, bestIndex
call writedec

mov edx, offset strBestLen
call writeString
mov eax, bestLen
call writedec

call crlf
ret
findLDS endp

END

Вот мой C код:

int main()
{

int arr[] = { -5, 10, 20, 80, 73, 32, 20, 22, 19, -5 };
int len = (sizeof(arr) / sizeof(*arr));
findLDS(arr, len);

return 0;
}

Выходные данные для этого массива:

Самая длинная убывающая последовательность: +80, +73, +32, +20. Начинается с индекса 3 и имеет длину 4

. Это правильно, но если я изменю свой массив (20 (индекс 6)) на -20, мой вывод будет

Последовательность наибольшего уменьшения: +80 +73, +32. Начинается с индекса 3 и имеет длину 3

1 Ответ

1 голос
/ 05 января 2020

Как подсказал @Jester, я изменил его на подписанный cmp, и он работает.

Код:

cont:
    mov eax, dword ptr [esi - type arr]
    cmp dword ptr [esi], eax
    jle incCurLen
    jmp setCurLen
...