我对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
他在哪里达到这些价值观?请帮忙。非常感谢你!
答案 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”是内存段或块或元素,此段中的变量是数据项或偏移量。此偏移量是非连续区域物理空间的虚拟地址因此,这个数字代表物理内存非连续区域空间的虚拟地址。