【发布时间】:2020-04-21 16:51:31
【问题描述】:
我正在尝试了解由 gcc(Ubuntu 9.2.1-9ubuntu2) 9.2.1 20191008 生成的程序集。
我写过简单的c代码。
#include<stdio.h>
int main()
{
volatile int a;
a=45;
return 0;
}
并遵守命令-gcc -S -O -o prog_assembly.asm prog_assembly.c
我得到了组装
.file "prog_assembly.c"
.text
.globl main
.type main, @function
main:
.LFB23:
.cfi_startproc
endbr64
movl $45, -4(%rsp)
movl $0, %eax
ret
.cfi_endproc
.LFE23:
.size main, .-main
.ident "GCC: (Ubuntu 9.2.1-9ubuntu2) 9.2.1 20191008"
.section .note.GNU-stack,"",@progbits
.section .note.gnu.property,"a"
.align 8
.long 1f - 0f
.long 4f - 1f
.long 5
0:
.string "GNU"
1:
.align 8
.long 0xc0000002
.long 3f - 2f
2:
.long 0x3
3:
.align 8
4:
我想了解每个汇编语句。我在哪里可以找到包含所有信息的文件?
【问题讨论】:
-
gnu 汇编器的文档是here。这应该会让你得到所有以点开头的东西。你不熟悉 x86 汇编语言吗?谷歌可以为您找到许多参考资料。
-
其中大部分是“噪音”,您实际上不需要了解它就可以了解汇编语言的工作原理。见How to remove "noise" from GCC/clang assembly output?。 (其中很多是目标文件元数据和展开信息。)我很惊讶地看到
endbr64CFE instruction,我猜 Ubuntu 配置 GCC 与某些发行版不同。通常你只会在 CRT 和库函数中看到它。 -
当您阅读汇编程序和指令集的文档时,您不了解这些文档的哪些部分。
-
感谢大卫和彼得。目前我只想了解这段代码的每一行。例如-> .file "prog_assembly.c" 这对操作系统意味着什么?与这条线相关的流程。能否请您简要解释一下?
-
.file "prog_assembly.c" 对操作系统没有任何意义。你不能执行这个文件,所以操作系统永远不会看到这个。该文件被发送到汇编程序,汇编程序将以点开头的行视为有关如何创建实际可执行文件的说明。如果您阅读我为您链接的文档,您会看到
.file的用途是在发出 DWARF2 行号信息时,.file 将文件名分配给 .debug_line 文件名表。 换句话说, 它用于创建调试期间使用的信息。
标签: assembly