【发布时间】:2019-12-22 23:34:25
【问题描述】:
这是main的汇编代码:
push %rbp
mov %rsp,%rbp
sub $0x20,%rsp
mov %edi,-0x14(%rbp)
mov %rsi,-0x20(%rbp)
mov -0x20(%rbp),%rax
add $0x8,%rax
mov (%rax),%rax
mov %rax,%rdi
callq 0x510 <atoi@plt>
mov %eax,-0x4(%rbp)
mov -0x4(%rbp),%edx
mov -0x14(%rbp),%eax
mov %edx,%esi
mov %eax,%edi
callq 0x63a <sub>
leaveq
retq
这里是C对应的代码:
#include <stdlib.h>
int sub(int x, int y){
return 2*x+y;
}
int main(int argc, char ** argv){
int a;
a = atoi(argv[1]);
return sub(argc,a);
}
我相信它会在堆栈中分配 20 位,然后它将参数的值从右到左推入 rbp - 14 和 rbp - 20,对吗?为什么需要20位?以及为什么 0x8 被添加到 rax 中?
【问题讨论】:
-
不可能按位分配任何东西。这里只是减去 0x20。这是对指针的操作,所以这是 32 个字节。这可能被认为是局部变量的空间。不能告诉你为什么它是 32 字节,但也许它有一点帮助。
-
您忘记启用优化。试图找出未优化代码的细节通常没有用处。由于对齐,通常为 16 个字节,如果省略帧指针,则为 8 个字节。
0x8是因为你引用了argv[1]并且指针是 8 个字节。