理解汇编语言lea指令

时间:2015-06-25 09:50:25

标签: assembly

我不明白为什么要执行第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);
}

1 个答案:

答案 0 :(得分:3)

  

0x80482c4不包含任何对“hello world&#39; (检查   GDB)

你一定检查错了。您可能只打印了第一个字母,即h(或H)。它肯定99%是您的hello world字符串。

第3行正在为本地变量设置空间,编译器已选择将str_a放在ebp-40lea只是加载该地址。

通常很难说为什么编译器会选择一个特定的堆栈布局,只要有足够的空间,它就不重要了。