c - 您如何解释这个反汇编列表?

标签 c x86-64 disassembly

我有一个简单的 C 语言函数,位于单独的文件 string.c 中:

void var_init(){
    char *hello = "Hello";
}

编译:

gcc -ffreestanding -c string.c -o string.o

然后我使用命令

objdump -d string.o

查看反汇编列表。我得到的是:

string.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <var_init>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   48 8d 05 00 00 00 00    lea    0x0(%rip),%rax        # b <var_init+0xb>
   b:   48 89 45 f8             mov    %rax,-0x8(%rbp)
   f:   90                      nop
  10:   5d                      pop    %rbp
  11:   c3                      retq

我无法理解这个列表。 《从头开始编写操作系统》一书讲述了一些关于旧的反汇编的内容,并稍微揭开了其中的神秘面纱,但它们的 list 完全不同,我什至没有看到像作者所说的那样将数据解释为我的代码。

最佳答案

除了 @VladfromMoscow 的解释之外,我认为这可能对发布者了解编译为程序集时发生的情况而不是使用 objdump 来查看会有所帮助,因为这样可以更清楚地看到数据(IMO) RIP 相对寻址可能更有意义。

gcc -S x.s

产量

    .file   "x.c"
    .text
    .section    .rodata
.LC0:
    .string "Hello"
    .text
    .globl  var_init
    .type   var_init, @function
var_init:
.LFB0:
    pushq   %rbp
    movq    %rsp, %rbp
    leaq    .LC0(%rip), %rax
    movq    %rax, -8(%rbp)
    nop
    popq    %rbp
    ret
.LFE0:
    .size   var_init, .-var_init
    .ident  "GCC: (Alpine 8.3.0) 8.3.0"
    .section    .note.GNU-stack,"",@progbits

关于c - 您如何解释这个反汇编列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59781879/

相关文章:

c - 错误的宏定义导致 "Expected expression"错误

c - 为什么我的指针直接返回地址处的值?

linux - 在ubuntu中监视正在运行的程序的指令?

assembly - 用 LEA 指令减去寄存器?

c++ - 进程内存映射(Linux Windows)

c - C 中二维数组的内存分配

c++ - 为什么正在运行的程序的性能会随着时间的推移而变得更好?

assembly - riscv objdump 如何设置打印 x0-x31 寄存器名称而不是 abi 名称

macos - 为什么 otool 会截断我的反汇编输出?

.net - 部分反汇编 .net 可执行文件