使用相对指针寻址数据(x86-32汇编程序)

问题描述:

我正在写32位x86汇编程序,我不太清楚如何解决始终与代码具有相同关系的数据。我是否必须使用EIP来计算绝对地址,还是有更好的方法?使用相对指针寻址数据(x86-32汇编程序)

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

mov edx, cs:[eax] 

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

+0

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

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

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