我在单独的文件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
我对这个清单不了解。 《从头开始写操作系统》一书讲述了一些有关旧的反汇编的内容,并稍微揭开了神秘的面纱,但是它们的清单完全不同,我什至没有看到数据像作者所说的那样被解释为代码。
此命令
lea 0x0(%rip),%rax
将字符串文字的地址存储在寄存器ax
中。
和此命令
mov %rax,-0x8(%rbp)
将地址从寄存器ax
复制到分配的堆栈存储器中。从堆栈-0x8
中的偏移量可以看到,该地址占用8个字节。
此后函数将丢弃分配的内存
pop %rbp
并退出
retq