【问题标题】:It's about understanding of assembly language of GCC这是关于对GCC汇编语言的理解
【发布时间】: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?。 (其中很多是目标文件元数据和展开信息。)我很惊讶地看到endbr64 CFE instruction,我猜 Ubuntu 配置 GCC 与某些发行版不同。通常你只会在 CRT 和库函数中看到它。
  • 当您阅读汇编程序和指令集的文档时,您不了解这些文档的哪些部分。
  • 感谢大卫和彼得。目前我只想了解这段代码的每一行。例如-> .file "prog_assembly.c" 这对操作系统意味着什么?与这条线相关的流程。能否请您简要解释一下?
  • .file "prog_assembly.c" 对操作系统没有任何意义。你不能执行这个文件,所以操作系统永远不会看到这个。该文件被发送到汇编程序,汇编程序将以点开头的行视为有关如何创建实际可执行文件的说明。如果您阅读我为您链接的文档,您会看到.file 的用途是在发出 DWARF2 行号信息时,.file 将文件名分配给 .debug_line 文件名表。 换句话说, 它用于创建调试期间使用的信息。

标签: assembly


【解决方案1】:
    movl    $45, -4(%rsp)   # The meaning copy 45 to rsp (current location in stack, growing downwards)
    movl    $0, %eax        # eax is zero
    ret

endbr64 指令可以查看here

注意:

  1. 立即值以$ 为前缀。
  2. 注册名称以%为前缀。
  3. l suffix = long(32 位整数或 64 位浮点)。

【讨论】:

  • -4(%rsp) 是当前 RSP低于 4 个字节,位于红色区域。不是“将 45 复制到 rsp”,它要么是 mov $45, %rsp,它会破坏堆栈指针,要么是 mov $45, (%rsp),它会覆盖返回地址,也会破坏 ret。如果您要描述指令的作用,请不要忽略寻址模式的某些部分!对于不得不提出这个问题的人来说,这可能并不明显。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 2014-09-03
  • 2021-09-09
相关资源
最近更新 更多