1、如何用汇编语言指令或伪指令调用Windows提供的API函数?
2、Windows汇编与DOS汇编的区别?
分段与特权指令
3、二进制数与八进制、十六进制、十进制的关系
D O/Q H B
4、容量单位
1024 = 400h = 2^10 = 1K
65536 = 10000h = 2^16 = 64K
2^20 / 2^30 / 2^32 = 4G
5、无符号数与有符号数的表示范围
有符号数与补码的关系
6、汇编的基本元素
汇编语言编译器(MLMASM)
整数常量:
运算符及优先级: ()、+,-、*,/、MOD、+,-
实数常量 :符号位、整数部分、小数点、小数部分和指数组成
字符和字符串常量: 区分’A'和“A”,字符串自动在尾上加
标识符 :大小写字母、数字、下划线、@和$,第一个字符不能是数字;240个字符长度;编译时加-Cp,使变量名和系统关键字大小写敏感;@编译器扩展用于预定义的符号,建议不要使用
缩写 含义
sz 表示以0结尾的字符串(ASCIIZ)
h 表示句柄handle
lp 表示指针long point
lpsz 表示指向ASCIIZ的指针
bwdwfst 表示字节byte字word双字double word浮点数float结构体struct
伪指令:编译时,由编译器识别和执行的命令,是汇编编译器语法格式的一部分,与CPU无关;定义逻辑段、选择内存模式、定义变量类型、和创建过程,不区分大小写,例如.CODE、.code、.Code
常用伪指令:
.386
.model flat,stdcall
option casemap:none
.data
.code
start:
invoke ExitProcess,NULL
end start
指令和标号 标号:助记符 操作数 ;注释 标号是浮动地址,在程序编译链接后,将有一个具体的地址。用它来指明程序转移的入口点。
MASM中的@@标号 和@B向后转移,@F向前转移 一起使用
注释 单行注释和块注释 ;和comment(伪指令)
.model 定义程序的工作模式,语法格式 .model 内存模式[,语言模式][,其他模式] 例.model flat,stdcall 也自动为段寄存器作了以下说明 ASSUME CS:FLAT,DS:FLAT,ES:FLAT,SS:FLAT,FS:ERROR,GS:ERROR CS,DS,ES,SS工作在一个段,FS和GS不使用。如果使用,则要说明 ASSUME FS:NOTHING,GS:NOTHING 或 ASSUME FS:FLAT,GS:FLAT
.386 80386处理器指令集,必须定义在开头,用户级程序工作在最低特权级3,用.386够用;编写设备驱动程序,用.386p,p指的是特权指令,在最高特权级0运行
节区 和模式选择有关,需要区分数据和代码;
.386
.model flat,stdcall
option casemap:none ;变量和关键字区分大小写
<include 语句>
.data ;_DATA节区
<初始化变量>
.data? ;_BSS节区
<没有初始化值的变量(用?号表示值)>
.const
<常量定义>
.code ;_TEXT节区
入口点标号:
<代码>
end 入口点标号 ;指明程序入口点
.data和.data?区别 编译链接是否占用空间;内容都是可以读写的
.const 常量不容许修改
.code 节区不可写
invoke伪指令:
invoke出现以前,程序使用入栈的方法调用Windows中的API函数
push MB_OK ;
push addr szCaption ;标题串的地址
push addr szText ;正文串的地址
push NULL ;父窗口的句柄
call MessageBox ;显示信息框
之后 invoke MessageBox,NULL,addr szText,addr szCaption,MB_OK
右边的参数先入栈,由stdcall决定的
续行号
wsprintf 格式化信息串函数 和 其他输入输出函数
wsprintfA PROTO C :DWORD, :VARARG
wsprintf equ <wsprintfA>
其中PROTO是过程声明关键字,C表示是C语言调用方式(右边参数先入栈),:DWORD是缓冲区地址的类型,:VARARG表示参数的类型可以是BYTE、WORD和DWORD等,且参数的个数可以有任意多个(与格式串中的输出控制符对应)。
wsprintf 函数的格式如下:
wsprint, lpOut, ;缓冲区的地址
lpFmt, ;格式串的地址
变量列表:VARARG
多少个格式控制符,就对应多少个值;该功能是填充格式串,并将其搬入缓冲区。
例如:
buffer db 80 dup (0)
szFmt db '十进制值是:%d,十六进制值是:%xh',0
invoke wsprintf,addr buffer,addr szFmt,100,100
masm32.lib : ClearScreen、Locate、StdOut、StdIn
StdOut PROTO :DWORD
StdIn PROTO :DWORD,:DWORD
Locate PROTO :DWORD,:DWORD
ClearScreen PROTO