如何读取 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;
)。所以我想确保在阅读生成的汇编代码时我的以下假设是正确的:
【问题讨论】:
变量i
和j
的声明不涉及任何指令。它只是让编译器确保它在堆栈中标记相同的地址内存。
【参考方案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 项目中设置代码覆盖率