【问题标题】:OFFSET Operator in Assembly language for x86 Processors用于 x86 处理器的汇编语言中的偏移运算符
【发布时间】:2017-01-21 18:51:08
【问题描述】:

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

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

.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

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

【问题讨论】:

  • 看看每个变量 bVal、wVal、dVal、dVal2 由多少字节组成,并想象它们都一个接一个地放在内存中。然后查看 ESI = 的每个值。偏移量几乎说“给我标签的地址”。将偏移量 00404000h 视为任意并用于说明目的。

标签: assembly x86 nasm masm irvine32


【解决方案1】:

在 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]

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多