汇编头文件(header files)在汇编语言编程中类似于高层语言中的头文件,它们通常包含宏定义、常量定义、数据结构定义、函数声明以及其他在多个汇编源文件中共享的代码;使用头文件可以提高代码的可维护性和可读性,并使代码更加模块化,最常见的汇编头文件扩展名.inc
,表示包含文件(include file)。
汇编头文件的使用方法
项目文件:这两个文件最好放一块,否则源文件在指定的时候还需要写路径。
头文件:source.inc 源文件:source.asm
source.inc代码
.586
.model flat,stdcall
option casemap:none
includelib Kernel32.lib
includelib User32.lib
MessageBoxA proto hWndx:DWORD,lpText:Byte,lpCaption:Byte,uType:DWORD
ExitProcess proto nCode:DWORD
szText db 'Message',0
szCaption db 'Hello World!',0
代码功能:
①定义编译选项和环境:通过.586
, .model flat,stdcall
和option casemap:none
设置编译选项。
②链接必要的库文件:通过includelib
指令链接Kernel32和User32库,以便使用这些库中的函数。
③声明Windows API函数的原型:声明了MessageBoxA
和ExitProcess
函数的原型,使得在后续代码中可以直接调用这些函数。
④定义数据变量:定义了两个字符串变量szText
和szCaption
,用于消息框的内容和标题。
source.asm代码
include source.inc
.code
main procpush 0push offset szTextpush offset szCaptionpush 0call MessageBoxA
push 0call ExitProcess
main endp
end
include source.inc
:包含一个名为source.inc
的头文件;假设source.inc
中定义了必要的宏、常量、数据段和函数原型;在包含了这个头文件后,就可以去call
调用在头文件中声明了的MessageBoxA
和ExitProcess
函数(Win32 API)。
代码功能:
①显示消息框:调用Windows API函数MessageBoxA,显示一个标题为"Hello World!"、内容为"Message"的消息框。 ②退出程序:调用Windows API函数ExitProcess,以退出代码0(正常退出)终止程序。
代码执行结果:
但是Win32 API非常多,若每个要用到的API都需要自行声明且需要编辑函数对应的参数这未免也太麻烦了,那么此时我们可以使用MASM32 SDK
软件开发工具包来配合Win32程序开发。
MASM32 SDK
MASM32 SDK(Microsoft Macro Assembler 32-bit Software Development Kit)是一个软件开发工具包,包含了Microsoft Macro Assembler(MASM)、链接器、库、示例代码和文档,专为开发32位Windows应用程序而设计。
MASM32 SDN安装
下载地址:Download The MASM32 SDK
下载后得到压缩包,解压缩后可以得到一个安装程序;
双击运行:点击install
安装;
选择安装的盘符,文件不大可以想安装在哪个盘就安装在哪个盘:
选择后,接下去的窗口都默认选择yes
/确认
;接着这边直接Extract
:
后续几个窗口也是直接点击确认
、Yes
、OK
:
至此安装完成,masm32
默认的安装路径为盘符:/masm32
,而在默认路径中的include路径中就存放着我们需要的Win32 API
函数的头文件;
若此时要使用这些头文件那么首先需要在项目属性页中添加对应的头文件路径
接着我们需要将在代码中使用到的头文件复制到项目文件夹中,最好与程序代码放在同一个文件夹下(否则在使用include
进行头文件包含时需要指定路径);如果此时我需要用到Windows.inc
、User32.inc
、Kernel32.inc
头文件,直接复制过来即可。
invoke指令
这个时候若要调用MessageBoxA
、ExitProcess
等API则直接使用invoke
指令直接调用即可:
invoke
指令是 Microsoft Macro Assembler (MASM) 中的一条高级指令,用于简化对函数的调用。invoke
指令会自动处理函数调用的参数传递和调用约定,使得代码更简洁和易读。
基本用法
invoke FunctionName, arg1, arg2, ..., argN
-
FunctionName
是要调用的函数名。 -
arg1, arg2, ..., argN
是传递给函数的参数。
在使用invoke指令对函数进行调用时就不需要与call
指令一样将参数压入栈内了,可以直接将参数跟再函数名后面即可。
使用示例:
此时项目中的文件
编辑:source.inc source.asm
source.inc
头文件中设置了编译选项、包含了必要的库和头文件,并定义了一些数据(字符串)。
.586
.model flat,stdcall
option casemap:none
;头文件包含声明
include Windows.inc
include User32.inc
include Kernel32.inc
;包含静态库
includelib Kernel32.lib
includelib User32.lib
.data
szText db 'wolvenc',0
szCaption db 'Hello World!',0
source.asm
include source.inc
.code
main procinvoke MessageBoxA,NULL,offset szCaption,offset szText,MB_OKinvoke ExitProcess,0
main endp
end
include source.inc
:包含头文件
①invoke MessageBoxA, NULL, offset szCaption, offset szText, MB_OK
:调用 Windows API 的 MessageBoxA
函数,显示一个消息框。
-
NULL
:消息框的父窗口句柄,表示没有父窗口。 -
offset szCaption
:消息框标题字符串的地址。 -
offset szText
:消息框中显示的文本字符串的地址。 -
MB_OK
:消息框的类型,表示带有“确定”按钮的消息框。
②invoke ExitProcess, 0
:调用 Windows API 的 ExitProcess
函数,以退出代码 0 退出程序。
代码段中使用 invoke
指令简化对 Windows API 函数 MessageBoxA
和 ExitProcess
的调用;这样写的好处是代码更简洁、易读,并且减少了出错的可能性。
代码执行结果: