Адресация данных с использованием относительных указателей (ассемблер x86-32) - PullRequest
1 голос
/ 13 сентября 2010

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

Ответы [ 2 ]

1 голос
/ 16 сентября 2010

Вы можете использовать независимый от позиции код:

   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
0 голосов
/ 13 сентября 2010

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

mov    edx, cs:[eax]

В этом случае префиксом по умолчанию является регистр сегмента ds.

...