【问题标题】:Disassembling Simple Hello World program反汇编简单的 Hello World 程序
【发布时间】:2012-03-27 01:40:28
【问题描述】:

我编写了这个小 C++ 程序并构建了它(发布)

#include<iostream>
int main(){
     std::cout<<"Hello World";
     return 0;
}

当我反汇编它时,它有很多额外的代码(安全 cookie 等)。我相信 Visual Studio 正在添加所有这些。如何在没有任何额外信息的情况下编译该程序,以便易于理解其反汇编代码?

我知道汇编比较难,但我的意思是从 hello world c++ 程序中获取 hello world asm 代码。这可能吗?

【问题讨论】:

  • operator&lt;&lt; on std::cout 将需要大量空洞的机器代码。您不想手动执行此操作。
  • @zneak- 用 printf 在 C 中重新编译怎么样?
  • printf 可能是一种方法。尽管如此,i/o 通常使用汇编还是很乏味的。我将从计算简单事物并从 C 代码中使用它们的函数开始。
  • @zneak- 类似简单的加法?
  • 这可能是一个好的开始

标签: c++ c visual-studio-2010 assembly compiler-construction


【解决方案1】:

您从具有 &lt;iostream&gt; 的庞大代码库开始。您可能想要做的是完全避免使用运行时库。试试这样的:

#include <windows.h>

int main() {
    HANDLE stdout = GetStdHandle(STD_OUTPUT_HANDLE);
    WriteFile(stdout, "Hello world\n", 12, NULL, NULL);
    return 0;
}

在打开汇编列表的情况下编译它,这应该会给你一些“原始”的 Win32 代码。

【讨论】:

  • windows.h 不会添加任何额外的代码?并且Assembly列表有3个选项,选哪一个?
  • 所有 Windows 程序都与(至少)kernel32.dll 链接,所以不,包括&lt;windows.h&gt; 不会添加任何额外内容。不过,编译器仍会添加自己的启动代码。
  • @GregHewgill- 为汇编器输出选择哪个选项?还有kernel32.dll == windows.h? (题外话)
  • 我不确定您正在查看哪些选项。这些是什么? &lt;windows.h&gt; 标头包含从许多 Win32 DLL 导出的函数,包括 kernel32.dll 和许多其他函数。
  • Project Propeties-> Configuration-> C/C++-> Output Files->Assembler Output.. 并且有 1.No Listing(默认)2.Assembly-仅列出 3.Assembly With Machine Code 4.Assembly with Source Code 5.Assembly with Machine Code and Source code
【解决方案2】:

您可以在项目属性 -> 配置属性 -> 输出文件 -> 汇编器输出中生成汇编输出

这将让您看到您编写的代码的程序集。

拆解,你会得到一堆其他链接的东西。

【讨论】:

  • 我想学习反汇编..这就是为什么要走这条路(编译和反汇编)。还有在汇编器输出下选择哪个选项.. 有三个?
  • 拆解是一项机械任务。阅读和理解汇编代码,这是一个棘手的问题。为此,您不妨从编译器生成的代码开始。此外,C 代码生成的汇编代码比 C++ 更直接。此外,书籍是你的朋友——汇编语言不是你盯着它就能学会的东西。请先阅读。
  • @SevaAlekseyev- 先生,我已经阅读了一些汇编基础知识,并且想看一些真正的反汇编代码。
  • 你用什么拆机?
【解决方案3】:

要控制 Visual Studio 代码生成功能,请在 VS -> 属性 -> 配置属性 -> c/c++ -> 代码生成中单击您的项目。

不要忘记选择正确的构建配置(调试、发布等)。

可以通过使用缓冲区安全检查(默认为/GS)来删除安全cookie

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-13
    相关资源
    最近更新 更多