一 标号
标号是特殊的标识符,代表代码段中某个具体位置,主要用于跳转指令的目标位置。说明形式如下:
标号: 汇编语句 ;注释
标号必须是合法标识符,在后面跟一个冒号,冒号和汇编语句用TAB或空格分隔开。
二 内存变量和标号的属性
变量是一个符号地址,其值会根据它代表的数据类型来对应从该地址以后若干个存储单元的数值。
标号也是一个符号地址,它所对应的存储单元中存放的是指令代码,虽然他们在性质上不同,但是他们都是代表了一个内存地址,所以他们都具有存储单元的属性。
下面介绍内存变量和标号的属性及其操作符。
1 段属性操作符
段属性操作符(SEG)返回该标识符所在段的段地址。我们一般只会取内存变量所在段的段地址,很少取标号所在段的段地址。
使用方法如下:
SCOPE DW ?
NAME DB 10 DUP(10)
MOV AX, SEG SCOPE
MOV BX, SEG NAME
现在AX的值等于BX的值,因为NAME和SCOPE在同一个段中定义。
2 偏移量属性操作符
偏移量属性操作符(OFFSET)返回该标识符离它所在段的基址有多少字节。一般情况下,程序员只会关注内存变量的偏移量,而很少关注标号的偏移量。
比如:
FIRST DD 12345678h,0
SCOPE DW ?,12h
NAME DB 10 DUP(10)
MOV AX, OFFSET SCOPE
MOV BX, OFFSET NAME
如果FIRST是第一个被定义的内存变量,这个时候AX为8,然后是两个WORD(4个字节),BX为12。
3 类型属性操作符
类型属性操作符(TYPE)可以返回该变量所占字节数,或者标号的远近类型。
4 长度属性操作符
长度属性操作符(LENGTH)是针对内存变量的操作符,返回重复操作符DUP中的重复数。
5 容量属性操作符
容量属性操作符(SIZE)是Length * Type。
6 强制属性操作符
在程序中,有时需要对同一个存储单元以不同的属性来访问,或者对一些不确定的存储属性需要显示指定的时候,就需要强制属性操作符PTR。
比如有一个指令: MOV [BX], 1h 这个指令是间接寻址方式,将1h存放到bx中所指的寄存器单元中,在实际传送操作中,是把"1H"扩展成8位做字节传送,还是扩展成16位做字传送呢,这样指令有了二义性,因为[BX]指向的存储单元可以是字节或字的首地址,含有该指令的代码在汇编时会出错。
为了使指令中存储单元操作数具有明确的属性,可以使用强制属性操作符PTR。格式为:
数据类型 PTR 地址表达式
为了明确指令中存储单元的属性,可以把指令 MOV [BX], 1h改写成
MOV byte ptr [BX], 1H
MOV word ptr [BX], 1h
在指令中使用操作符PTR指定一个内存地址及之后的数据元素的类型后,在该指令中以PTR指定的类型为准,该强制属性只在该指令中有效,并不影响原内存单元的定义属性。
比如:
W1 DW 1234H, 5678H
B1 DB 2
DB 5
D1 DD 23456789H
MOV AX, word ptr B1 ;执行后 AX = 0502H
MOV BH, byte ptr w1 ;执行后 BH = 34H
MOV CH, byte ptr w1+1 ;执行后 CH = 12H
MOV word ptr D1, 12H ;执行后 D1 = 23456712H
7 存储单元的别名操作符
使用PTR强制属性操作符可以去以特定数据类型形式访问一个内存地址及其之后的几个内存单元,但是每次都使用PTR强制类型操作符比较麻烦,这个使用可以给一个内存变量声明一个其他类型的别名,以后即可使用该别名的数据类型来访问该内存变量。
格式为:
THIS 数据类型
比如:
WBUFFER EQU THIS WORD ;字类型变量WBUFFER
BUFFER DB 20 DUP(?) ;字节类型变量BUFFER
这个时候可以看出,使用了THIS声明的内存变量,并没有开辟内存空间,而是表示该内存变量以指定的数据类型引用这个内存地址,在下面的数据定义语句,开辟实际的内存空间
![](https://img2024.cnblogs.com/blog/35695/202408/35695-20240826070647288-243310440.jpg)