masm32汇编基础

mac2024-12-10  26

写在前面的话

笔者机器环境:Win10 + VS2017

环境配置参考:https://moddemod.blog.csdn.net/article/details/102858284

.386 .model flat, stdcall option casemap:none MessageBoxA PROTO :dword, :dword, :dword, :dword MessageBox equ <MessageBoxA> Includelib user32.lib NULL equ 0 MB_OK equ 0 .stack 4096 .data SzTitle byte 'test!', 0 SzMsg byte 'welcome to moddemod!', 0 .code start: invoke MessageBox, NULL, offset SzMsg, offset SzTitle, MB_OK ret end start

或者

.386 .model flat, stdcall option casemap:none include windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib ; 数据段 .data szText db 'HelloWorld', 0 ; 代码段 .code start: invoke MessageBox, NULL, offset szText, NULL, MB_OK invoke ExitProcess, NULL end start

.386语句,定义了程序使用80386指令集

.model flat,stdcall 这里指定内存模式为flat模式。因为Windows操作系统和应用程序运行在保护模式下,系统每一个Windows可执行程序都都放在一个虚拟地址空间中运行,每个程序都拥有相互独立的4G地址空间。因此,Windows可执行程序只有一种内存模式,即flat模式,表示内存是很"平坦"的,不再像DOS可执行程序那样,必须把超过64KB的一块内存划分为几个小的、不超过64KB的段来使用。 .model语句还应该指定调用规则,WindowsAPI使用stdcall调用规则,因此这里选择stdcall。使用stdcall规则调用子程序时,堆栈平衡的事情由被调用者(子程序)用RETn指令实现,因此,在程序中调用WindowsAPI函数或子程序后,调用者不必考虑堆栈平衡的问题。

options语句有许多选项,例如option language、option segment等,在Win32中需要定义option casemap:none,用以说明程序中的变量和子程序名对大小写敏感。由于WindowsAPI中的函数名称是区分大小写的,所以应该指定选项"casemap:none",否则,在调用函数的时候会出现问题。

includelib语句 和C一样,在汇编程序中也需要调用一些外部模块(子程序\函数)来完成部分功能。

函数声明语句 对于所有要用到的库函数,在程序的开始部分必须预先声明。包括函数的名称、参数的类型等。

include语句 对于所有要用到的库函数及WindowsAPI函数,在程序的开始部分都必须预先声明,这显然是比较麻烦的。在汇编语言中,也可以采用C语言办法,就是把所有的函数声明及常量定义等公用部分预先放在一个头文件中。一些汇编语言工具包,如MASM32等,提供了这样的一些头文件,需要使用这些函数声明或者常量定义的时候,再用include语句将其包含进来。

程序中的数据部分从**.data语句开始定义,代码部分从.code**语句开始定义,所有的指令都必须写在代码区中。

与DOS程序相同,Win32程序在遇到end语句时结束。end语句后面跟的标号指出了程序执行的入口点,即装入执行的第一条指令的位置,表示源程序结束。

当源程序的某一语句过长,不利于书写和阅读时,可以用反斜杠**“\”**做换行符,将这条语句分为几行来写。每一行的最后加上一个反斜杠,说明下一行是当前行的继续。语句的最后一行不要加反斜杠。

最新回复(0)