В чем смысл этих утверждений на ассемблере? - PullRequest
1 голос
/ 12 января 2012

Я заметил несколько странно выглядящих утверждений, когда смотрел какой-то c-код в Disassembly. Операторы произошли непосредственно перед вызовом функции. Поэтому я удалил весь код из моей программы, оставив пустую основную функцию, подобную этой -

У меня есть пустая функция main, как эта -

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

Тем не менее, когда я посмотрел на разборку, рассматриваемые операторы сборки все еще присутствовали. Так кто-нибудь знает, для чего эти утверждения?

int _tmain(int argc, _TCHAR* argv[])
{
00411350  push        ebp  
00411351  mov         ebp,esp  
00411353  sub         esp,0C0h  
00411359  push        ebx  
0041135A  push        esi  
0041135B  push        edi  
0041135C  lea         edi,[ebp-0C0h]  
00411362  mov         ecx,30h  
00411367  mov         eax,0CCCCCCCCh  
0041136C  rep stos    dword ptr es:[edi]  
return 0;
0041136E  xor         eax,eax  
}

Заявления, о которых идет речь,

00411362  mov         ecx,30h  
00411367  mov         eax,0CCCCCCCCh  
0041136C  rep stos    dword ptr es:[edi]  

Ответы [ 4 ]

2 голосов
/ 12 января 2012

В сборках Debug компилятор Visual C ++ заполняет пространство стека, выделенное для локальных переменных, с помощью шаблона 0xCC, чтобы неинициализированные переменные можно было легко распознать при отладке. Есть некоторые другие магические значения, используемые компилятором и / или ОС для облегчения отладки; отметьте этот список в Википедии.

Я не уверен, почему компилятор решил выделить пространство стека в этой функции; возможно, это что-то особенное для обработки функции main.

2 голосов
/ 12 января 2012

Этот код заполняет кадр стека шаблоном (0xcc).exc содержит количество слов для заполнения, 'eax' - шаблон.Операционный код архитектуры Intel rep - «Повторить префикс операции строки».Скорее всего, это стандартный код, который будет иметь значение в полной функции (возможно, очистка локальных переменных, создание заведомо неверных данных для неинициализированных переменных).Здесь кадр стека уничтожается сразу при выходе, а код бесполезен.

Не о чем беспокоиться.

1 голос
/ 12 января 2012

Это некоторый избыточный код, который включен в сборках отладки. Похоже на некоторые проверки ошибок. Они не выводятся в сборках релиза.

0 голосов
/ 12 января 2012

Мне кажется, что при завершении работы программы происходит перезапись стека ... это имеет смысл в качестве меры предосторожности на случай, если какие-либо конфиденциальные данные останутся в мусоре.

РЕДАКТИРОВАТЬ : Как отмечалось в комментариях, это, кажется, в коде установки, так что это, вероятно, не причина (я подозреваю, что это для целей отладки). Однако я оставил здесь ответ для справки, так как он все еще может быть актуален в других ситуациях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...