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
register は変数value1のオフセット(実際の値ではありません)si
と等しくなることを意味します。オフセットは、変数が格納されているメモリ セグメントの先頭からのアドレスです。オフセットは通常、セグメントに相対的です(あなたの場合、レジスタは同じセグメントを指しています)。ds
ds
cs
x86 16 ビット モードでは、アドレス空間はフラットではありません。代わりに、アドレスはオフセットと「セグメント」で構成されます。「セグメント」は 64K スペースを指し、オフセットはそのスペース内にあります。