汇编语言OFFSET运算符:返回数据标号的偏移量

OFFSET 运算符返回数据标号的偏移量。这个偏移量按字节计算,表示的是该数据标号距离数据段起始地址的距离。如下图所示为数据段内名为 myByte 的变量。

汇编语言OFFSET运算符:返回数据标号的偏移量

OFFSET 示例

在下面的例子中,将用到如下三种类型的变量:

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

假设 bVal 在偏移量为 0040 4000(十六进制)的位置,则 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

OFFSET 也可以应用于直接 – 偏移量操作数。设 myArray 包含 5 个 16 位的字。下面的 MOV 指令首先得到 myArray 的偏移量,然后加 4,再将形成的结果地址直接传送给 ESI。因此,现在可以说 ESI 指向数组中的第 3 个整数。

  .data  myArray WORD 1,2,3,4,5  .code  mov esi,OFFSET myArray + 4

还可以用一个变量的偏移量来初始化另一个双字变量,从而有效地创建一个指针。如下例所示,pArray 就指向 bigArray 的起始地址:

  .data  bigArray DWORD 500 DUP (?)  pArray DWORD bigArray

下面的指令把该指针的值加载到 ESI 中,因此,这个 ESI 寄存器就可以指向数组的起始地址:

  mov esi,pArray

4.1 操作数类型
4.2 MOV指令
4.3 MOVZX和MOVSX指令
4.4 LAHF和SAHF指令
4.5 XCHG指令
4.6 直接偏移量操作数
4.7 汇编语言数据传送示例
4.8 加法和减法详解
4.9 OFFSET运算符
4.10 ALIGN伪指令
4.11 PTR运算符
4.12 TYPE运算符
4.13 LENGTHOF运算符
4.14 LABEL伪指令
4.15 间接寻址
4.16 JMP和LOOP指令
4.17 64位MOV指令
4.18 64位加法和减法

猜你喜欢

转载自blog.csdn.net/Javaxuxuexi/article/details/93401648