(&arp)[-一] 是什么意思
(&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 也可以看出是想打印函数的调用者出来.
上下文大致是这样的, 不一定准确:
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 也可以看出是想打印函数的调用者出来.