Я написал код сборки в сочетании с 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