2010-09-13 3 views
0

Я пишу 32-разрядный ассемблер x86, и я не совсем уверен, как обращаться к данным, которые всегда находятся в том же отношении к коду. Должен ли я использовать EIP для вычисления абсолютного адреса или есть лучший способ?Адресация данных с использованием относительных указателей (ассемблер x86-32)

ответ

0

В зависимости от ОС. Обычно имеют сегментные регистры DS (сегмент данных) и CS (кодовый сегмент) разные значения. Таким образом, вы можете использовать префикс CS как:

mov edx, cs:[eax] 

В этом случае префикс по умолчанию DS сегментный регистр.

+0

Я не использую ОС. Я в защищенном режиме, поэтому есть дескриптор сегмента, а не фактический номер сегмента. И в моем случае есть только два дескриптора сегмента, для данных и кода (не считая нулевого). –

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 

 Смежные вопросы

  • Нет связанных вопросов^_^