装配拆卸

时间:2012-05-06 17:33:58

标签: c++ assembly

请在某人解释我为什么这么做时

dumpbin / disasm“C:\ simple_Win32.exe”>> “C:\用户\ Piter酒店\ myDump5.txt”

我无法看到我的例程的名称,但只能看到eax,ebx,mov和其他“not my”函数(预处理器宏等)。即在下面的示例中,我们将汇编代码与函数名称一起使用:

.text:00403D89     lea eax, [ebp+SystemTimeAsFileTime]
.text:00403D8C     push eax
.text:00403D8D     call ds:__imp__GetSystemTimeAsFileTime@4
.text:00403D93     mov esi, [ebp+SystemTimeAsFileTime.dwHighDateTime]
.text:00403D96     xor esi, [ebp+SystemTimeAsFileTime.dwLowDateTime]
.text:00403D99     call ds:__imp__GetCurrentProcessId@0
.text:00403D9F     xor esi, eax
.text:00403DA1     call ds:__imp__GetCurrentThreadId@0
.text:00403DA7     xor esi, eax
.text:00403DA9     call ds:__imp__GetTickCount@0
.text:00403DAF     xor esi, eax
.text:00403DB1     lea eax, [ebp+PerformanceCount]
.text:00403DB4     push eax
.text:00403DB5     call ds:__imp__QueryPerformanceCounter@4
.text:00403DBB     mov eax, dword ptr [ebp+PerformanceCount+4]
.text:00403DBE     xor eax, dword ptr [ebp+PerformanceCount]
.text:00403DC1     xor esi, eax
.text:00403DC3     cmp esi, edi
.text:00403DC5     jnz short loc_403DCE

然后如果我的代码是:

#include <iostream>

int Foo(int,int){return 4;}

int main(){
    //std::cout<<"\n\nHello.\n\n"<<std::endl;

    int i=Foo(2,4);
    int a=i;
    //system("pause");
return 0;
}

为什么我在这个代码exe中产生的汇编中找不到Foo? 我能在那里找到名字Foo吗?

2 个答案:

答案 0 :(得分:2)

Foo之类的名称不需要,并且不包含在生成的EXE中,因此在反汇编时不会显示 - 如果使用调试信息进行编译,则PDB和/或MAP文件将包含此类信息。在处理内部函数(如Foo)和从(系统)DLL导入的函数方面也存在差异 - 反汇编程序通常能够通过名称解析这些函数,同时需要调试信息“内部函数”。 / p>

答案 1 :(得分:2)

“汇编”意味着将一组人类可读的机器指令助记符转换为可以加载和执行的实际二进制数据。类似地,“反汇编”意味着将二进制代码转换为人类可读的一组机器指令助记符,熟练的程序员可以阅读并理解正在发生的事情。

也许您正在考虑将高级编程语言“编译”为机器代码;与此相反的是一个假想的 - 神奇的“反编译器”。一些反编译确实是可能的并且存在工具,但是对于任何给定的高级语言可以从一组编译的机器代码中恢复的数量总是存在限制,并且如果不深入理解几个编程层将会很难在任何事件中都能理解结果。

某些语言(如C#或Java)只能编译成一种相当高级的中间语言,这种语言更容易反编译和读取,但C ++通常不会以这种方式使用,而C ++编译器通常会产生最低级别的语言 - 级硬件机器代码。

相关问题