MASM学习x86汇编语言 第一个程序
一、本章准备工作
- Windows环境,x86主机
- 安装MASM软件
下载地址:http://www.masm32.com/download.htm
我这里安装到了D盘根目录。
为方便后面命令行调用,安装以后,可以把D:\masm32\bin
目录放到系统环境变量PATH
里。
本章示例使用d:/masm32/qeditor.exe 可视化开发工具。
二、x86 处理器架构
8086 的寄存器:
- AX、BX、CX、DX通常用来存放一般性数据,被称为通用寄存器。
- 16位寄存器所能存储的数据最大值为
-1 。
- 8086 CPU的通用寄存器可以分为两个独立的8位寄存器使用。例: AX可分为AH和AL。
三、几条简单的汇编指令
汇编指令 | 控制CPU完成的操作 | 用高级语言的语法描述 |
mov ax,18 | 将18送入AX | AX=18 |
mov ah,78 | 将78送入AH | AH=78 |
add ax,8 | 将寄存器AX中的数值加上8再存入AX中 | AX=AX+8 |
mov ax,bx | 将寄存器BX中的数据送入寄存器AX | AX=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 链接文件,生成可执行文件:
运行效果:
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程序。
参考文档:
http://index-of.es/Exploit/Windows%20Assembly%20Programming%20Tutorial.pdf