每日一课(17/75)标号和属性
2008-03-10 09:39
363 查看
一 标号
标号是特殊的标识符,代表代码段中某个具体位置,主要用于跳转指令的目标位置。说明形式如下:
标号: 汇编语句 ;注释
标号必须是合法标识符,在后面跟一个冒号,冒号和汇编语句用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声明的内存变量,并没有开辟内存空间,而是表示该内存变量以指定的数据类型引用这个内存地址,在下面的数据定义语句,开辟实际的内存空间
标号是特殊的标识符,代表代码段中某个具体位置,主要用于跳转指令的目标位置。说明形式如下:
标号: 汇编语句 ;注释
标号必须是合法标识符,在后面跟一个冒号,冒号和汇编语句用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声明的内存变量,并没有开辟内存空间,而是表示该内存变量以指定的数据类型引用这个内存地址,在下面的数据定义语句,开辟实际的内存空间
相关文章推荐
- 每日一课(6/75) 子程序的定义 调用及返回
- 每日一课(12/75)操作数的寻址方式
- 每日一课(19/75)符号定义语句
- 每日一课(4/75)逻辑运算指令
- 每日一课(7/75) 汇编预备知识
- 每日一课(8/75)CPU资源和存储器 之 寄存器组的介绍
- 每日一课(20/75)汇编语言指令系统简介
- 每日一课(10/75)CPU资源和存储器 之 专用寄存器的作用
- 每日一课(11/75)CPU资源和存储器 之 80x86 内存管理
- Canvas rgba() 透明度属性【每日一段代码17】
- 每日一课(3/75) 算术运算指令
- 每日一课(5/75) 跳转指令及循环指令
- 每日一课(18/75)表达式
- 每日一课(1/75) 通用寄存器及标志寄存器
- 每日一课(14/75)调整偏移量的伪指令
- 每日一课(15/75)复合内存变量的定义 重复定义 和 结构定义
- 每日一课(2/75) 常用指令(传送 交换 取地址 取段 栈操作)
- 每日一课(9/75) CPU资源和存储器 之 通用寄存器的主要作用
- 每日一课(16/75)联合类型和记录类型 还有数据类型的自定义typedef
- 每日一课(13/75)内存变量的定义