汇编语言程序设计之伪指令LABEL和THIS

 首先谈一下自己的一些理解:从高级语言的基本说一下

在高级语言中,我们有时候对段存储空间进行了初始化的属性设置,例如存储空间的初始访问是int,每访问一次IP = IP+4,现在想以字节进行访问(char),那么就需要进行强制类型转换,但是这种转换只对单次的操作有用。

int a[10]

char *p = (char*)a;

如果后面需要时候的时候,需要再次进行转换。

 

在汇编语言编程中,设定了相关的伪指令,实现了类似的类型转换,其实就是对一段存储空间或者是一个代码段的标示进行别名的定义(别名,对于高级语言C++比较熟悉的话,应该知道引用(&)吧)。

对于存储空间的标示,我们理解为变量,这个变量的属性包含三部分:段基址,段内偏移,类型说明(Byte-字节,Word-字,DWord-双字等);

对于执行指令的访问,通过标号来表示,标号代表的是一个执行指令在汇编代码中的地址标识符,一般是都是一个符号+一个冒号,这个符号我们叫做标号,标号也包含三个属性:段基址,段内偏移,访问说明(near近访问-模块内部+far远访问-模块之间)。

LABEL算是一个符号名定义语句。该语句定义一个指定的符号名,该符号名的段地址和偏移量与下面紧跟存储单元的相应属性相同,但该符号的类型是新指定的。LABEL语句的一般格式如下:

    符号名 LABEL 类型

    其中:常用的类型有BYTEWORDDWORDNEARFAR等。

举例说明:

… 
WBUFFER LABEL WORD ;WBUFFER与BUFFER具有相同的段地址和;偏移量,但它们的数据类型不同。 
BUFFER DB 200 DUP(0) 
… 
NEXT1 LABEL FAR ;NEXT1和NEXT具有相同的段地址和偏移量,NEXT1是“远”标号,NEXT是“近”标号。 
NEXT: MOV AX, BX

    在上面,标号NEXT1和NEXT可用于不同的情况。当在同一个模块内转移时,可使用标号NEXT;当在不同的模块之间进行转移时,需要使用“远”标号NEXT1。

 

讲到了LABEL,也不得不提一下跟它功能很类似的THIS操作符。

    我们知道:在程序中,如果需要以另一种数据类型来访问某一存储单元时,可用强制属性操作符PTR来实现。但如果在程序中要经常以某种其它的数据类型来访问该存储单元的话,那么,就必须在每次访问时都要加上强制属性操作符PTR。这样做虽然可行,但在编写程序时就显得比较麻烦。

    为了克服上述不便,汇编语言提供了另一种操作符THIS,它为同一存储单元取另一别名,该别名可具有其自身的数据属性,但其段地址和偏移量是不变的。

操作符THIS的一般格式为:

    THIS 数据类型

    其中:常用的数据类型有:BYTE、WORD、DWORD、NEAR和FAR等。
    例如:

WBUFFER EQU THIS WORD ;EQU是一个等价符号定义语句 
BUFFER DB 20 DUP(?) 

示意图如下所示:

    这样看来,WBUFFER就是BUFFER的一个别名,这两个变量名实际指向同一个内存地址。但是需要注意:二者类型可能不同。在上例中,WBUFFER是WORD类型,而BUFFER是BYTE类型。因此,在程序中,使用不同的变量名,就会有不同的属性:
    如果使用WBUFFER,就会按照WORD来访问;如果使用BUFFER,就会按照BYTE来访问。

    回过头来看:

    MOV AX, word ptr BUFFER 和 MOV AX, WBUFFER 这二者是等效的。 前者使用了强制属性转换将字节型的BUFFER转换为字类型;后者是利用THIS设置的字类型的别名。

 

 

 

同样的别名引用,但是因为属性设置不同,则访问的方式也不同了

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值