1

私は32ビットx86アセンブラーで書いていますが、コードと常に同じ関係にあるデータをアドレス指定する方法がよくわかりません。絶対アドレスを計算するためにEIPを使用する必要がありますか、それともより良い方法がありますか?

4

2 に答える 2

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
于 2010-09-16T05:28:31.553 に答える
0

OS依存。通常、セグメント レジスタ DS (データ セグメント) と CS (コード セグメント) は異なる値を持っています。したがって、次のような cs プレフィックスを使用できます。

mov    edx, cs:[eax]

その場合、デフォルトのプレフィックスは ds セグメント レジスタです。

于 2010-09-13T15:17:42.057 に答える