读书人

(amp;arp)[-一] 是什么意思

发布时间: 2013-07-08 14:13:00 作者: rapoo

(&arp)[-1] 是什么意思?
上下文大致是这样的, 不一定准确:

void func(int arp, ...)
{
...

xxx_log("... 0x%x called ....", (&arp)[-1], ...);

...
}

这里面的 (&arp)[-1] 是什么意思?
[解决办法]
这个是获取调用这个函数的代码的地址, 也就是这个函数的返回地址.

调用函数一般都会是这样:
push 最后一个参数
push 中间的参数
push arp; 第一个参数
call func
addr:
....

call func 这条指令会在跳转前把返回地址 addr 放到堆栈:

push addr;
jmp func;

由于堆栈向下增长, 所以 addr 在堆栈中的位置是第一个参数 arp 在堆栈中的位置 -4
(&arp)[-1] == *((&arp) - 1)
也就是 arp 的地址减去 4 后的位置的内容, 也就是 call 指令 push 的返回地址.

从内容 0x%x called 也可以看出是想打印函数的调用者出来.

读书人网 >C语言

热点推荐