0

请有人能解释一下为什么当我这样做的时候

dumpbin /disasm "C:\simple_Win32.exe" >> "C:\users\piter\myDump5.txt"

我看不到我的例程的名称,只能看到 eax、ebx、mov 和其他“不是我的”函数(预处理器宏等)。即在下面的例子中,我们有汇编代码和函数名:

.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 吗?

4

2 回答 2

2

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

于 2012-05-06T17:36:58.107 回答
2

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

也许您正在考虑将高级编程语言“编译”成机器代码;与之相反的是一个假设的魔法“反编译器”。确实可以进行一些反编译,并且存在工具,但是对于任何给定的高级语言,您可以从一组已编译的机器代码中恢复多少总是有限制的,而且如果不深入了解几层编程,这将很难在任何情况下都能理解结果。

有些语言(如C#或Java)只编译成比较高级的中间语言,比较容易反编译和阅读,但C++通常不这样使用,C++编译器通常产生最低级别的硬件机器代码。

于 2012-05-06T17:39:01.923 回答