1

我正在用 32 位 x86 汇编器编写,我不太确定如何处理始终与代码具有相同关系的数据。我必须使用EIP来计算绝对地址,还是有更好的方法?

4

2 回答 2

1

您可以使用与位置无关的代码:

   call @f
   dd 42 ; data
@@:
   pop eax ; eax contains offset of data
   mov eax, cs:[eax]

或将其与 delta-offsets 一起使用

   call base
base:
   pop ebp
   sub ebp, base ; to use small offsets, -128 to +127, and smaller instruction size
   ;....
   mov eax, cs:[ebp+dataN-base] ; dataN-base is called "delta-offset"
   ;....
data1:
   dd 100
   ;....
dataN:
   dd 200
于 2010-09-16T05:28:31.553 回答
0

取决于操作系统。通常有段寄存器DS(数据段)和CS(代码段)不同的值。所以你可以使用cs前缀,如:

mov    edx, cs:[eax]

在这种情况下,默认前缀是 ds 段寄存器。

于 2010-09-13T15:17:42.057 回答