Почему выходные данные моей программы постоянно меняются?Регистр EAX постоянно меняет значение? - PullRequest
1 голос
/ 11 июня 2019

Я написал программу, чтобы найти длину наибольшей увеличивающейся последовательности с учетом большего array (array инициализируется в c ++, а главная функция c ++ вызывает процедуру), я получил откомпилированный код, однако вывод программы постоянно меняется?

Я пытался заменить и наблюдать регистры, и они, похоже, никак не влияют на вывод программы.

Наконец, я попытался удалить все инструкции внутри процедуры, которые могли бы повлиять на ret (возвращает EAX), однако программа по-прежнему выводит случайные целые числа на консоль

Sequence.asm (.asm file)

.586
.MODEL flat,C


.data
.code




    longestSequence PROC USES  eax ebx esi edi ,theArrayOFFSET: PTR DWORD,theArraySize: DWORD
    LOCAL temp[10]: DWORD 
    LOCAL lengthc: DWORD
    LOCAL k: DWORD  
    LOCAL temp1: DWORD 
    LOCAL temp2: DWORD 



//the algorithm to find the longest sequence of integer should be here, but its not shown for simplicity and the program still output random integers

*
*
*
mov eax,8 //suppose I move 8 into eax, it still generates random output

ret
longestSequence ENDP


END 
Class ConsoleApplication3(cpp file)

#include "pch.h"
#include <iostream>

extern "C" int longestSequence(int array[], unsigned count);

int main()
{
    int array1[10] = { -5, 10, 20, 14, 17, 26, 42, 22, 19, -5 };
    int seq;


    seq = longestSequence(array1, 10);
    cout << seq << endl;
    return 0;
}

Выходные данные меняются при каждом запуске программы, например: 1-й пробег - 7338264 2-й пробег - 19920684

Правильный вывод для array1 = { -5, 10, 20, 14, 17, 26, 42, 22, 19, -5 }; должен быть 4, поскольку длина самой длинной последовательности составляет 4 для {14,17,26,42}

1 Ответ

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

PROC USES eax заставляет MASM генерировать код пролога, который сохраняет eax в стеке при запуске функции, а также код эпилога, который восстанавливает свое первоначальное значение перед каждым ret. Это стирает все значения, которые вы готовите в eax перед выходом из функции.

Другими словами, ваш

mov         eax,8  
ret

фактически переведено на

mov         eax,8  
pop         edi  
pop         esi  
pop         ebx  
pop         eax  
leave  
ret  

(В коде вызова eax, вероятно, используется для временного хранения некоторого значения адреса. Рандомизация адресного пространства приводит к тому, что он переключается с одного сеанса на другой, что и рандомизирует наблюдаемое вами значение.)

Удалить eax из списка USES.

...