一、 语句的种类和格式
1. 语句的种类
伪指令语句和指令语句.汇编程序对源程序进行汇编时,把指令语句翻译成记起指令.伪指令没有对应的机器指令,只是指示汇编程序如何汇编源程序,包括符号的定义,变量的定义,和段的定义.
2. 语句的格式
指令语句: [ 标号 ] 指令助记符 [ 操作数 [ , 操作数 ] ] [ ; 注释 ]
伪指令语句: [ 名字 ] 伪指令定义符 [ 参数…, 参数 ] [ ; 注释 ]
伪指令的参数可以是常数(数值表达式),或者一般的符号,或者有特殊意义的符号
名字后面没有冒号, 而标号后面有冒号
汇编程序不区分保留字中字母的大小写.
二、 数值表达式
标号和变量可以作为数值表达式的符号
1. 常数
1) 十进制常数
默认是十进制.汇编语言提供改变进制的伪指令RADIX
RADIX 16
MOV BX, 0FF
MOV BX, 178D
2) 十六进制常数
凡是以字母开头的十六进制数必须在开头加一个0,和标号区分.以字母H结尾
3) 二进制常数
以B结尾
4) 八进制常数
以Q结尾
5) 字符串常数(串常数)
以引号括起来的一个或多个字符.
‘A’”AB”
2. 算术运算符
正(+) 负(-) 加(+) 减(-) 乘(*) 除(/) 模(MOD)
3. 关系运算符
相等(EQ) 不等(NE) 小于(LT) 大于(GT) 不大于(LE) 不小于(GE)
运算结果是数值, 若关系不成立,则结果为0,否则为0FFFFH
MOV AX, 1234H GT 1024H ;AX = 0FFFFH
MOV BX, 1234H+5 LT 1024H ;BX = 0
4. 逻辑运算符
与(AND) 或(OR) 异或(XOR) 非(NOT) 左移位(SHL) 右移位(SHR)
运算结果是数值
MOV BX, ((PORT-VAL LT 5) AND 20) OR ((PORT-VAL GE 5) AND 30)
即当PORT-VAL<5时 MOV BX, 20, 否则 MOV BX, 30
5. 在数值表达式中使用的操作符
1) HIGH
HIGH 数值表达式
结果是数值表达式的高8位
MOV AH, HIGH 1234H+5 ;AH=17H
MOV AH, HIGH (1234H+5) ;AH=12H
2) LOW
LOW 数值表达式
结果是数值表达式的低8位
一、 地址表达式
[VARW+BX] VARW[BX] VARW[BX][DI]
变量和标号都代表存储单元.
变量表示的存储单元中存放数值,标号表示的存储单元中存放指令
一、 数据定义语句
1. 数据定义语句
最常用的伪指令语句,格式如下
[ 变量名 ] 数据定义符 表达式 [ ,表达式, … 表达式 ] ;注释
VARB DB 3 WARW DW -1234 BUFF DB 100, 3+4, 5*6
1) 定义字节数据项
每一个数据项占一个字节.数据定义符是DB
COUNT DB 100
DB 0DH, 0AH, ‘$’
TABLE DW 0, 1, 4, 9, 16
2) 定义字数据项
每一个数据项占两个字节.数据定义符是DW
FLAG DW 2FCDH, 100, -1
VECT DW 0
DW 100H
3) 定义双字数据项
每一个数据项占四个字节.数据定义符是DD
VECTOR DD 4
FARPTR DD 12345678H, 0
4) 定义没有初值的数据项
数据项是一个问号?,只是给变量分配存储单元.
INBUFF DB 5, ?, ?, 8, ?
VARW DW ?
OLDV DD ?
5) 定义字符串
单引号和双引号要配对
MESS1 DB ‘HELLO’= MESS1 DB ‘H’,’E’,’L’,’L’,’O’
MESS DB ‘AB’;低地址是A, 高地址是B
MESS2 DW ‘AB’;低地址是B,高地址是A
6) 定义其他类型数据项
定义8字节数据项DQ, 定义10字节数据项DT
2. 重复操作符DUP
定义数组和数据缓冲区
BUFFER DB 8 DUP(0) = BUFFER DB 0, 0, 0, 0, 0 ,0, 0, 0
BUFFER1 DB, 5, 0, 5 DUP(?)
BUFFER2 DB 100 DUP(0, 2 DUP(1, 2), 0, 3)
BUFFER3 DB 256 DUP(‘ABCDE’)
DATA DW 1, 5 DUP(1, 2, 4 DUP(0))
二、 变量和标号
1. 变量和标号的属性
1) 段值
2) 偏移
3) 类型
变量类型: 字节(BYTE) 字(WORD) 双字(DWORD)
标号类型 近(NEAR) 远(FAR)
2. 析值操作符
也称为数值回送操作符, 这些操作符把一些特征或存储器地址的一部分回送
SEG 变量名或标号 OFFSET 变量名或标号 TYPE变量名或标号 LENGTH 变量名 SIZE 变量名
OFFSET和LEA的区别
首先,LEA指令可以使用各种存储器寻址方式,如,LEA BX,[DI],LEA BX,TABLE[DI],LEA SI,[BX+DI]等,这些指令都是把计算出来的有效地址送目的寄存器,而OFFSET不能使用这些寻址方式,它只作用于像TABLE这样的简单变量(或标号)。
其次,对简单变量,OFFSET指示符比LEA执行速度快,因为MOV BX, OFFSET TABLE指令在汇编时,由汇编程序计算出了TABLE的偏移地址,并被汇编成立即数传送指令,因此效率很高,而LEA指令是在执行时才计算地址,然后再传送到指定寄存器,因此执行速度相对慢一些。
VARW DW 1234H, 5678H
VARB DB 3, 4
设变量VARW从100H开始
1) 操作符SEG返回变量所在段的段值
MOV AX, SEG VARW
MOV DS, AX
2) 操作符OFFSET返回变量或者标号所在的偏移
ADD DI, OFFSET VARW+2 ;ADD DI, 102H
3) 操作符TYPE返回变量或者标号的类型,类型用数值表示,常见类型和对应的数值规定
字节(BYTE) 1 字(WORD)2 双字(DWORD)4
近(NEAR)-1 远(FAR)-2
ADD SI, TYPE VARW → ADD SI, 2
4) 操作符LENGTH返回利用DUP定义的数组中的个数
如果变量定义语句中没有使用DUP,则返回1,如果嵌套使用了DUP,则返回最外层的重复数.
MOV CX, LENGTH VARB; MOV CX, 1
5) 操作符SIZE返回到用DUP定义的数组占用的字节数
SIZE 变量 = (LENGTH 变量) * (TYPE 变量)
MOV CS, SIZE VARW; 1×2=2