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

时间:2016-09-14 04:16:41

标签: assembly x86 nasm masm irvine32

我对OFFSET运算符的概念感到困惑。根据Kip R. Irvine的着作“x86处理器的汇编语言”一书,他将Offset Operator定义为操作符,它返回变量从其封闭段开始的距离。他还说Offset Operator返回数据标签的偏移量,它表示标签距数据段开头的距离(以字节为单位)。偏移量是多少?标签距数据段开头的距离是什么意思? 此外,他是否得出了这个结果:

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

.data
bVal  BYTE ?
wVal  WORD ?
dVal  DWORD ?
dVal2 DWORD ?

如果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

他在哪里达到这些价值观?请帮忙。非常感谢你!

2 个答案:

答案 0 :(得分:3)

在16位代码之外,在普通操作系统上,虚拟内存是平坦的,所有段都具有base = 0.

因此,OFFSET var提供var的地址作为即时地址,而不是从中加载,这只是一种复杂的方式。

mov esi, bVal          ; load from [bVal], in MASM syntax

mov esi, OFFSET bVal   ; esi= address of bVal
mov esi, [esi]         ; load from [bVal]

另请参阅Assembly difference between [var], and var了解MASM和NASM语法之间的区别。

答案 1 :(得分:1)

偏移理论意味着“偏移量是基于地址的地址位置的数量,以便转到特定的绝对地址。”因此,它看起来像一个索引(数据项或字段)数组(数据元素或块或帧)。偏移量表示数据项和数据元素之间的距离。元素的所有项目大小相同(通常以字节或单词给出)。

因此,在您的情况下,“。data”是内存段或块或元素,此段中的变量是数据项或偏移量。此偏移量是非连续区域物理空间的虚拟地址因此,这个数字代表物理内存非连续区域空间的虚拟地址。