一、本章准备工作

1. MASM 介绍

MASM(Microsoft Macro Assembler),是微软开发的汇编语言编译器,用于编写和生成基于x86架构的汇编语言程序,它的主要特点 :

  1. 支持 x86架构
  2. 支持宏处理
  3. 丰富的指令集支持
  4. 模块化编程
  5. 与C和其它高级语言集成
  6. 有优化能力
  7. 有丰富的文档

2. 本文准备环境

  • Windows环境,x86-64主机
  • 安装MASM软件
    下载地址:http://www.masm32.com/download.htm
    我这里安装到了D盘根目录。
    在这里插入图片描述

为方便后面命令行调用,安装以后,可以把D:\masm32\bin目录放到系统环境变量PATH里。
本章示例使用d:/masm32/qeditor.exe 可视化开发工具。

安装后界面:
在这里插入图片描述

  • 安装 git bash
    在安装 git 工具时,会自动安装bash环境。

  • VSCode

二、x86 处理器架构

在这里插入图片描述

8086 的寄存器:

  • AX、BX、CX、DX通常用来存放一般性数据,被称为通用寄存器。
  • 16位寄存器所能存储的数据最大值为 2 16 2^{16} 216-1 。
  • 8086 CPU的通用寄存器可以分为两个独立的8位寄存器使用。例: AX可分为AH和AL。

三、几条简单的汇编指令

汇编指令控制CPU完成的操作用高级语言的语法描述
mov ax,18将18送入AXAX=18
mov ah,78将78送入AHAH=78
add ax,8将寄存器AX中的数值加上8再存入AX中AX=AX+8
mov ax,bx将寄存器BX中的数据送入寄存器AXAX=BX
add ax,bx将AX,BX中的内容相加再存入AX中AX=AX+BX

四、启动qeditor 录入测试程序

1. 源代码

.386                   ; 编译器指令,使用386指令集
.model flat, stdcall   ; model汇编指令,程序的内存模式, flat是windows程序,没有远近指针,stdcall是windows函数用的参数方式,即参数从右向左传递
option casemap :none   ; 标签是否区分大小写
include \masm32\include\windows.inc     ; 包含了Win32 API 的一些常量和函数定义
include \masm32\include\kernel32.inc    ; 包含了后面使用的ExitProcess函数
include \masm32\include\masm32.inc      ; 包含了后面使用的StdOut函数,不是标准的Win32函数,由MASM提供
includelib \masm32\lib\kernel32.lib     ; 库文件
includelib \masm32\lib\masm32.lib
.data
 HelloWorld db "Hello World!", 0        ; 定义使用的字符串常量,db代表define byte。最后跟一个NUL,表示ANSI字符集结束符
.code                                   ; 开始代码区
start:                                  ; 所有的代码要在start标签后、end start前    
 invoke StdOut, addr HelloWorld         ; 调用函数StdOut,参数量HelloWorld的地址。注意StdOut是MASM提供的宏。其它编辑器里可以使用WriteConsole之类win32函数代替。
 invoke ExitProcess, 0                  ; 调用ExitProcess
end start 

保存文件。

2. 编译

选择菜单 Project-Assemble ASM file 进行编译,生成obj文件:
在这里插入图片描述
再选择Link 链接文件,生成可执行文件:
在这里插入图片描述
运行效果:
在这里插入图片描述
注意:直接在DOS窗口执行可能看不到结果,可使用 git bash 环境打开。

3. 命令行编译

ml /c /Zd /coff hello.asm
link /SUBSYSTEM:CONSOLE hello.obj

在这里插入图片描述
在这里插入图片描述
也可以生成 hello.exe

五、调用Windows API的版本

.386
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
.data
 HelloWorld db "Hello World!", 0
.code
start:
 invoke MessageBox, NULL, addr HelloWorld, addr HelloWorld, MB_OK
 invoke ExitProcess, 0
end start

直接在菜单里编译运行:
在这里插入图片描述
命令行编译的话使用:

ml /c /Zd /coff hellow.asm
link /SUBSYSTEM:WINDOWS hellow.obj

这里SUBSYSTEM使用WINDOWS代替了CONSOLE,表示是一个Windows GUI程序。

六、使用VSCode插件开发

1. 插件安装

搜索 MASM 并安装如下插件:
在这里插入图片描述

2. 运行程序

按下ctrl+shift+p , 输入MASM,选择如下:
在这里插入图片描述
可执行并输出 :
在这里插入图片描述

参考文档:
http://index-of.es/Exploit/Windows%20Assembly%20Programming%20Tutorial.pdf

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐