ポインターとオフセットを C/C++ に変換する場合は、配列の観点から考えるのが最善です。配列では、通常、配列ポインターであるベース ポインターがあります。特定の値にアクセスする場合は、オフセットに変換されるインデックスを追加します。ここでは、インデックスとオフセットの間に 1:1 の関係があるため、最も単純なケースは char 配列です。
char p[100];
p[10] = 32;
10 はオフセットであり、「p」の値が 0x1000 であると仮定すると、値 45 が割り当てられるアドレスは 0x100A になります。
mov eax, 1000h
mov [eax+0ah], 20
次のケースは、int のサイズが 4 バイトの整数配列です。ここでは、インデックスを乗算する必要がありますが、これはコンパイラによって行われます。
int p[100];
p[10] = 32;
これは次のように変換されます。
mov eax, 1000h
mov edx, 0ah
mov [eax+edx*4], 20
したがって、ターゲット アドレスは 1000h + 10*4= 40 (28h) -> 1028h になります。
C++ では通常、クラスがあります。アセンブラーの観点からは、これは構造体と同じであるため、クラスのアドレスであるベースポインターがあり、オフセットはその特定のクラス/構造体の個々のメンバーをアドレス指定します。ただし、C/C++ で strcut/class を作成する場合、コンパイラはメンバー間にパディング バイトを追加できることに注意してください。これは、基本的に、メンバーからのオフセットが、 C/C++ コード。
iE
struct { char a; int b; } myStruct;
この場合の b のオフセットは、myStruct+1 ではなく myStruct+2(または 4) になる可能性が高くなります。これは、コンパイラがアラインメントを追加して偶数アドレスまたは DWORD アラインメント アドレスにする可能性が高いためです。