x86 处理器汇编语言中的 OFFSET 运算符

gor*_*ung 1 x86 assembly masm nasm irvine32

我对 OFFSET 运算符的概念感到相当困惑。根据 Kip R. Irvine 的《x86 处理器汇编语言》一书,他将偏移运算符定义为返回变量与其封闭段开头之间的距离的运算符。他还说偏移运算符返回数据标签的偏移量,它表示标签与数据段开头的距离(以字节为单位)。什么是偏移量?他所说的标签到数据段开头的距离是什么意思?还有,他有没有得出这样的结果:

他声明了三种不同类型的变量:

.data
bVal  BYTE ?
wVal  WORD ?
dVal  DWORD ?
dVal2 DWORD ?
Run Code Online (Sandbox Code Playgroud)

如果 bVal 位于偏移量 00404000(十六进制),则 OFFSET 运算符将返回以下值:

mov esi, OFFSET bVal     ;ESI = 00404000h
mov esi, OFFSET wVal     ;ESI = 00404001h
mov esi, OFFSET dVal     ;ESI = 00404003h
mov esi, OFFSET dVal2    ;ESI = 00404007h
Run Code Online (Sandbox Code Playgroud)

他从哪里得出这些价值观?请帮忙。非常感谢!

Pet*_*des 5

在 16 位代码之外,在普通操作系统上,虚拟内存是平坦的,所有段的基数都为 0。

所以这只是一种复杂的说法,它OFFSET var为您提供var了立即数的地址,而不是从中加载。

mov esi, bVal          ; load from [bVal], in MASM syntax
Run Code Online (Sandbox Code Playgroud)

mov esi, OFFSET bVal   ; esi= address of bVal
mov esi, [esi]         ; load from [bVal]
Run Code Online (Sandbox Code Playgroud)

有关MASM 和 NASM 语法之间的差异另请参阅[var] 和 var之间的程序集差异。