汇编语言PTR运算符:重写操作数的大小类型

admin 2023年2月24日10:27:41评论16 views字数 856阅读2分51秒阅读模式

PTR 运算符可以用来重写一个已经被声明过的操作数的大小类型。只要试图用不同于汇编器设定的大小属性来访问操作数,那么这个运算符就是必需的。

例如,假设想要将一个双字变量 myDouble 的低 16 位传送给 AXO 由于操作数大小不匹配,因此,汇编器不会允许这种操作:

.datamyDouble DWORD 12345678h.codemov ax,myDouble

但是,使用 WORD PTR 运算符就能将低位字(5678h)送入 AX:

mov ax,WORD PTR myDouble

为什么送入 AX 的不是 1234h ?因为,x86 处理器采用的是小端存储格式,即低位字节存放于变量的起始地址。如下图所示,用三种方式表示 myDouble 的内存布局:第一列是一个双字,第二列是两个字(5678h、1234h),第三列是四个字节(78h、56h、34h、12h)。

汇编语言PTR运算符:重写操作数的大小类型


不论该变量是如何定义的,都可以用三种方法中的任何一种来访问内存。比如,如果 myDouble 的偏移量为 0000,则以这个偏移量为首地址存放的 16 位值是 5678h。同时也可以检索到 1234h,其字地址为 myDouble+2,指令如下:

mov ax,WORD PTR [myDouble+2]     ; 1234h

同样,用 BYTE PTR 运算符能够把 myDouble 的单个字节传送到 BL:

mov b1,BYTE PTR myDouble       ; 78h

注意,PTR 必须与一个标准汇编数据类型一起使用,这些类型包括:BYTE、SEYTE、WORD、SWORD、DWORD、SDWORD、FWORD、QWORD 或 TBYTE。

将较小的值送入较大的目的操作数

程序可能需要将两个较小的值送入一个较大的目的操作数。如下例所示,第一个字复制到 EAX 的低半部分,第二个字复制到高半部分。而 DWORD PTR 运算符能实现这种操作:


.datawordList WORD 5678h,1234h.codemov eax, DWORD PTR wordList      ; EAX = 12345678h



汇编语言PTR运算符:重写操作数的大小类型


原文始发于微信公众号(汇编语言):汇编语言PTR运算符:重写操作数的大小类型

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年2月24日10:27:41
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   汇编语言PTR运算符:重写操作数的大小类型http://cn-sec.com/archives/1569163.html

发表评论

匿名网友 填写信息