文章目录
表达式
常量
常量分为:
- 数值常量:MOV AX, 10H
- 符号常量:VAR EQU 20
数值常量可以是:
- 二进制:0101B
- 八进制:123Q 或者 123O
- 十进制:467 或者 467D
- 十六进制:0FFH
- 字符常量:‘123abc’ “hello”
数值表达式
算术运算:
- 加、减、乘、除、取模(MOD)、左移(SHL)、右移(SHR)
- 注意负数的取模,根据商的值进行推算(不同语言,商可能不同)
逻辑运算:
- 相等(EQ)、不等(NE)、小于(LT)、大于(GT)、小于等于(LE)、大于等于(GE)
- 运算结果为特殊常量:成立,为0FFFFH,不成立为0
变量
变量的属性:
- 段属性:所在段的段首址
- 偏移地址:相对段首址的EA
- 类型:存取所需要的字节数
变量的定义使用伪指令:DB、DW、DD、DF、DQ、DT
定义格式: [变量名] 数据定义伪指令 表达式
表达式有以下几种形式:
- 数值表达式:VAR DB 10
- ASCII字符串:BUF DB ‘abc123’
- 地址表达式:只适用于DW和DD,16位段中,DW取该地址的EA,DD取段首址和EA,32位段取EA
- ?:表示不进行初始化赋值
- 重复子句:n DUP(表达式)
- 上述形式的组合,逗号隔开
标号
标号是机器指令语句存放地址的符号表示,也可以是子程序名
标号的属性:
- 段属性:所在段的段首址
- 偏移地址:到段首址的EA
- 类型:NEAR和FAR,NEAR类型的标号,只能段内使用
地址表达式
- 地址表达式是由变量、标号、常量、寄存器的内容,和运算符组成的
- 如果地址表达式中出现了变量、标号,则取它的EA参与运算
属性定义算符PTR
指明该地址的操作数,是什么数据类型,或者临时改变操作数的类型,不能改变寄存器和立即数的类型
类型 PTR 地址表达式
例如:WORD PTR [SI]
类型:BYTE、WORD、DWORD、FWORD、NEAR、FAR
定义类型运算符THIS
指定下一个能分配的存储单元的类型,往往与EQU、=等连用
THIS 类型
跨段前缀算符
用于临时给变量、标号指明段属性
段寄存器:地址表达式
属性分离运算符
分离出变量、标号的段、EA和类型
- 取段址运算符SEG:取出段首址
- 取偏移地址算符OFFSET:取出EA
- 取类型运算符TYPE:取出变量或标号的类型
其它算符
- 取变量存储单元个数LENGTH:它的取值根据定义该变量时,数据定义伪指令后面的一个表达式而定
- 取变量所含数据存储区大小算符SIZE:其值为LENGTH * TYPE
- 字节分离算法:HIGH和LOW
常用运算符优先级
常用的机器指令语句
操作规定:
- 目的操作数与源操作数,必须类型相同
- 目的操作数不能是立即数
- 目的操作数与源操作数,不能都存储在寄存器
- 运算完后,结果送入目的操作数,源操作数不变
数据传送指令
- 一般数据传送指令:MOV、MOVSX、MOVZX、XCHG、XLAT
- 堆栈操作指令:PUSH、PUSHA、PUSHAD、POP、POPA、POPAD
- 标志寄存器传送指令:PUSHF、PUSHFD、POPF、POPFD、LAHF、SAHF
- 地址传送指令:LEA、LDS、LES、LFS、LGS、LSS
- 输入输出指令:IN、OUT
影响标志位的指令:SAHF、POPF、POPFD
一般数据传送指令
传送指令
MOV OPD,OPS
将源操作数送入目的地址中
MOVSX OPD, OPS<