【问题标题】:What is all of these weird assembler instructions on my main function disassembly?我的主要功能反汇编中所有这些奇怪的汇编指令是什么?
【发布时间】:2020-04-08 23:38:40
【问题描述】:

所以我有这个主要功能,它会产生很多奇怪的指令。我正在使用 Visual Studio 2019,并且处于调试模式,因此禁用了优化。这些指令在做什么?

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...)

编辑:奇怪的是,我的意思是我不明白这里发生了什么,并不是说它不标准。

【问题讨论】:

  • 我没有看到任何奇怪的说明。对我来说看起来很标准。据推测,他们会做任何你在 VS 中编写的代码。
  • 是的,我不明白它是什么,奇怪的是我的意思是我不明白发生了什么。
  • 你想学习汇编吗?因为这可能不是一个好的学习方式。
  • 我很惊讶它被关闭了。对我来说,这似乎是一个完全合理的问题。
  • 不,我只是看到我的 C 代码实际生成的内容,我注意到主函数正在生成很多东西。我知道一点汇编,但这不是为了学习汇编(我对汇编有一个粗略的了解),但我只是想知道主要功能在做什么!谢谢你的回答。

标签: c++ visual-studio disassembly


【解决方案1】:

这些是调试助手。

__security_cookie 用于检查超出堆栈末尾的写入(例如,如果您溢出基于堆栈的缓冲区)。实际检查是在退出函数时进行的。

__CheckForDebuggerJustMyCode 允许调试器跳过“系统、框架、库和其他非用户调用”,请参阅here

还有这段代码:

lea         edi,[ebp-104h]  
mov         ecx,41h  
mov         eax,0CCCCCCCCh  
rep stos    dword ptr es:[edi]

用垃圾字节填充堆栈帧,如果您取消引用未初始化的指针,这些字节将(例如)导致异常。

Release 版本中不存在这些内容,仅在 Debug 版本中存在。

【讨论】:

    猜你喜欢
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    • 2011-08-06
    • 2011-11-09
    • 2016-04-04
    • 2017-08-25
    相关资源
    最近更新 更多