如何读取 Visual C++ 2010 生成的程序集输出?

Posted

技术标签:

【中文标题】如何读取 Visual C++ 2010 生成的程序集输出?【英文标题】:How to read Assembly output generated by Visual C++ 2010? 【发布时间】:2014-12-25 22:18:29 【问题描述】:

我有以下 C++ 代码:

int main()

    int i;
    int j;
    i = 1111;
    j = 2222;

    return 0;

我想查看这个 C++ 代码编译成什么汇编代码,所以我选择了以下选项:

此选项将输出每个 C++ 语句,并直接在其下输出它对应的汇编指令。但是有些 C++ 语句不对应任何汇编指令(例如:int i;)。所以我想确保在阅读生成的汇编代码时我的以下假设是正确的:

【问题讨论】:

变量ij的声明不涉及任何指令。它只是让编译器确保它在堆栈中标记相同的地址内存。 【参考方案1】:

int i; int j; 只是变量声明。它们甚至没有被声明初始化,因此从这个意义上说,这两行没有明确的汇编指令。但请注意,局部变量声明确实会导致在栈上分配这些局部变量。

是的,对于你问题的后半部分,mov DWORD PTR_i$[ebp], 1111 只对应于i = 1111;

【讨论】:

我的意思是这三个 C++ 语句对应于这条单独的汇编指令,还是前两个 C++ 语句不对应任何指令? mov DWORD PTR_i$[ebp], 1111 只对应i = 1111; @joseph_m 声明通知编译器它需要在堆栈上(或者可能只是在寄存器中)为这些值保留一些空间。声明可以导致汇编输出——例如,如果你声明一个具有默认构造函数的类型的变量,该构造函数将被调用。然而,在这种情况下,声明除了改变堆栈指针移动的量外,没有直接对汇编器输出做任何事情。 @cdhowie 是的,你是对的。但是如果我新建一个对象(例如:MyClass object1;),在它下面会直接显示MyClass object1;对应的Assembly指令,这样我就知道这些指令对应的是这个语句。但我只是想知道汇编指令是否可以对应多个 C++ 语句而不仅仅是一个。 @joseph_m 有时,但更典型的是多条汇编指令对应一行代码。【参考方案2】:

我认为(出于教育目的)您应该将这些语句放在一个函数中,然后从 main 调用该函数,然后(在 main 函数中):

sub esp, 216                ; 000000d8H

变成:

sub esp, 192                ; 000000c0H

和:

lea edi, DWORD PTR [ebp-216]

变成:

lea edi, DWORD PTR [ebp-192]

发生的事情是这些指令在堆栈中为 i 和 j 保留内存。所以有机器指令(除了通常带有其他值外,它总是存在的)但是你需要了解正在发生的事情才能理解指令是什么。 216值将用于包含i和j定义的函数中(假设没有其他定义)。

请注意,为“i”设置值的 mov 指令使用的是 ebp 寄存器。该寄存器指向堆栈。所以我认为你可以假设指令是唯一的指令。

【讨论】:

以上是关于如何读取 Visual C++ 2010 生成的程序集输出?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 程序未在 Visual Studio 2010 中读取绝对路径 [关闭]

从 VC6 到 Visual Studio 2010 的 C++ 序列化

Visual C++ 2010 Express 不生成 DLL 文件

如何在 Visual Studio 2010 的 C++ googletest 项目中设置代码覆盖率

如何在Visual Studio 2010中使用C++“准”标准库 Boost 1.44.0

如何阻止 Visual C++ 在 MFC .rc 文件生成中使用本地机器区域设置?