烦恼一般都是想太多了。

0%

关于汇编中的PTR操作符

每当看到 WORD PTR [EAX] 类似的代码的时候就很疑惑,这里的 WORD, PTR到底代表了什么意思呢?  PTR 表示是一个 Pointer 的意思么?很难分说得清。

PTR

在这个系列的地址中,对汇编有一些简单的指令的说明,其中就说到,有的时候我们会出现指令不明的情况,如:

.DATA
table1 WORD 20 DUP (0)
status BYTE 7 DUP (1)
..
mov EBX, OFFSET table1
mov ESI, OFFSET status
mov [EBX], 100
mov [ESI], 100

对于我们最后的两个指令来说,[] 其应该是对 EBS/ESI 内存储的地址指向人内存写入 byte 大小,还是 word 大小。

所以这个时候就必须使用 WORD PTR, BYTE PTR 这两个类型修饰符来进行说明

mov	WORD PTR [EBX], 100
mov BYTE PTR [ESI], 100

其作用,是用来指明我们在一个内存操作的时候,要进行内存操作的大小是多少。

通常, PTR 操作符强制将表达式被当做一个特定类型的指针使用。

事实上,,PTR 要表达就是:取地址的意思

.DATA
num DWORD 0
.CODE
mov ax, WORD PTR [num]; Load a word-size value from a DWORD

这个所表达的确切意思应该是:num 地址处的数据是 WORD 大小,取得他的地址

[]

这个操作符,有的地方把它叫做索引操作符,当我们把它应用到一个 直接内存操作数 时它和 操作符 + 工作得一样。

mov	ax, array[ 2 ]
mov ax, array + 2

都是将内存 array 的第二个 WORD 值放到寄存器 ax 内。

[]操作符内可以放入任何的直接内存操作数。如,

mov 	ax, var
mov ax, [var]

是等价的。

但是,建议的是,总是将内存地址放在 [] 内,用来表示我们是需要其地址处的内容,而不是地址本身。