2015-11-17 2 views
0

В настоящее время я пишу процедуру в Assembly, чтобы узнать, отсортирован ли массив. Вот мой код:Процедура, возвращающая -1, независимо от сортируемого массива

.DATA 

inputIntMessage BYTE "Enter an integer: ", 0 
intArray  DWORD 4 DUP (?) 
integerInput DWORD ? 
sorted DWORD ? 

.CODE 
main PROC 
;Here is where I insert whatever the user input into the array 
mov eax, 0 
mov ecx, LENGTHOF intArray 
L1: 
    intInput inputIntMessage, integerInput ;This is the user input 
    mov ebx, integerInput 
    mov intArray[eax*4], ebx 
    inc eax 
    loop L1 

call if_sorted 
intOutput sorted 
INVOKE ExitProcess, 0 


if_sorted PROC 
    mov esi, OFFSET intArray 
    mov ebx, 0 
    mov ecx, LENGTHOF intArray 

    L2: 
     mov eax, [esi + TYPE intArray * ebx] 
     inc ebx 
     cmp eax, [esi+ TYPE intArray * ebx] 
     jle less_than_or_equal 
     jg greater_than 
    less_than_or_equal: 
     mov sorted, 1 
     loop L2 
    greater_than: 
     mov sorted, -1 
    ret 
if_sorted endp 

main ENDP 

if_sorted процедура возвращает 1 или -1 на основе, если массив отсортирован (1, если массив отсортирован, и -1, если это не так). Я прошел через отладчик, и когда массив отсортирован, отладчик переходит к строке call if_sorted, а затем мгновенно переходит к intOutput sorted и выводит -1 (когда он должен был пройти через процедуру if_sorted). Когда массив не отсортирован, отладчик переходит к строке call if_sorted и правильно выполняет процедуру и выводит -1. Есть идеи?

+0

Возможно, вы хотите выйти из своей программы после 'intOutput sorted'? Как только он распечатает значение, он продолжит выполнение, выполняющее то, что находится в процедуре 'if_sorted' –

+0

Итак, я бы написал' main ENDP' после 'intOutput sorted'? Но если массив отсортирован, он не запускается через 'if_sorted' вообще перед печатью' sorted'. Вторая часть этой проблемы (которую я еще не написал из-за этой проблемы), которая заключается в том, чтобы распечатать элементы массива, если массив отсортирован, и если массив не отсортирован, программа предложит пользователю ввести числа еще раз. Но так как сейчас, он будет постоянно запрашивать новые номера, потому что он всегда возвращает -1 – MistFTW

+0

Вам не нужно делать правильное завершение работы, чтобы выйти из вашей программы, иначе он просто продолжит выполнение какого-либо кода под ним (что, скорее всего, выполнит код в процедуре, приведенной ниже. –

ответ

0

Я решил! То, что я забыл, чтобы поставить ret после цикла закончена, так:

less_than_or_equal: 
     mov sorted, 1 
     loop L2 
     ret 
    greater_than: 
     mov sorted, -1 
     ret 

После того, как я включил, что процедура работала отлично.

Смежные вопросы