学习阅读GCC汇编程序输出

时间:2010-04-09 22:26:58

标签: c++ c gcc assembly

我正在考虑对装配有一些非常基本的了解。我目前的目标很简单:非常基本了解使用x86 / x86-64的-S开关编译C / C ++时的GCC汇编程序输出。

足以做一些简单的事情,例如查看单个函数并验证GCC是否优化了我希望消失的东西。

有没有人知道或者知道一个真正简明的汇编介绍,与GCC相关,特别是为了阅读的目的,以及任何随便阅读汇编的人都应该知道的最重要的指示清单?

6 个答案:

答案 0 :(得分:22)

您应该使用GCC的-fverbose-asm选项。它使编译器输出附加信息(以注释的形式),以便更容易理解汇编代码与原始C / C ++代码的关系。

答案 1 :(得分:21)

如果你正在使用gcc或clang,-masm = intel参数告诉编译器使用Intel语法而不是AT& T语法生成程序集,而--save-temps参数告诉编译器保存临时文件(从GCC调用目录中的预处理源,汇编输出,未链接的目标文件。

使用所有资源,可以轻松了解x86程序集。这是一个这样的资源:http://www.cs.virginia.edu/~evans/cs216/guides/x86.html

你也可以使用disasm和gdb来查看编译程序正在做什么。

答案 2 :(得分:3)

在面对新设备时,我经常搜索处理器文档,然后在遇到我不知道的操作时查找操作码。

在英特尔,谢天谢地,操作码有点明智。在我看来,PowerPC并没有那么多。 MIPS是我的最爱。对于MIPS,我借用了我邻居的小参考书,对于PPC,我有一些PDF文档可以方便地搜索。 (对于英特尔来说,大多数时候我猜,然后观察寄存器以确保我猜对了!嘿)

基本上,装配本身很容易。它基本上做了三件事:在存储器和寄存器之间移动数据,对寄存器中的数据进行操作,以及更改程序计数器。您选择的语言和程序集之间的映射需要一些研究(例如学习如何识别虚函数调用),为此,“集成”源和反汇编视图(就像您可以在Visual Studio中获得)非常有用。 / p>

答案 3 :(得分:2)

“随便阅读大会”大声笑(很好)

我会在运行时跟随gdb开始;你对发生的事情有了更好的感受。但那可能就是我。它会为你拆卸一个函数(disass func)然后你可以单步执行它

如果您只是为了检查优化而这样做 - 请不要担心。

a)编译器做得很好

b)你无论如何都无法理解它在做什么(没人能)

答案 4 :(得分:1)

与高级语言不同,能够读取汇编和能够编写汇编之间的差异确实不大(如果有的话)。指令与CPU操作码具有一对一的关系 - 没有复杂性可以跳过,同时仍然保持对代码行的作用的理解。 (它不像更高级别的语言,你可以看到一行“print $ var”,而不需要知道或关心如何将其输出到屏幕。)

如果你还想学习装配,请试试Jeff Duntemann的书Assembly Language Step-by-Step: Programming with Linux

答案 5 :(得分:0)

我确信那里有介绍性的书籍和网站,但是学习它的一种非常有效的方法实际上是获取英特尔参考,然后尝试在你喜欢的地方做简单的东西(比如整数数学和布尔逻辑)高级语言,然后查看生成的二进制代码是什么。