荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Mic (不要变,行不行), 信区: Virus
标  题: 四、一个简单的Win32汇编语言程序
发信站: 荔园晨风BBS站 (Fri Jun  1 07:48:47 2001), 转信

是一大堆难以看懂又不直观的指令,而且不结构化,大量的标号、无条件跳转指令
(JMP)和条件跳转指令让你难以看懂程序;过程(或者函数)的调用参数传递又
不直观,要么直接使用寄存器传递参数,不符合结构化程序设计原则;要么使用堆
栈传递参数,又不能有效地检验参数类型……想必Win32汇编语言更麻烦吧!还好,
MASM 6.0以上版本的汇编器提供了很多结构化汇编语言伪指令,可以方便地实现汇
编语言结构化程序设计,当你看完本教程以后,你可能会感觉到:Win32汇编语言
并不比C语言麻烦多少。(如果读者看不懂本教程中的汇编语言源程序也不要紧,
可以对照MASM 6.11的帮助看)
和C语言Win32编程需要WINDOWS.H头文件和其他Win32 API定义头文件定义常量、数
据结构和API一样,Win32汇编语言也需要包含文件(INC文件)定义常量、数据结
构和API。不过笔者找了很长时间也没有找到一个完整的可用于Win32汇编语言的
WINDOWS.INC文件或者WIN32.INC文件(倒是找到了用于Win16汇编语言的WINDOWS.
INC文件),Turbo MASM 5.0中提供的WIN32.INC文件也不完整,只能用于自带的
WAP32例子程序,而且与MASM 6.11不太兼容(听说NASM中有完整的WIN32.INC文件,
可惜没有找到,也不知道与MASM 6.11是否兼容)。笔者只好自己定义常量、数据
结构和API(根据WINDOWS.H头文件和其他Win32 API定义头文件定义),不过这倒
带来了不少好处——可以更好地了解Win32汇编语言的编程方法和原理。
笔者编写了一个简单的Win32汇编语言程序,该程序的功能很简单:在屏幕上显示
一个消息框。本程序只调用了两个API函数:MessageBox函数和ExitProcess函数,
程序如下:
包含文件(MSGBOX.INC):
UINT TYPEDEF DWORD
LPSTR TYPEDEF PTR BYTE
LPCSTR TYPEDEF LPSTR
PVOID TYPEDEF PTR
HANDLE TYPEDEF PVOID
HWND TYPEDEF HANDLE
MB_ICONINFORMATION = 00000040h
MB_OK = 00000000h
MessageBoxA PROTO stdcall, :HWND,:LPCSTR,:LPCSTR,:UINT
ExitProcess PROTO stdcall, :UINT
源程序(MSGBOX.ASM):
.386p
.386p
.MODEL flat,stdcall
INCLUDE MSGBOX.INC
.STACK 4096
.DATA
WindowTitle BYTE 'MsgBox',0
Message1 BYTE 'This is a simple MessageBox
Win32 application.',0
.CODE
_start:
INVOKE MessageBoxA,0,ADDR Message1,ADDR WindowTitle,
MB_ICONINFORMATION or MB_OK
INVOKE ExitProcess,0
PUBLIC _start
END
END
汇编连接本程序的命令如下:
ml /c /coff /Cp msgbox.asm
link /subsystem:windows /entry:_start msgbox.obj kernel32.lib user32.lib
汇编命令中的/c选项表示只汇编,不自动连接;/coff选项表示生成COFF格式的OBJ
文件(如果使用Borland的连接器不能使用/coff参数);/Cp选项表示标识符区分
大小写。连接命令中/subsystem:windows选项表示连接器生成普通Windows可执行
文件;/entry:_start选项表示程序入口点是_start标识符。连接时连接KERNEL32.
LIB和USER32.LIB引入库。
运行汇编连接后生成的MSGBOX.EXE文件,屏幕上将显示出一个消息框,消息框的标
题是“MsgBox”,消息框中的字符串是“This is a simple MessageBox Win32
application.”。
Win32汇编语言源程序应该由.386p伪指令和.MODEL flat,stdcall伪指令开始,指
示汇编器汇编386保护模式指令,并使用平坦内存模式(Win32内存模式)和
stdcall函数调用方式(Win32标准函数调用方式)。
PROTO伪指令定义函数原型(与C语言中函数原型的定义相似),可以定义函数名、
调用方式和参数,INVOKE伪指令调用由PROTO伪指令定义的函数,可以方便地传递
参数和检查参数类型。MSGBOX.INC文件中使用PROTO伪指令定义API函数,MSGBOX.
ASM文件中使用INVOKE伪指令调用API函数,可见MASM 6.0以上版本的汇编器提供的
结构化汇编语言伪指令大大简化了Win32汇编语言编程(本程序一条汇编语言指令
也没有用到)。
本程序调用了MessageBox函数显示消息框以后,调用了ExitProcess函数终止程序
的执行,ExitProcess函数的作用是终止当前进程。

这个例子我在以前谈到过,现在有详细说明

--
           ┏─┓          ┏─┓                          ┏─┓
           │┏┴┓        │邪├┓         ┏─┓       ┏┴┓│
           ┗┤东├╮      ┗┬┛│       ┏┤西│       │毒├┛
             ┗─┛╰╮      ┗┬┛       │┗┬┛       ┗┬┛
     ╭╭──────╯╭╭──╯         ┗─┛        ╰──╯     Mic@virus
     ╰╰────────╰──────────── ────────── ─ ─

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.28.108]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店