我正在考虑学习一些汇编语言的基础知识。我的当前目标很简单:了解GCC编译C/C++时使用-S开关生成x86/x86-64汇编代码的基本概念。
我只需要掌握足够的技能,例如查看单个函数并验证GCC是否优化掉了我预期会消失的内容等简单操作。
有没有人有/知道一个真正简明扼要的汇编介绍,与GCC相关,并专门用于阅读目的,列出任何准备阅读汇编的人都应该掌握的最重要的指令清单?
我正在考虑学习一些汇编语言的基础知识。我的当前目标很简单:了解GCC编译C/C++时使用-S开关生成x86/x86-64汇编代码的基本概念。
我只需要掌握足够的技能,例如查看单个函数并验证GCC是否优化掉了我预期会消失的内容等简单操作。
有没有人有/知道一个真正简明扼要的汇编介绍,与GCC相关,并专门用于阅读目的,列出任何准备阅读汇编的人都应该掌握的最重要的指令清单?
您应该使用GCC的-fverbose-asm
选项。它会使编译器输出附加信息(以注释形式),从而更容易理解汇编代码与原始C/C++代码之间的关系。
遇到新设备时,我通常会查找处理器文档,并在遇到未知的操作码时进行查询。
在英特尔处理器上,操作码相对来说比较合理。而在我的看法中,PowerPC 的操作码则不太好理解。MIPS 是我最喜欢的处理器之一。对于 MIPS 处理器,我借了我的邻居的参考书,针对 PPC 处理器,我有一本 IBM 文档的 PDF 文件很方便查询。(对于英特尔处理器,我基本上是猜测然后观察寄存器以确保我的猜测是否正确!嘿嘿)
基本上,汇编本身并不难。它主要有三个功能:在内存和寄存器之间传递数据、在寄存器中操作数据以及更改程序计数器。将您所选择的语言与汇编语言进行映射需要一些学习(例如,学习如何识别虚拟函数调用),此时,“集成”的源代码和反汇编视图(例如在 Visual Studio 中可以获得的)非常有用。
与高级语言不同的是,能够阅读汇编语言和能够编写汇编语言之间几乎没有什么(如果有的话)区别。指令与 CPU 操作码之间存在一对一的关系 - 在保留对代码行所做操作的理解的同时,没有需要跳过的复杂性。(这不像高级语言中可以看到一个说“print $var”的行而不需要知道或关心它如何输出到屏幕。)
如果您仍然想学习汇编语言,请尝试 Jeff Duntemann 的书 Assembly Language Step-by-Step: Programming with Linux。
MOV
不仅仅被称为MOV
,而且操作数的顺序并不总是按照英特尔手册中列出的顺序。 - Michael Madsen“随便看汇编代码”哈哈(友好地)
我会从在运行时使用gdb开始;这样你可以更好地感受到正在发生的事情。然后也许这只是我的想法。它将为您反汇编一个函数(disass func),然后您可以逐步执行它。
如果您这样做仅仅是为了检查优化 - 不用担心。
a)编译器做得很好
b)无论如何,您都无法理解它在做什么(没有人能够理解)
disass func
:http://stackoverflow.com/questions/2588853/the-community-driven-gdb-primer/2611474#2611474。请随意编辑我所写的内容。 - user257111