16ビットリアルモードのアセンブリコードの例をいくつか見ていきます。
私は線に出くわしました:
mov bx, cs
mov ds, bx
mov si, OFFSET value1
pop es
mov di, OFFSET value2
これは何をしていますか?そこに「オフセット」があるとどうなりますか?
他の回答のいくつかが言うように、offset
キーワードはそれが定義されているセグメントからのオフセットを指します。ただし、セグメントがオーバーラップし、あるセグメントのオフセットが別のセグメントで異なる場合があることに注意してください。たとえば、リアルモードで次のセグメントがあるとします。
data SEGMENT USE16 ;# at segment 0200h, linear address 2000h
org 0100h
foo db 0
org 01100h
bar db 0
data ENDS
アセンブラは、foo
が0100h
のベースからのオフセットdata SEGMENT
にあることを認識しているため、offset foo
が存在する場合は常に、0100h
の値に関係なくそのときのDS
の値。
たとえば、DS
をdata
セグメントのベース以外のものに変更すると、アセンブラは次のことを想定します。
mov ax, 200h ; in some assemblers you can use @data for the seg base
mov ds, ax
mov bx, offset foo ; bx = 0100h
mov byte ptr [bx], 10 ; foo = 10
mov ax, 300h
mov ds, ax
mov bx, offset foo ; bx = 0100h
mov byte ptr [bx], 10 ; bar = 10, not foo, because DS doesn't match what we told the assembler
2番目の例では、DS
は0300h
であるため、DS
が指すセグメントのベースは03000h
です。これは、ds:[offset foo]
がアドレス03000h + 0100h
を指し、これが02000h + 01100h
がbar
を指すことと同じであることを意味します。
それは単にそのシンボルのアドレスを意味します。慣れていれば、Cの&演算子に少し似ています。
offset
は、si
レジスタが変数のオフセットと等しくなることを意味しますvalue1(実際の値ではありません)。オフセットは、変数が格納されているメモリセグメントの先頭からのアドレスです。オフセットは通常ds
セグメントに相対的です(あなたの場合ds
とcs
レジスターは同じセグメントを指しています)。
From MASM Programmer's Guide 6.1 (Microsoft Macro Assembler)
[〜#〜] offset [〜#〜]演算子
アドレス定数は、オフセットまたはセグメント値で構成される特殊な即値オペランドです。次に示すように、OFFSET演算子はメモリ位置のオフセットを返します。
mov bx, OFFSET var ; Load offset address
MASM 5.1の動作とOFFSETに関連するMASM 6.1の動作の違いについては、付録Aを参照してください。
異なるモジュールのデータは単一のセグメントに属している可能性があるため、アセンブラは、各モジュールについて、セグメント内の実際のオフセットを知ることができません。したがって、varのオフセットは、即値ではありますが、リンク時まで決定されません。
注意深く読んだ場合、DLL/EXEを作成するためにオブジェクトコードを「リンク」した後、最終的な値が決定されます。リンクする前は、セグメントのベースアドレスからのオフセットを表す即時値しかありません。
オフセットは基本的に、セグメントポイント(データムポイントとも呼ばれます)からの距離です。たとえば、セグメントアドレスが0000で、オフセットまたは論理アドレスが0100の場合、2つのペアを追加することで物理アドレスをカウントできます。物理アドレス= 0000 + 0100 = 0100必要な場所が0100のアドレスであることを意味します。同様に、セグメントアドレスが1DDDでオフセットが0100の場合、物理アドレスは:1DDD + 0100 = 1EDDです。
目的地が1EDDであることを意味します。
X86 16ビットモードでは、アドレス空間はフラットではありません。代わりに、アドレスはオフセットと「セグメント」で構成されます。 「セグメント」は64Kスペースを指し、オフセットはそのスペース内にあります。