理解汇编输出的教程/书籍

8

有时候理解从C或C++等高级语言中反汇编是很有用的。阅读一本关于汇编的书显然是了解编译器输出的必要部分,但在我的经验中,从头开始编写汇编代码与阅读和理解编译器生成的操作码是完全不同的事情。我知道的关于汇编的书并没有很好地涵盖这一部分,虽然我相信如果你曾经接触过汇编,则大多数是通过尝试理解编译器输出。

你知道如何解释编译器输出的深入教程(或者可能是书籍)吗?

我想到的是介绍常见的高级语言习惯用法以及它们如何被常见的编译器(msvc和gcc)翻译为汇编。


我认为你想要解释MZ exe文件。因此,请在Google中搜索MZ exe并遵循维基百科。 - Amir
3个回答

3

2

我通过在调试器的反汇编视图中单步执行学习了关于阅读x86汇编的所有知识。同时打开一个操作码参考是有用的,但说实话,大多数情况下你都可以不用它,因为只要编译器没有过度优化,你就可以从C源代码、变量内容等方面知道它实际上在做什么。

好吧,至少大部分东西是这样。


这也是我学习的方式,我所阅读过的唯一汇编“书籍”就是来自AMD和Intel的指令集和优化手册。在我看来,这种途径可以在许多层面上为你带来比任何书籍或2秒钟的教程更多的东西。 - Necrolis
@Necrolis:你比我付出了更多的努力:如果我的生命取决于它,我甚至不能编写x86汇编。但是,如果你只需要它来弄清楚优化器这次做了什么,那就无所谓了。 - Steve Jessop
我所学的有关汇编语言的一切都是在我还是孩子时,通过在TRS-80 Model 1上编程机器码学习的。 :) - John Dibling
@Necrolis:你能提供英特尔优化手册的链接吗?我非常想看看。 - John Dibling
有趣的是,我从未打算学习汇编语言编程,但自从学了以后,我已经在很多时候受益匪浅,最近一次就是在旧版VC编译器上使用x86的64位CAS :) @John:当然,这里是所有手册的链接:http://www.intel.com/products/processor/manuals/,特别是优化手册:http://www.intel.com/design/pentiumii/manuals/245127.htm - Necrolis

0
你可以编译一些C、C++文件并保留汇编输出(我想是选项-s),然后将生成的输出与源文件进行比较。这应该有助于你理解生成的汇编代码并识别重复模式(方法/函数调用、返回、循环、初始化等)。不要启用优化,这会转换生成的代码并使其更难理解。

我过去曾经进行了大量的教学实验,教授这种方法(请参见http://opensolaris.org/os/community/documentation/files/book.pdf,抱歉我有点自夸),并强烈建议:确实要使用优化,但不要使用最高级别的优化。这是因为未经优化的汇编代码充满了不必要的操作...而略微优化的代码更易于阅读。 - FrankH.
@FrankH:我发现编译器的作用比实际的优化级别更大,MSVC在优化谱两端都输出非常易读的代码,至少从我的角度来看是这样的。而GCC生成的代码似乎带有大量直接堆栈访问的混乱代码,也许我只是没有正确设置GCC的优化级别 :P - Necrolis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接