【问题标题】:How to read Assembly output generated by Visual C++ 2010?如何读取 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的声明不涉及任何指令。它只是让编译器确保它在堆栈中标记相同的地址内存。

标签: c++ windows visual-studio-2010 assembly


【解决方案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 寄存器。该寄存器指向堆栈。所以我认为你可以假设指令是唯一的指令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多