(&irq)[-1] 疑问?
arch/i386/kernel/irq.c, line 662~705:int request_irq(unsigned int irq,void (*handler)(int, void *, struct pt_regs *),
unsigned long irqflags,
const char * devname,
void *dev_id)
{
...
if (irqflags & SA_SHIRQ) {
if (!dev_id)
printk("Bad boy: %s (at 0x%x) called us without a dev_id!\n", devname, (&irq)[-1]);
}
...
}hi~ 关于(&irq)[-1],我的疑问是这样:
1. 某些优化级别,部分参数通过寄存器传递
2. 函数有不同的调用约定:
http://blog.csdn.net/jia_xiaoxin/article/details/2868216
这里没有考虑这些,直接就认为第一个参数前面就是caller的地址了。 本帖最后由 _nosay 于 2016-07-28 13:37 编辑
回复 1# _nosay #include <stdio.h>
void fun(int arg)
{
printf("called by 0x%x\n", (&arg)[-1]);
printf("called by 0x%x\n", (&arg));
}
void caller()
{
printf("caller %p\n", caller);// objdump
fun(0);
}
int main()
{
caller();
return 0;
}
xx@HP-xx:~/test/12$ gcc test.c -O0 -g -Wall
xx@HP-xx:~/test/12$ ./a.out
caller 0x400570 // 看后面objdump结果
called by 0xd4962e80// (&arg)[-1],每次执行不一样
called by 0xa0d1fd30 // (&arg),每次执行不一样
xx@HP-xx:~/test/12$ objdump -j .text -S a.outvoid caller()
{
400570: 55 push %rbp
400571: 48 89 e5 mov %rsp,%rbp
fun(0);
400574: bf 00 00 00 00 mov $0x0,%edi
400579: e8 af ff ff ff callq40052d <fun>
}
40057e: 5d pop %rbp
40057f: c3 retq
这是64位机器吧,在不优化的情况下,fun会把参数临时拷贝到栈上,&得到的是临时变量的地址(栈地址)。
386的代码假设第一个参数(最后一个压栈)上面是返回地址,这个似乎是合理的? 回复 3# nswcfd
嗯,我用的是64位系统。
页:
[1]