八、80x86宏汇编语言的数据和表达式
(一)常数
在宏汇编中,允许使用的常数有:
● 二进制常数
● 十进制常数
● 八进制常数
● 十六进制常数
● 十进制科学记数法
● 串常数
(二)变量
变量用于定义存储器中的数据,这些数据在程序运行过程中可随机修改。为了便于对变量的访问,变量常常以变量名的形式出现在程序中。变量名可以认为是存放数据的存储单元号地址。变量的三个属性是:
(1)段属性
指变量所在段的段基址。
(2)偏移地址属性
指变量所在段中的偏移量,即变量所在地址与段基址之间的字节距离。
(3)类型属性
指变量占用存储单元的字节数。占用1个字节的称为字节变量,其类型BYTE;占用2个字节的称为字变量,其类型为WORD;占用4个字节的称为双字变量,其类型为DWORD。此外,还有8字节(即4个字)变量和10字节变量,它们分别占用8个字节存储单元和10个字节存储单元,其类型为QWORD和TBYTE。
变量可以用伪指令DB、DW、DD、DZ、DT进行定义。
(三)标号
标号是给指令性语句所在地址取的名字,和变量一样,标号有三个属性:
(1)段属性
(2)偏移地址属性
(3)类型属性
(四)表达式和运算符
宏汇编中有三种运算符:算术运算符、逻辑运算和关系运算符。
1.算术运算符
算术运算符包括加(+)、减(-)、乘(*)、除(/)、模除(MOD)、左移(SHL)和右移(SHR)七种。+、-、*、/是常用的运算符,参加运算的数和运算结果均为整数。除法运算的结果取商的整数部分,而模除的运算结果只取它的余数。左移或右移运算符可使二进制数左移或右移若干位,相当于二进制数进行乘法或除法运算,因此也把它们作为算术运算符。
2.逻辑运算符
逻辑运算符包括AND(与)、OR(或)、XOR(异或)、NOT(非)四种。它们只适用于对常量进行逻辑运算。注意,表达式中的逻辑运算符只能出现在语言的操作数部分并且是在汇编时完成运算的。
3.关系运算符
关系运算符包括EQ(相等)、NE(不等)、LT(小于)、(GT)大于、LE(小于或等于)、GE(大于或等于)6种运算。关系运算符是用于比较两类的大小,要求两个操作数都是数字或者是同一段中的两个地址值。比较的结果用逻辑值表示。关系运算符与逻辑运算符常结合在一起使用。
4.数值回送运算符
数值回送运算符分为两类:一类是将指定的变量名或标号地址的有关内容赋给指令,如OFFSET和SEG;另一类有3种:TYPE,LENGTH和SIZE,将变量名或标号的一些特征传送给指令。
(1)OFFSET
格式: OFFSET 变量或标号
汇编程序将回送变量或标号所在地址的偏移量给该指令。
(2)SEG
格式: SEG 变量或标号
汇编程序将回送变量或标号所在地址的段地址给该指令。
(3)TYPE格式: TYPE 变量或标号
用来确定标号或变量的类型,并根据类型作为一个操作数回送给指令。汇编中规定,如果是变量,则根据DB、DW、DD、DQ和DT分别用数值1、2、4、8和10回送给指令。如果是标号,根据标号的类型用-1和-2分别代表NEAR和FAR。
(4)LENGTH
格式: LENGTH 变量名
用来回送变量名下定义的数据项数目。值得注意的是它只对用DUP定义的数据起作用,凡没使用DW的回送值均为1。
(5)SIZE
格式: SIZE 变量名
用来回送为该变量名分配的字节数。可见SIZE应是TYPE和LENGTH值的乘积。
5.指定属性操作符
指定属性操作符有PTR和THIS等6种。它们的功能是建立一些新的存储器地址操作数,即新的变量、标号或地址表达式。
(1)PTR
格式:类型 PTR 表达式
说明:类型可以是BYTE、WORD、DWORD、NEAR、FAR等,表达式可以是某个变量、标号或地址表达式。
功能:建立一个新的存储器地址操作数,但不分配内存。新操作数与PTR右边的存储器地址作数有相同的段地址和偏移量,类型为PTR左边规定的类型。因些,实际上,PTR操作符可给变量、标号或地址表达式定义新的名字和类型。
(2)THIS
格式:THIS 类型
功能:定义当前单元类型的操作符。
(3)SHORT
格式:JMP SHORT DES
功能:确定转移地址的属性,用在JMP指令中,规定转移范围在-128~+127个字节内。
(4)HIGH和LOW
两个字节选取操作符。在指令中用在字操作数之前,指定取该字的高字节或低字节参与运算。
(5)段属性
利用“段寄存器:地址表达式”的形式改变操作数的地址表达式所属段的特性。
【编辑推荐】