汇编程序语法
一、注释
;单行注释
二、变量
1.常量
注意:立即数书写必须以数字开头,若十六进制数第一位为字母,可在前面添加0。
2.变量
- 变量定义一般格式
变量名 变量类型 表达式
变量类型 | 描述 |
---|---|
DB | 定义字节单元(8位) |
DW | 定义字单元(16位) |
DD | 定义双字单元(32位) |
DQ | 定义四字单元(64位) |
DT | 定义十字节单元(160位) |
3.变量属性
变量一旦被定义,就具有以下三个属性:
(1)段属性
表示该变量存放在哪个逻辑段中,变量的段基值可以用SEG运算符获取。
(2)偏移量属性
表示变量所在位置与段起始点之间的字节数,变量的偏移量可以用OFFSET运算符获取。
(3)类型属性
变量的类型属性可以用TYPE运算符获取。
4.变量赋初值
(1)数值表达式
示例:
DATA1 DB 32,30H ;DATA1的值为32(20H),DATA1+1的值为48(30H)
(2)?表达式
只分配存储空间,初始值为任意值。
示例:
DA-BYTE DB ?,?,? ;分配三个字节的存储单元,值为任意值
(3)字符串表达式
示例:
STRING1 DB 'ABCDEF' ;存放顺序:ABCDEF
STRING2 DW 'AB','CD','EF' ;存放顺序:BADCFE
STRING3 DD 'AB','CD' ;存放顺序:BA00DC00
注意:两个字符的存放顺序为为前一个字符存放在高地址,后一个字符存放在低地址。
DW和DD伪指令不能用两个以上字符构成的字符串赋初值(即便DD有4个字节的空间),否则将出错。
(4)DUP表达式
DUP成为重复数据操作符,用于批量分配存储空间。
变量 变量类型 重复次数 DUP(重复内容)
三、运算符
1.算术运算符
算术运算符 | 描述 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 整除 |
MOD | 求余 |
SHL | 逻辑左移 |
SHR | 逻辑右移 |
[ ] | 下标运算符 |
注意:移位运算符与移位指令不同。
移位运算符的操作对象为具体的数,移位操作在汇编时完成。
NUM SHL 1 ;移位运算符
移位指令的操作对象为寄存器或存储单元,移位操作在程序运行时执行。
SHL NUM,1 ;移位指令
2.逻辑运算符
逻辑运算符 | 描述 |
---|---|
NOT | 取反 |
AND | 逻辑乘 |
OR | 逻辑加 |
XOR | 异或 |
注意:逻辑运算符均为按位运算。
3.关系运算符
关系运算符 | 描述 |
---|---|
EQ | 等于 |
NE | 不等于 |
LT | 小于 |
LE | 小于等于 |
GT | 大于 |
GE | 大于等于 |
注意:关系运算符比较的两个表达式必须同为常数或为同一个逻辑段中的变量。
常量比较,按无符号数进行比较。
变量比较,比较两者偏移量大小。
关系运算的结果为真(全1)或假(全0)。
4.数值返回运算符
(1)SEG运算符
取变量或标号所在段的段基值。
(2)OFFSET运算符
取变量或标号所在段内的偏移量。
(3)TYPE运算符
取变量或标号的类型属性,返回结果为数字。
变量类型 | 类型(字节长度) |
---|---|
BYTE | 1 |
WORD | 2 |
DWORD | 4 |
QWORD | 8 |
TWORD | 10 |
标号类型 | 类型 |
---|---|
NEAR | -1 |
FAR | -2 |
(4)LENGTH运算符
取变量长度。
若变量用重复数据操作符DUP说明,则length运算取外层DUP给定的值。
若没有用DUP说明,则length运算返回值为1。
示例:
DATA SEGMENT
K1 DB 10H
K2 DB 10H DUP(0)
K3 DW 20H DUP(0, 1, 2 DUP(0))
K4 DB 'ABCDEFGH'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AL,LENGTH K1 ;AL=10H
MOV BL,LENGTH K2 ;BL=1
MOV CX,LENGTH K3 ;CX=20H
MOV DX,LENGTH K4 ;DX=1
MOV AH,4CH
INT 21H
CODE ENDS
END START
(5)SIZE运算符
SIZE运算符只能作用于变量,返回该变量TYPE和LENGTH的乘积。
5.属性修改运算符
对变量、标号或存储器操作数的类型属性进行修改或指定。
(1)PTR运算符
将地址表达式所指定的变量、标号或以其它形式表示的存储器地址的类型属性修改为所指定的类型值。
类型 PTR 地址表达式
注意:此类修改为临时的,作用域为本语句。
(2)HIGH/LOW运算符
将表达式的值分离出高字节和低字节。
HIGH 表达式
LOW 表达式
(3)THIS运算符
四、输入与输出
1.输入
- 单ASCII码字符输入
MOV AH,01
INT 21H
输入的字符(ASCII码)会保存在AL寄存器中。
2.输出
MOV AH,02
INT 21H
输出DL寄存器中的字符。
五、分支
1.无条件转移指令
指令 | 说明 | 执行操作 |
---|---|---|
jmp short 标号 | 段内直接短转移(IP修改范围-128~127) | IP = IP + 8位位移量 |
jmp near ptr 标号 | 段内直接近转移(IP修改范围-32768~32767) | IP = IP + 16位位移量 |
jmp word ptr 内存单元地址 | 段内间接转移 | IP = 内存单元地址 |
jmp far ptr 标号 | 段间直接远转移 | CS = 标号所在段段地址 IP = 标号所在段偏移地址 |
jmp dword ptr 内存单元地址 | 段间间接转移 | CS = 内存单元地址 + 2 IP = 内存单元地址 |
2.条件转移指令
指令 | 转移条件 | 检查标志位 |
---|---|---|
je | == | ZF==1 |
jne | != | ZF==0 |
jb | < | CF==1 |
jnb | >= | CF==0 |
ja | > | CF==0且ZF==0 |
jna | <= | CF==1或ZF==1 |
六、循环
1.loop
MOV CX,循环次数
S: 循环体
LOOP S
LOOP S执行过程:
- 1.(CX) = (CX) - 1
- 2.判断CX寄存器中的值,若不为0则跳转至标号S所标识的地址处执行,否则执行下一条指令。
网友评论