您将如何解释此拆卸清单?

问题描述 投票:0回答:1

我在单独的文件string.c中有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

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

c x86-64 disassembly
1个回答
1
投票

此命令

lea    0x0(%rip),%rax

将字符串文字的地址存储在寄存器ax中。

和此命令

mov    %rax,-0x8(%rbp)

将地址从寄存器ax复制到分配的堆栈存储器中。从堆栈-0x8中的偏移量可以看到,该地址占用8个字节。

此后函数将丢弃分配的内存

pop    %rbp

并退出

retq
© www.soinside.com 2019 - 2024. All rights reserved.