Win32程序是构筑在Win32 API基础上的。在Win32 API中,包括了大量的函数、结构和消息等,它不仅为应用程序所调用,也是Windows自身的一部分,Windows自身的运行也调用这些API函数。
Windows API的来历
==============
在DOS下,操作系统的功能是通过各种软中断来实现的。
如大家都知道int 21h是DOS中断,int 13h和int 10h是BIOS中的磁盘中断和视频中断。
当应用程序要引用系统功能时,要把相应的参数放在各个寄存器中再调用相应的中断,程序控制权转到中断中去执行,完成以后会通过iret中断返回指令回到应用程序中。
如DOS汇编下有下列语句:
mov ah,9 mov dx,offset szHello int 21h
这3条语句调用DOS系统模块中的屏幕显示功能,功能号放在ah中,9号功能表示屏幕显示,要输出到屏幕上的内容的地址放在dx中,然后去调用int 21h,字符串就会显示到屏幕上。
这个例子说明了应用程序调用系统功能的一般过程。
首先,系统提供功能模块并约定参数的定义方法,同时约定调用的方式,应用程序按照这个约定来调用系统功能。
在这里,ah中放功能号9,dx中放字符串地址就是约定的参数,int 21h是约定的调用方式。
下面来看看这种方法的不便之处。首先,所有的功能号定义是冷冰冰的数字,int 21h的说明文档是这样的:
Int 21 Functions:
00——Program termination
01——Keyboard input
02——Display output
03——AUX input
04——AUX output
05——Printer output
06——Direct console I/O
07——Direct STDIN input, no echo
08——Keyboard input, no echo
09——Print string
0A——Buffered keyboard input
0B——Check standard input status
再进入09号功能看使用方法:
Print string (Func 09)
AH = 09h
DS:DX -> string terminated by "$"
这就是DOS时代汇编程序员都有一厚本《中断大全》的原因,因为所有的功能编号包括使用的参数定义仅从字面上看,是看不出一点头绪来的。
另外,80x86系列处理器能处理的中断最多只能有256个,不同的系统服务程序使用了不同的中断号,这少得可怜的中断数量就显得太少了,结果到最后是中断挂中断,大家抢来抢去的,把好好的一个系统搞得像接力赛跑一样。
对于这些弱点,程序员们都有个愿望:系统功能如果能以功能名称作为子程序名直接调用就好了,参数也最好定义的有意义一点,这样一来写程序就会方便得多,编系统扩展模块也就不必老是担心往哪个中断上面挂了,最好能把上面int 21h/ah=9的调用写成下面这副样子:
call PrintString,addr szHello
终于,好消息出来了,Win32环境中的编程接口就是这个样子,这就是Windows API。
Windows API的简介
===============
Windows API 实际上是以一种新的方法代替了DOS中用软中断的方式。
和DOS的结构相比,Win32的系统功能模块放在Windows的动态链接库(DLL)中。
DLL是一种Windows的可执行文件,采用的是和 .exe文件同样的PE格式。
在PE格式文件头的导出表中,以字符串形式指出了这个DLL能提供的函数列表。
应用程序使用字符串类型的函数名指定要调用的函数。
实际上,Win32的基础就是由DLL组成的。Win32 API的核心由3个DLL提供,它们是:
- KERNEL32.DLL——系统服务功能。包括内存管理、任务管理和动态链接等。
- GDI32.DLL——图形设备接口。利用VGA与DRV之类的显示设备驱动程序完成显示文本和矩形等功能。
- USER32.DLL——用户接口服务。建立窗口和传送消息等。
当然,Win32 API还包括其他很多函数,这些也是由DLL提供的,不同的DLL提供了不同的系统功能。如使用TCP/IP协议进行网络通信的DLL是Wsock32.dll,它所提供的API称为Socket API;专用于电话服务方面的API称为TAPI(Telephony API),包含在Tapi32.dll中。所有的这些DLL提供的函数组成了现在所用的Win32编程环境。
摘自《Win32汇编教程》作者: 罗云彬