第七章Win32汇编语言程序设计 Windows系统具有风格一致的华丽图形用户界面、丰富的 API函数、设备无关性、多任务等特点而广泛流行。 Win32汇编的功能 0支持汇编语言程序调用32位 Windows api函数的功能 e支持类似C语言的高级语法和运算符 用Win32汇编语言可以容易地写出 Windows窗口应用程序。 在win32汇编环境下编写 Windows应用程序,可以充分利 用 Windows的高级特性,开发性能更高的应用软件和动态链 接库,而且可以从深层次理解 Windows运行机制和 Windows应 用程序的设计思路及方法。 7.1Win32汇编语言程序设计基础 在Win32环境下,应用程序可以寻址4GB空间。 next
第七章 Win32汇编语言程序设计 Windows系统具有风格一致的华丽图形用户界面、丰富的 API函数、设备无关性、多任务等特点而广泛流行。 Win32汇编的功能: 支持汇编语言程序调用32位Windows API函数的功能 支持类似C语言的高级语法和运算符 7.1 Win32汇编语言程序设计基础 在Win32环境下,应用程序可以寻址4GB空间。 用Win32汇编语言可以容易地写出Windows窗口应用程序。 在Win32汇编环境下编写Windows应用程序,可以充分利 用Windows的高级特性,开发性能更高的应用软件和动态链 接库,而且可以从深层次理解Windows运行机制和Windows应 用程序的设计思路及方法。 next
32位处理器寄存器结构: AH EAX BHBL EBX数据寄存器 CH CL ECX DH DL EDX 代码段寄存器 DS 数据段寄存器 堆栈段寄存器 附加段寄存器(并新增FS和GS) 0 SP ESP堆栈指针寄存器 BP EBP基址指针寄存器 ESI源变址寄存器 DI ED目的变址寄存器 IF EIP指令指针寄存器 FLAG EFLAG程序状态字寄存器 返回
EAX EBX ECX EDX 数据寄存器 FLAG AH BH CH DH AL BL CL DL SP BP SI DI IP CS DS SS ES 代码段寄存器 数据段寄存器 堆栈段寄存器 附加段寄存器(并新增FS和GS) ESP 堆栈指针寄存器 EBP 基址指针寄存器 ESI 源变址寄存器 EDI 目的变址寄存器 EIP 指令指针寄存器 EFLAG 程序状态字寄存器 31 15 0 16 0 31 15 0 31 15 0 32位处理器寄存器结构: 返回
个完整的Win32汇编语言源程序结构如下所示: 386 指定处理器指令集 mode flat. stdcall ;模式定义 option casemap. none;指定汇编选项 若干条 include语句>;包含AP函数和动态链接库头文件 stack 堆栈段大小] 定义堆栈段 d lata 数据段(定义初始化变量) end开始标号 源程序结束
一个完整的Win32汇编语言源程序结构如下所示: .386 ;指定处理器指令集 .model flat, stdcall ;模式定义 option casemap:none ;指定汇编选项 ;包含API函数和动态链接库头文件 .stack [堆栈段大小] ;定义堆栈段 .data ;数据段(定义初始化变量) .data? ;数据段(定义未初始化变量) .const ;定义常量段 .code ;定义代码段 end 开始标号 ;源程序结束
例7-1写一个经典的Win32 Hello程序。一个最简单的Win32汇 编语言源程序例子,说明Win32汇编语言源程序的框架结构。 386 ;指定处理器指令集 mode flat stdcall 模式定义 option casemap. none;指定汇编选项,区分大小写 include windows.inc 包含头文件和动态连接库 include user32. inc includelib user 32.lib example of hello x include kernel32 inc includelib kernel32.lib 你好!"in32世界! stack 100 data 确定 sztitle db example of hello.0 szgreet db′你好!Win32世界!’,0 code start: invoke Message Box, NULL, addr szgreet, addr sztitle MB ICONINFORMatiOn or MB OK Invoke ExitProcesS. NULL end start
例7-1 写一个经典的Win32 Hello程序。一个最简单的Win32汇 编语言源程序例子,说明Win32汇编语言源程序的框架结构。 .386 ;指定处理器指令集 .model flat, stdcall ;模式定义 option casemap :none ;指定汇编选项,区分大小写 include windows.inc ;包含头文件和动态连接库 include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib .stack 100 .data sztitle db ’ example of hello’ ,0 szgreet db ’你好!Win32世界!’ ,0 .code start : invoke MessageBox, NULL, addr szgreet, addr sztitle,\ MB_ICONINFORMATION or MB_OK invoke ExitProcess, NULL end start next
model flat 定义了 model flat平展模式后,MASM将自动产生下面 的语句,指定各段寄存器与段的关系 ASSUME cS: flat, ds: flat, ss: flat, es: falt, fs error, gs: error 源程序结构中的分段不再是DOS汇编中的段定义概念,而 是逐段连续分配各段地址空间,上一段结束就是下一段的开 始 Wwin32环境汇编语言编程接口就建立在Win32API基础上。 Win32API的核心是3个动态链接库(d): (1)kernel32. dll 提供系统服务功能,包括内存管理、任务管理和动态链接等。 (2)user 32. dll 提供用户接口服务功能,包括创建窗口和传递消息等 (3)gdi32. dll 提供图形设备接口,实现文本及图形的显示操作。返回
.model flat 定义了.model flat 平展模式后,MASM将自动产生下面 的语句,指定各段寄存器与段的关系: ASSUME cs:flat,ds:flat,ss:flat,es:falt, fs:error, gs:error Win32环境汇编语言编程接口就建立在Win32 API基础上。 Win32 API的核心是3个动态链接库(dll): (1)kernel32.dll 提供系统服务功能,包括内存管理、任务管理和动态链接等。 (2)user32.dll 提供用户接口服务功能,包括创建窗口和传递消息等。 (3)gdi32.dll 提供图形设备接口,实现文本及图形的显示操作。 返回 源程序结构中的分段不再是DOS汇编中的段定义概念,而 是逐段连续分配各段地址空间,上一段结束就是下一段的开 始
Message Box()的原形声明如下: int Message Box( HWND hwnd ∥父窗口句柄 LPCTSTR IpText 将显示在消息框中的字符串 LPCTSTR IpCaption∥消息对话框的标题 UINT uType ∥消息对话框的风格) invoke函数名[,参数1[,参数2] invoke MessageBox, NULL, addr szgreet, addr sztilte, MB OK 上述调用在汇编语言程序中汇编为如下指令: pu MB OK pu settle push szgreet push NULL ca Message Box 返回
invoke 函数名 [,参数1] [,参数2] invoke MessageBox, NULL, addr szgreet, addr sztilte, MB_OK 上述调用在汇编语言程序中汇编为如下指令: push MB_OK push sztitle push szgreet push NULL call MessageBox MessageBox( )的原形声明如下: int MessageBox( HWND hwnd, //父窗口句柄 LPCTSTR lpText, //将显示在消息框中的字符串 LPCTSTR lpCaption //消息对话框的标题 UINT uType //消息对话框的风格 ); 返回
void Exit Process uiNT uExitCode / exit code for all threads invoke ExitProcess. NULL 返回
invoke ExitProcess,NULL void ExitProcess( UINT uExitCode // exit code for all threads ); 返回
7.2Win32的基本语法(以下章节暂为教案) 7.2.1标号和变量 (1)标号 win32汇编将标号的作用域局限于子程序范围内。 (2)变量 全局变量和局部变量、变量的类型 获取变量的地址:获取全局变量和局部变量地址的操 作方法不同。 7.22子程序设计 子程序的定义和说明 Win32汇编中的子程序都采用堆栈来传递参数,参数的 存放位置、顺序有一定的规则,为 invoke伪指令进行参数 的语法检查和子程序调用提供了有利条件。 (2)参数传递和堆栈平衡
7.2 Win32的基本语法 (以下章节暂为教案) 7.2.1 标号和变量 ( 1)标号 Win32汇编将标号的作用域局限于子程序范围内。 (2)变量 全局变量和局部变量 、变量的类型 获取变量的地址:获取全局变量和局部变量地址的操 作方法不同。 7.2.2 子程序设计 (1) 子程序的定义和说明 Win32汇编中的子程序都采用堆栈来传递参数,参数的 存放位置、顺序有一定的规则,为invoke伪指令进行参数 的语法检查和子程序调用提供了有利条件。 (2)参数传递和堆栈平衡
Win32中子程序的语言类型约定是 Stdcall,堆栈平衡操 作由子程序完成。 7.23高级语法 MASM60以上的版本新引入了一系列实现高级语法的伪指 令,其语句形式和功能与常见的高级语言类似,使得汇编语 言程序的可读性和编程方便性提高到了高级语言的水平。 1)运算符与条件表达式 (2)分支语句 (3)循环语句 7.2.4建立Win32汇编的编程环境 MASM6.10以上版本支持Win32汇编。下面介绍两种形式 的常用编程环境:命令行编程环境或集成开发环境(E Integrated Develop Enviroment) (1)命令行编程环境 (2)集成开发环境 next
Win32中子程序的语言类型约定是StdCall,堆栈平衡操 作由子程序完成。 7.2.3 高级语法 MASM 6.0以上的版本新引入了一系列实现高级语法的伪指 令,其语句形式和功能与常见的高级语言类似,使得汇编语 言程序的可读性和编程方便性提高到了高级语言的水平 。 (1)运算符与条件表达式 (2)分支语句 (3)循环语句 7.2.4 建立Win32汇编的编程环境 MASM 6.10以上版本支持Win32汇编。下面介绍两种形式 的常用编程环境:命令行编程环境或集成开发环境(IDE Integrated Develop Envirroment)。 (1)命令行编程环境 (2)集成开发环境 next
例7-2:用高级语法语句 WHILE循环完成计算:11+2+3!=9 data szmess db n=0. 0 sztitle db 'WHILE examples, 0 n dd result dd 0 code WHILE examples start mov ecX mov eaX while ecx<=n 确定 mul ecx Inc ecX add result. eax mov eax, result mov dial add szmess +9. dl invoke MessageBox. NULL, addr szmess, addr sztitle B OK invoke ExitProcess. 0 end start 返回
.data szmess db ‘n!=0 ',0 sztitle db 'WHILE examples', 0 n dd 3 result dd 0 .code start: mov ecx,1 mov eax,1 .while ecx<=n ;WHILE循环 mul ecx inc ecx add result,eax .endw mov eax,result mov dl,al add szmess+9,dl invoke MessageBox,NULL,addr szmess,addr sztitle, B_OK invoke ExitProcess,0 end start 例7-2: 用高级语法语句WHILE循环完成计算: 1!+2!+3!=9 返回