"DWORD can be used to declare a variable that contains the 32-bit offset of another variable" 是什么意思?

What does it mean that "DWORD can be used to declare a variable that contains the 32-bit offset of another variable"?

我目前正在按照 Kip Irvine 的 "assembly language x86 programming" 书学习汇编编程。

我知道 SDWORD 可用于将 32 位值分配给变量,例如

myVariable SDWORD -2147483648 
; assign the minimum negative number -2147483648 that can be contained within a SDWORD
; to variable named myVariable

但是在书中,作者还写了

The DWORD can be used to declare a variable that contains the 32-bit offset of another variable. Below, pVal contains the offset of val3:

pVal DWORD val3

我不太清楚这句话是什么意思?有人可以向我解释一下吗?特别是作者32 bit offset of another variable是什么意思?

(Jester 基本上已经在评论中回答了这个问题,但为了完整起见,我将 post 这是一个实际答案。)

您已经知道 DWORD 可用于声明 32 位变量,因为这是 x86 上双字的大小。所以唯一令人困惑的部分是 "offset of another variable".

的含义

在这种情况下,这只是该变量的 地址 的另一种说法,因为在平面(非分段)32 位内存模型中,段(又名base) 始终为 0,这意味着偏移量是唯一真正对地址有贡献的部分。

如果您熟悉 C 语言中的指针,那么他只是说您可以使用 DWORD 来存储指向另一个变量的指针。在 32 位 x86 上,指针的长度始终为 32 位,因此无论 type/size 的变量是什么,您总是 使用 DWORD 来存储指针它指向。您甚至可以使用它来存储指向函数(的地址)的指针。

但是请注意,您最初标记了问题 。在 64 位长模式中,指针是 而不是 32 位——它们是 64 位。因此,您不能使用 DWORD 来保存另一个变量的 address/pointer/offset。您需要使用 QWORD,这是一个 quad 字,长度为 64 位,与指针大小相同。