【发布时间】:2010-07-11 13:29:37
【问题描述】:
这段代码 sn-p 是否在 ANSI C 中定义良好? 在我的系统(Linux x86_64)上,它似乎运行得很好并打印了一个地址,但它总是这样吗?例如。参数可能是通过寄存器传递的,而获取该参数的地址似乎不正确。
#include <stdio.h>
void foo(int a)
{
printf("%p\n", &a);
}
int main(void)
{
foo(42);
return 0;
}
编辑:看起来 GCC 会先将寄存器传递的值放入堆栈,然后再获取它的地址。
<foo>:
55 push rbp
48 89 e5 mov rbp,rsp
48 83 ec 10 sub rsp,0x10
89 7d fc mov DWORD PTR [rbp-0x4],edi
b8 1c 06 40 00 mov eax,0x40061c
48 8d 55 fc lea rdx,[rbp-0x4]
48 89 d6 mov rsi,rdx
48 89 c7 mov rdi,rax
b8 00 00 00 00 mov eax,0x0
e8 d8 fe ff ff call 4003c0 <printf@plt>
c9 leave
c3 ret
【问题讨论】: