相关疑难解决方法(0)

为什么64位VC++编译器在函数调用后添加nop指令?

我使用Visual Studio C++ 2008 SP1,x64 C++编译器编译了以下内容:

在此输入图像描述

我很好奇,为什么编译器会nop在那些calls 之后添加这些指令?

PS1.我会理解第二和第三个nops将是4字节边距上的代码对齐,但是第一个nop会打破这个假设.

PS2.编译的C++代码中没有循环或特殊的优化内容:

CTestDlg::CTestDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CTestDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

    //This makes no sense. I used it to set a debugger breakpoint
    ::GdiFlush();
    srand(::GetTickCount());
}
Run Code Online (Sandbox Code Playgroud)

PS3.附加信息: 首先,谢谢大家的意见.

以下是其他观察结果:

  1. 我的第一个猜测是增量链接可能与它有关.但是,项目中的Release构建设置Visual Studioincremental linking关闭.

  2. 这似乎x64只影响构建.构建为x86(或Win32)的相同代码没有那些nops,即使使用的指令非常相似:

在此输入图像描述

  1. 我尝试使用更新的链接器构建它,即使看起来x64产生的代码VS 2013有些不同,它仍会nop在某些calls 之后添加s: …

c++ 64-bit assembly disassembly visual-studio

20
推荐指数
2
解决办法
1079
查看次数

标签 统计

64-bit ×1

assembly ×1

c++ ×1

disassembly ×1

visual-studio ×1