变量表示存储单元中存放的数值,标号表示存储单元中存放的指令代码。
(1)数据定义语句
通过数据定义语句可为数据项分配存储单元,并根据需要设置其初值,还可用符号代表数据项,此时符号与分配的存储单元相联系。
1.数据定义语句
数据定义语句最常用的是伪指令语句。
格式:
[变量名]数据定义符 表达式[,表达式,….,表达式];注释
例:
VARB DB 3
VARW DW –1234
BUFF DB 100, 3+4, 5*6
(1)定义字节数据项
定义字节数据项的数据定义符是DB
例:
COUNT DB 100
DB 0DH, 0AH, ‘$’
TABLE DB 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)定义字符串
DB也可以用于定义字符串,字符串要用引号括起来,单引号和双引号皆可,只要配对。
例:
MESS1 DB ‘HELLO!’
上述语句与如下语句起相同作用:
MESS1 DB ‘H’,’E’,’L’,’L’,’O’
MESS DB ‘AB’
MESS2 DW ‘AB’;写反注意!A高位
(6)定义其他类型数据项
定义8字节:DQ
定义10字节:DT
例:
DT 0
DQ ?
2.重复操作符DUP
有时需要定义数组,还需要定义数据缓冲区,为此在数据定义语句中使用的重复操作符DUP
格式:
count DUP (表达式)
例:
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))
(2)变量和标号
1.变量和标号属性
变量和和标号均表示存储器操作数,都具有如下三种属性:
(1)段值,变量和标号对应存储单元所在段得段值。
(2)偏移, 变量和标号对应存储单元的起始地址的段内偏移。
(3)类型,变量类型主要是字节,字,双字,标号类型主要
是NEAR FAR 近表示段内标号,远表示段间标号。
2.析值操作符
也称为数值回送操作符,原因是这些操作符把一些特征或存储地址的一部分作为数值回送。
五个析值操作符的简单使用格式如下:
SEG 变量名或标号
OFFSET 变量名或标号
TYPE 变量名或标号
LEHGTH 变量名
SIZE 变量名
例:VARW DW 1234H, 5678H
VARB DB 3,4
设VARW从100H开始:
(1)操作符SEG能返回变量所在的段值
MOV AX, SEG VARW
MOV DS, AX
(2)操作符OFFSET返回变量或者标号的偏移
MOV BX, OFFSET VARW
把VARW偏移(100H)送BX
MOV DI, OFFSET VARW+2
MOV SI, OFFSET VARB
(3)操作符TYPE返回变量或标号类型,类型用数值表示,常见类型和对应数值规定如下:
字节:1 字:2 双字:4 NEAR:-1 FAR:-2
可见变量类型值是对应该类型变量项所占用的字节数,而标号的类型值却没有实际的物理意义。
对于ADD SI, TYPE VARW 汇编将程序形成为:ADD SI, 2
(4)LENGTH返回利用DUP定义的数组中元素个数
如果变量定义语句中没有使用DUP, 则返回1.
如果嵌套DUP,则返回最外层重复数。
MOV CX, LENGTH VARW; 1送CX
MOV CX, LENGTH VARB; 1送cx
(5)SIZE返回利用DUP定义的数组占用的字符数,可按下式计算:
SIZE 变量= (LENGTH 变量) * (TYPE 变量)
MOV CX, SIZE VARW; 2->CX
MOV CX, SIZE VARB; 1->CX
3.属性操作符
操作符PTR
汇编程序在汇编指令”MOV [SI], 1”时,将发出警告提示信息或出错提示信息。
MOV WORD PTR [SI], 1; 指明字类型
MOV BYTE PTR [SI], 1
PTR是最常用的合成操作符,用在地址表示式前,用于指定火临时改变变量和标号类型。
格式:
类型 PTR 地址表达式
类型可以是BYTE WORD DWORD NEAR FAR
PTR并不分配存储但愿,只是临时性的强制指定变量或标号的类型。
例:
JMP FAR PTR OK
JMP DWORD PTR OLDVECT
例:假设程序中的数据定义如下:
LNAME DB 30 DUP (?)
CODE_LIST DB 1, 7, 8, 3, 2
用一条MOV指令将LNAME的偏移地址放入AX,用一条指令将CODE_LIST头两个字节的内容放入SI。
MOV AX, OFFSET LNAME
MOVE SI, WORD PTR CODE_LIST