Win32汇编教程二 Win32汇编程序的结构和语法

原创 2000年12月15日 08:34:00

Win32汇编程序的结构和语法

--------------------------------------------------------------------------------

Win32ASM程序的结构和语法

让我们先来看看一个最简单的Win32汇编程序:


.386
.model flat, stdcall
option casemap :none ; case sensitive

include windows.inc
include kernel32.inc
includelib kernel32.lib

.data

szCaption db 'Win32汇编例子',0
szText db 'Win32汇编,Simple and powerful!',0

.code

start:
invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK
invoke ExitProcess,NULL

end start
这就是一个能执行的最简单的Win32汇编程序,下面我简单地介绍一下各部分的作用:

.386

这条语句和Dos下汇编是一样的,是告诉编译器我们要用到80386的指令集,因为32位汇编程序要用到32位的寄存器如eax,ebx等,所以这一句是必须的,当然,你也可以用.486,.586等,当用到特权指令时,还可以用 .386p,.486p等等。

.model flat,stdcall

.model告诉编译器程序的模式,编过Dos汇编的人可能知道在Dos程序的模式有tiny,small,...huge 等,它指定了程序内存寻址模式,在huge等模式下,内存寻址和子程序调用将用Far的格式,但在Win32汇编中,你只能使用一个模式即 flat 模式,因为对Win32程序来说,内存是连续的一个4GB的段,无所谓小或大的模式。而stdcall 告诉编译器参数的传递方式,在调用子程序时,参数是通过堆栈传递的,参数的传递方式有三种,stdcall,c 和 pascal,stdcall 指定了参数是从右到左压入堆栈的,比如说对一个Windows API 如 MessageBox,在手册中是如此定义的:

int MessageBox(

HWND hWnd, // handle of owner window
LPCTSTR lpText, // address of text in message box
LPCTSTR lpCaption, // address of title of message box
UINT uType // style of message box
);

那么在汇编中我们就可以这样调用它:


push uType
push lpCaption
push lpText
push hWnd
call MessageBox

大家要注意最右面的参数是最后一个进堆栈的,当然,我们不必这样麻烦的调用一个 API,因为Masm中的一个宏语句不但帮助我们完成了所有的压栈操作,还帮我们检查参数的个数是否正确,那就是 invoke 语句,我们可以把上面的语句换成 invoke MessageBox,hWnd,lpText,lpCaption,uType 就行了。如本程序中代入实际参数就成了 invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK。

include 语句

include 语句包含了一些系统的定义和API函说明,其中所有的Windows 数据结构定义和常量定义包含在 windows.inc 中,而其他 API函数的说明包含在 xxx.inc 中, 如查 Microsoft Win32 Programmer's Reference 知道 ExitProcess包含在kernel32.dll 中,那么我们就要在程序中包括 include kernel32.inc 和 includelib kernel32.lib语句,否则在编译时会出现 API 函数未定义的错误。而 MessageBox 在 user32.dll 中,那么我们就要在程序中包括 include user32.inc 和 includelib user32.lib语句

.data 或 .data?

指明了接下来是数据段,.data 定义了预定义的变量,.data?定义了未初始化的变量,两者的不同之处是 .data? 定义的变量并不占用 .exe 文件的大小,而是在程序执行时动态分配,所以开始是不指定初始值的数据可以放在 .data? 段中,如一个1K大小的缓冲区,放在 .data?中,程序将不会增加一个字节。

.code

指明了接下来是代码段,我们的所有代码都放在这里。最后的一句 start 语句指定了程序开始执行的语句。程序中的 ExitProcess 是一个标准的 Win32 API,对应 Dos汇编中的 int 20h 或 mov ah,4ch/int 21h,也就是程序退出。而 MessageBox 也是一个标准的 API,功能是在屏幕上显示一个消息框,具体的参数上面已经解释过了还有要注意的是 invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK 语句中, MB_OK 和 NULL 已经预定义在 Windows.inc 中。

Win32汇编教程二:Win32汇编程序的结构和语法

Win32ASM程序的结构和语法让我们先来看看一个最简单的Win32汇编程序:  .386 .model flat, stdcall ...
  • zhangkala
  • zhangkala
  • 2008年11月26日 15:14
  • 396

Win32汇编教程二 Win32汇编程序的结构和语法

2000年12月15日 08:34:00 Win32汇编程序的结构和语法------------------------------------------------------------...
  • softart
  • softart
  • 2007年10月27日 07:44
  • 201

Win32汇编语言学习笔记>>第二课:编写第一个Win32汇编程序

本节课主要是编译连接一段写好的代码: 程序运行如下: 代码: .386 .model flat,stdcall option casemap:none include C:\mas...
  • eldn__
  • eldn__
  • 2013年01月01日 12:33
  • 1331

利用纯汇编写一个WIN32的窗口程序

;ml /coff demo.asm /link /subsystem:windows /entry:main user32.lib kernel32.lib .486 .model flat,s...
  • cosmoslife
  • cosmoslife
  • 2016年07月08日 17:17
  • 898

win32汇编第一个窗口程序

窗口程序的运行过程 (1)得到应用程序的句柄(GetModuleHandle)。 (2)注册窗口类(RegisterClassEx),在注册之前,要填写RegisterClassEx的参数WNDCLA...
  • weixin_36796040
  • weixin_36796040
  • 2017年12月17日 20:06
  • 138

Win32汇编基础教程

Win32汇编教程之一Win32汇编的环境和基础1.32位环境简介  在Dos下编汇编程序,我们可以管理系统的所有资源,我们可以改动系统中所有的内存,如自己改动内存控制块来分配内存,自己修改中断向量表...
  • t0nsha
  • t0nsha
  • 2008年03月27日 16:38
  • 2442

Win32汇编教程三 一个简单的对话框 --- 兼谈资源文件的使用

--------------------------------------------------------------------------------Windows 的资源文件不管在Dos下...
  • ghj1976
  • ghj1976
  • 2000年12月15日 08:41
  • 1971

win32汇编入门了解(2)win32汇编基本结构

参考:http://book.51cto.com/art/200907/133040.htm (1)Summary win32汇编和8086或者单片机汇编,总体来说都是类似的,不同的汇编的...
  • gengshenghong
  • gengshenghong
  • 2011年11月28日 21:22
  • 1382

Win32学习笔记 - WNDCLASSEX结构体

typedef struct _WNDCLASSEX { UINT cbSize; //结构体的大小 ...
  • u011471873
  • u011471873
  • 2016年03月07日 20:54
  • 568

Windows 32位 汇编语法 [1] 模式与段

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; Sample code for ; by 罗云彬, h...
  • Cashey1991
  • Cashey1991
  • 2011年08月30日 17:07
  • 1415
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Win32汇编教程二 Win32汇编程序的结构和语法
举报原因:
原因补充:

(最多只允许输入30个字)