基础模板
.386 ; 选择的处理器
.model flat, stdcall ; 储存模型,win32程序只能用平展(flat)模型
; stdcall为函数调用方式:右边的参数先入栈
option casemap :none ; 指明标识符大小写敏感
include kernel32.inc ; 要引用的头文件
includelib kernel32.lib ; 要引用的库文件
includelib msvcrt.lib ; 引用C语言库文件(msvcrt = Microsoft Visual Studio Runtime)
printf PROTO C:ptr sbyte,:vararg ; C语言的printf函数原型声明
scanf PROTO C:ptr sbyte,:vararg ; C语言的scanf函数原型声明
.data ; 数据段
\
> 数据的声明
/
.code ; 代码段
start: ; 定义标号start
\
> 要运行的代码
/
ret ; 退出进程,返回值为0 (也可以写 invoke ExitProcess,0)
end start ; 指明程序入口点start
数据类型
- 整型 - DWORD
相当于C语言中的 int 类型
变量 DWORD 数字/? ; 数字是静态输入 ?表示大小未知 (不允许使用变量)
- 浮点型(双精度)- QWORD
相当于C语言中的 double类型(在这里建议不要使用 单精度浮点类型 (float) )
变量 QWORD 数字/? ; 数字是静态输入 ?表示大小未知 (不允许使用变量)
- 字符型 - BYTE
相当于C语言中的 char 类型
变量 BYTE ? ; 字符类型申明
变量 BYTE N DUP(?) ; 字符串类型的声明 声明了长度为N的字符串
小贴士:
在win32汇编中不允许出现变量直接给变量赋值的情况,每条语句中只能出现一个变量
(此处的变量是指自己声明的变量,系统变量(EAX、EBX、ECX、EDX)除外)
整数(DWORD)的加(+)、减(-)、乘(*)、除(/)、取余(%)
- 加法( + )z = x + y
MOV EAX,x ; EAX = x
ADD EAX,y ; EAX = EAX + y
MOV z,EAX ; z = EAX
- 减法( - ) z = x - y
MOV EAX,x ; EAX = x
SUB EAX,y ; EAX = EAX - y
MOV z,EAX ; z = EAX
- 乘法( * ) z = x * y
MOV EAX,x ; EAX = x
IMUL y ; EAX = EAX * y
MOV z,EAX ; z = EAX
- 除法( / ) & 余除( % )z = x / y & z = x % y
MOV EAX,x ; EAX = x
CDQ ; 商☟ ☟余数
IDIV y ; EDX|EAX / y = EAX ...EDX
MOV z,EAX ; z = EAX (EAX储存的是 商 )
MOV z,EDX ; z = EDX (EDX储存的是 余数 )
小贴士:
在整数的 加、减 中可以将 EAX 替换为 EBX、ECX、EDX
但是在 乘、除、取余 中只能使用 EAX !!!
实数(QWORD)的加(+)、减(-)、乘(*)、除(/)
实数 包括 整数 与 小数 !!
- 加法( + )z = x + y
FLD x
FADD y
FSTP z
- 减法( - ) z = x - y
FLD x
FSUB y
FSTP z
- 乘法( * ) z = x * y
FLD x
FMUL y
FSTP z
- 除法( / ) z = x / y
FLD x
FDIV y
FSTP z
小贴士:
如果变量中有 整数类型(DWORD) 的话,要将该语句的 F 后加上一个i
以加法为例(此时 x为DWORD类型 y为QWORD类型)
FiLD x
FADD y
FSTP z
当变量类型全为 DWORD类型 时,也可以使用 实数 的运算语句,但尽量不要这样用!
实数算术指令
以下 变量的定义 都要使用 QWORD类型 ,否则输出会出错!!!