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オフセットされていることを確認します。したがって、アセンブラは、その時点の値に関係なく、それが表示される場所に値を配置します。 0100hdata SEGMENToffset foo0100hDS
たとえば、セグメントの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 + 0100h02000h + 01100hbar
そのシンボルのアドレスを意味するだけです。C の & 演算子に慣れている場合は、少し似ています。
offsetregister は変数value1のオフセット(実際の値ではありません)siと等しくなることを意味します。オフセットは、変数が格納されているメモリ セグメントの先頭からのアドレスです。オフセットは通常、セグメントに相対的です(あなたの場合、レジスタは同じセグメントを指しています)。dsdscs
x86 16 ビット モードでは、アドレス空間はフラットではありません。代わりに、アドレスはオフセットと「セグメント」で構成されます。「セグメント」は 64K スペースを指し、オフセットはそのスペース内にあります。