函数指针调用和直接函数调用的反汇编对比

本文对比了直接函数调用与通过函数指针进行调用在x86汇编层面的区别。前者直接通过指令集调用函数,而后者则先将函数地址存储于变量中再间接调用。文中详细展示了两种调用方式的汇编代码,揭示了间接调用的具体过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文主要从x86汇编一级来查看函数调用和函数指针调用函数的差别。

具体看如下的两个函数:

void show()
{
	printf("success\n");
}

void showData(int a)
{
	printf("success data a = %d\n", a);
}

下面是两者汇编代码对比:

  18: 	show();
00411AAE E8 3D F6 FF FF   call        show (4110F0h) 
    19: 
    20: 	void (*ptrShow)() = show;
00411AB3 C7 45 F8 F0 10 41 00 mov         dword ptr [ptrShow],offset show (4110F0h) 
    21: 	ptrShow();
00411ABA 8B F4            mov         esi,esp 
00411ABC FF 55 F8         call        dword ptr [ptrShow] 
00411ABF 3B F4            cmp         esi,esp 
00411AC1 E8 84 F6 FF FF   call        @ILT+325(__RTC_CheckEsp) (41114Ah) 
    22: 
    23: 	showData(3);
00411AC6 6A 03            push        3    
00411AC8 E8 0E F7 FF FF   call        showData (4111DBh) 
00411ACD 83 C4 04         add         esp,4 
    25: 	void (*ptrShowData)(int a) = showData;
00411AD0 C7 45 EC DB 11 41 00 mov         dword ptr [ptrShowData],offset showData (4111DBh) 
    26: 	ptrShowData(3);
00411AD7 8B F4            mov         esi,esp 
00411AD9 6A 03            push        3    
00411ADB FF 55 EC         call        dword ptr [ptrShowData] 
00411ADE 83 C4 04         add         esp,4 
00411AE1 3B F4            cmp         esi,esp 
00411AE3 E8 62 F6 FF FF   call        @ILT+325(__RTC_CheckEsp) (41114Ah)

对比发现,采用函数指针的调用,采用间接调用的过程,即函数的地址首先存到一个变量中,再通过这个变量实现对函数的调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值