assembly 数据字符串位于此反汇编中的何处?

yeotifhr  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(94)

我正在浏览Nick Blundell的OS-dev书籍,并在5.1.4节中反汇编代码。
具体来说,我将以下c代码存储在string.c中:

void my_function()
{
    char* str = "Hello";
}

字符串
我在32位模式下编译它(因为我在64位Linux上),如下所示:
gcc -ffreestanding -fno-pie -m32 -c string.c -o string.o
连接步骤:
ld -m elf_i386 -o string.bin -Ttext 0x0 --oformat binary string.o
和拆卸:
ndisasm -b 32 string.bin > string.dis
这是我的结果:

00000000  55                push ebp
00000001  89E5              mov ebp,esp
00000003  83EC10            sub esp,byte +0x10
00000006  C745FC00100000    mov dword [ebp-0x4],0x1000
0000000D  90                nop
0000000E  C9                leave
0000000F  C3                ret


我看到编译器在第三行分配了16个字节,但我没有看到“hello”字符串的位置。我不明白第四行发生了什么。
如果你能帮忙的话,我将不胜感激。

eanckbw9

eanckbw91#

0x1000
不要在代码段中查找字符串。他们不在那里。唯一不属于序言或尾声的指令是mov dword [ebp-0x4],0x1000;这显然是将局部变量str设置为0x1000。我们知道str指向字符串。
字符串不在文本段中。他们是在rodata部分。你是否在链接时省略了rodata段?
(You编译在-O 0。因此,没有删除无效代码变量赋值。)

相关问题