灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:4675回复:0

[系统教程]经典汇编语言教程:4.6.6 强制属性操作符

楼主#
更多 发布于:2012-09-23 09:14
在程序中,我们有时需要对同一个存储单元以不同的属性来访问,或对一些不确定的存储属性需要显式指定等,这时,我们就需要强制属性操作符PTR。该操作符的作用有点象C语言中的类型强制方法。
对于指令:MOV [BX], 1H,其目标操作数[BX]是寄存器间接寻址方式,它指向一个存储单元。在作传送操作时,是把“1H”扩展成8位作字节传送,还是扩展成16位作字传送呢?这就使该指令具有二义性,因为[BX]指向的存储单元可以字节或字的首地址。含有该指令的程序在汇编时,可能会产生警告或出错信息。
为了使指令中存储单元操作数具有明确的属性,我们可以使用强制属性操作符PTR。其一般格式为:
数据类型 PTR 地址表达式
其中:数据类型是前面所学的各种数据类型,常用的数据类型有:BYTE、WORD、DWORD、NEAR和FAR等。
为了明确指令中存储单元的属性,可把指令“MOV [BX], 1H”可改写成:
MOV  byte ptr [BX], 1H  或 MOV wordptr [BX], 1H
在指令中用操作符PTR强制后,不管其后的地址表达式原数据类型是什么,在本指令中就以PTR前面的类型为准。该强制属性只在本指令有效,是一种临时性的属性,它不会改变原内存单元的定义属性。
例如:
W1DW 1234H, 5678H
B1DB 2
DB 5
D1DD 23456789H
MOVAX, word ptr b1;把B1开始的二个字节拼接成一个字,执行后,(AX)=0502H
MOVBH, byte ptr w1 ;把字W1的低字节传送给BH,执行后,(BH)=34H
MOVCH, byte ptr w1+1;把字W1的高字节传送给CH,执行后,(CH)=12H
MOVword ptr d1, 12H ;把双字D1的低字修改成0012H,执行后,(D1)=23450012H
上面指令中的强制属性是临时属性,它不能改变这些变量在定义时的永久属性。

喜欢0 评分0
游客

返回顶部