我不明白为什么要执行第8行,有人可以解释一下吗? 在第10行调用strcpy,但0x80482c4不包含任何对'hello world'的引用。 (用gdb检查)。我的想法是,esp指向“你好世界”的起始记忆地址。并且在调用strcpy时正在执行esp?我在第9行的猜测是它为“你好世界”设置了足够的空间。 char数组但在代码中它被初始化为20。
1. push ebp
2. mov ebp,esp
3. sub esp,0x38 // why does this happen?
4. and esp, 0xfffffff0
5. mov eax,0x0
6. sub esp,eax
7. mov DWORD PTR [esp+4],0x80484c4 //contains 'h'
8. lea eax,[ebp-40] // what is going on here? why ebp-40 bytes?
9. mov DWORD PTR [esp], eax
10. call 0x80482c4 <strcppy@plt>
11. lea eax,[ebp-40]
12. mov DWORD PTR [esp],eax
13. call 0x80482d4 <printf@plt>
14. leave
15. ret
C等价物: #包括 #include
int main() {
char str_a[20];
strcpy(str_a, "Hello, world!\n");
printf(str_a);
}
答案 0 :(得分:3)
0x80482c4不包含任何对“hello world&#39; (检查 GDB)
你一定检查错了。您可能只打印了第一个字母,即h
(或H
)。它肯定99%是您的hello world
字符串。
第3行正在为本地变量设置空间,编译器已选择将str_a
放在ebp-40
。 lea
只是加载该地址。
通常很难说为什么编译器会选择一个特定的堆栈布局,只要有足够的空间,它就不重要了。