2010-09-13 67 views

回答

0

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

mov edx, cs:[eax] 

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

+0

我没有使用OS使用相同的与delta-偏移。我处于保护模式,所以有段描述符,而不是实际的段号。在我的情况下,只有两个段描述符,数据和代码(不包括空值)。 – 2010-09-13 20:34:58

1

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

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

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