Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 学习读取GCC汇编程序输出_C++_C_Gcc_Assembly - Fatal编程技术网

C++ 学习读取GCC汇编程序输出

C++ 学习读取GCC汇编程序输出,c++,c,gcc,assembly,C++,C,Gcc,Assembly,我正在考虑学习一些关于组装的基本知识。我目前的目标很简单:非常基本在为x86/x86-64使用-S开关编译C/C++时理解GCC汇编程序的输出 只需要做一些简单的事情,比如查看单个函数,验证GCC是否优化了我希望消失的东西 是否有人有/知道与GCC相关的、专门用于阅读目的的汇编简明介绍,以及随便阅读汇编的人应该知道的最重要说明的列表?我肯定有介绍性书籍和网站,但是学习它的一种非常有效的方法实际上是获取Intel引用,然后尝试用您最喜欢的高级语言做一些简单的事情(如整数数学和布尔逻辑),然后看看生

我正在考虑学习一些关于组装的基本知识。我目前的目标很简单:非常基本在为x86/x86-64使用-S开关编译C/C++时理解GCC汇编程序的输出

只需要做一些简单的事情,比如查看单个函数,验证GCC是否优化了我希望消失的东西


是否有人有/知道与GCC相关的、专门用于阅读目的的汇编简明介绍,以及随便阅读汇编的人应该知道的最重要说明的列表?

我肯定有介绍性书籍和网站,但是学习它的一种非常有效的方法实际上是获取Intel引用,然后尝试用您最喜欢的高级语言做一些简单的事情(如整数数学和布尔逻辑),然后看看生成的二进制代码是什么。

“随意阅读汇编”lol(很好)

我将在运行时在gdb中跟踪;你会对发生的事情有更好的感觉。但也许那只是我。它将为您反汇编一个函数(disass func),然后您可以单步执行它

如果您这样做仅仅是为了检查优化-不要担心

a) 编译器做得很好


b) 无论如何,您都无法理解它在做什么(没有人能够理解)

与高级语言不同,能够读取汇编和能够编写汇编之间没有太大区别(如果有的话)。指令与CPU操作码有一对一的关系——在保持对代码行功能的理解的同时,不需要跳过复杂度。(这不像是一种更高级的语言,您可以看到一行写着“print$var”,而不需要知道或关心如何将其输出到屏幕。)


如果你还想学习汇编,试试Jeff Duntemann写的那本书。

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

幸运的是,在英特尔公司,操作码是合理的。在我看来,PowerPC没有那么多。MIPS是我最喜欢的。对于MIPS,我借了邻居的小参考书;对于PPC,我有一些PDF格式的IBM文档,便于搜索。(对于英特尔来说,我主要是猜测,然后观察寄存器,以确保我猜对了!呵呵)


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

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

利用现有的所有资源,对x86汇编进行肤浅的理解应该很容易。这里有一个这样的资源:


您还可以使用disasm和gdb查看编译后的程序在做什么。

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

有时我发现优化后的代码更容易阅读,因为它注意到了冗余的地方,并将其更改为我将编写的代码。对于我自己,我知道这样做仅仅是为了检查优化是个好主意。原因是,每次我看到编译器实际上对情况X做了一些聪明的事情,我以后就不会花时间去思考了。avpx也有一个很好的观点。+1,这是一个好主意,我在gdb上的CW中添加了
disass func
。无论如何,请随意编辑我放在那里的内容。GCC使用AT&T语法作为输出有点复杂
MOV
不仅仅被称为
MOV
,而且操作数的顺序也不总是英特尔手册中列出的顺序。如果您是为x86编译,您可以使用编译器标志-masm=Intel将gcc转换为更像英特尔手册的输出程序集。您还没有指定您感兴趣的目标程序集语言。英特尔x86?PowerPC?我不同意(但不会因此而否决);理解摆在你面前的已知格式良好的东西和自己创建格式良好的代码要容易得多。能够阅读汇编肯定有助于/编辑/汇编,但能够阅读汇编与从头开始编写甚至微不足道的功能相差甚远。当人们用我学过的外语跟我说话时,我也许能听懂,但我肯定不能用一种格式良好的方式说!如果您执行GDB反汇编,您也可以对那里的英特尔语法使用
设置反汇编风格英特尔
。x86。。。明智的?那是新的