所以我有这个主要功能,它会产生很多奇怪的指令。我正在使用Visual Studio 2019,并且处于 Debug模式,因此优化被禁用。这些指示在做什么?
int main()
{
00D340E0 push ebp
00D340E1 mov ebp,esp
00D340E3 sub esp,104h
00D340E9 push ebx
00D340EA push esi
00D340EB push edi
00D340EC lea edi,[ebp-104h]
00D340F2 mov ecx,41h
00D340F7 mov eax,0CCCCCCCCh
00D340FC rep stos dword ptr es:[edi]
00D340FE mov eax,dword ptr [__security_cookie (0D3A024h)]
00D34103 xor eax,ebp
00D34105 mov dword ptr [ebp-4],eax
00D34108 mov ecx,offset _842A6236_main@cpp (0D3C012h)
00D3410D call @__CheckForDebuggerJustMyCode@4 (0D31208h)
(the rest of the file...)
编辑:奇怪,我的意思是我不明白这里发生了什么,不是那不是标准。
最佳答案
这些是调试助手。__security_cookie
用于检查超过堆栈末尾的写操作(例如,如果溢出基于堆栈的缓冲区)。退出功能时进行实际检查。__CheckForDebuggerJustMyCode
允许调试器跳过“系统,框架,库和其他非用户调用”,请参阅here。
这段代码:
lea edi,[ebp-104h]
mov ecx,41h
mov eax,0CCCCCCCCh
rep stos dword ptr es:[edi]
如果您取消引用未初始化的指针,则用垃圾字节填充堆栈帧,例如,垃圾字节将导致异常。
发布版本中没有这些东西,只有调试版本中有。
关于c++ - 我的主要功能反汇编中所有这些奇怪的汇编指令是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61111713/