函数指针与汇编

typedef double (*PTRFUN)(int);   
PTRFUN pFun;   
double glFun(int a){ return a*2.4;}   
int main()   
{   
    pFun = &glFun;
    (pFun)(2);   
    (*pFun)(2);
    (glFun)(2);
    (&glFun)(2);   
}   

main 函数中的几行 汇编对应如下

 mov    QWORD PTR [rip+0x2ef7],0x401102        # 404030 <pFun>
 mov    rax,QWORD PTR [rip+0x2ef0]        # 404030 <pFun>
 mov    edi,0x2
 call   rax
 mov    rax,QWORD PTR [rip+0x2ee2]        # 404030 <pFun>
 mov    edi,0x2
 call   rax
 mov    edi,0x2
 call   401102 <glFun(int)>
 mov    edi,0x2
 call   401102 <glFun(int)>

可以看出,使用函数名glFun和函数名自身的指针glFun,或者是指向函数名的指针,pFun或者Pfun都没有问题。编译器都会自动地将函数调用转为函数指针的调用。

而因为RIP是指向指令的地址。因此随着RIP的执行,调用pFun,这个全局指针变量的偏移也会逐渐减小。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值