从汇编角度理解Windows API的调用过程

基础介绍

我们在进行Windows编程的时候,经常会调用Windows API。在 Windows 程序中,调用 Windows 函数与调用 C 语言的库函数没有什么两样。
最主要的区别就是 C 语言库函数的机器代码会直接链接到你的程序代码中去,而 Windows 函数则是放到你的程序之外的 DLL 里。

每个 Windows 的 EXE 文件包含它所要用到的各个动态链接库以及库中的函数的引用地址。

当一个 Windows 程序被装入内存后,程序中的函数调用都被解析 DLL 函数入口的指针,同时这些被调用的函数也被装入内存。

当链接 Windows 程序以生存可执行文件时,一定得链接你的编程环境所提供的特殊的“导入库”。

用户态和内核态

我们知道Win32API的调用,都是从用户态到内核态的,也就是函数真正的实现在内核。
这里借图,不详细解释了。
在这里插入图片描述

从汇编角度看Windows API调用

以MessageBox为例:
MessageBox是一个比较常见的Windows API函数,从user32.dll中导出。

1.在程序里调用MessageBox。首先进行的操作就是压参,然后会call MessageBox,但这里我们可以看到call 的是一个地址,机器指令是FF 15,后面跟的是绝对地址(调用时后面直接跟的是函数地址,并且不需要主调函数来平衡堆栈)。
在这里插入图片描述
这个地址里的地址就是MessageBoxA的地址。<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值