私は、16ビットリアルモード用のアセンブリコードをいくつか見ていきます。16ビットアセンブリコードのオフセットは何を意味しますか?
私はラインに遭遇しました:これは何を
mov bx, cs
mov ds, bx
mov si, OFFSET value1
pop es
mov di, OFFSET value2
しているのですか? 「OFFSET」は何をしていますか?
ごめんなさい、非常に基本的な質問ですが、私はこれで初めてです。
私は、16ビットリアルモード用のアセンブリコードをいくつか見ていきます。16ビットアセンブリコードのオフセットは何を意味しますか?
私はラインに遭遇しました:これは何を
mov bx, cs
mov ds, bx
mov si, OFFSET value1
pop es
mov di, OFFSET value2
しているのですか? 「OFFSET」は何をしていますか?
ごめんなさい、非常に基本的な質問ですが、私はこれで初めてです。
他の回答の中には、offset
というキーワードが定義されているセグメントからのオフセットを参照するものがあります。ただし、セグメントが重なり、あるセグメントのオフセットが別のセグメントで異なる場合があります。たとえば、あなたがリアルモードで次のセグメント
data SEGMENT USE16 ;# at 02000h
org 0100h
foo db 0
org 01100h
bar db 0
data ENDS
があるとし、次のコードを見て:
mov ax, 2000h
mov ds, ax
mov bx, offset foo ; bx = 0100h
mov byte ptr [bx], 10 ; foo = 10
mov ax, 3000h
mov ds, ax
mov bx, offset foo; bx = 0100h
mov byte ptr [bx], 10 ; bar = 10
を
アセンブラはfoo
がであるが
data SEGMENT
のベースから
0100h
をオフセットすることを見ているので、どこ
offset foo
と表示されます。そのときの値は
DS
にかかわらず、値
0100h
になります。
DS
は0300h
であるため、DS
が指すセグメントのベースは03000h
です。つまり、ds:[offset foo]
は、アドレス03000h + 0100h
を指し、02000h + 01100h
と同じであり、bar
を指していることを意味します。
編集:
ただそのシンボルのアドレスを意味します。 Cの中の&オペレータのようなものです。
x86 16ビットモードでは、アドレススペースはフラットではありません。代わりに、アドレスはオフセットと「セグメント」で構成されます。 「セグメント」は64Kスペースを指し、オフセットはそのスペース内にある。
offset
を見るはsi
レジスタ変数VALUE1(ないその実際値)のオフセットに等しくなることを意味します。オフセットは、変数が格納されているメモリセグメントの先頭からのアドレスです。オフセットは通常、ds
セグメント(あなたのケースではds
とcs
のレジスタが同じセグメントを指している)に対して相対的です。
オフセットコードの論理エラーを修正し、基本的に区分点(とも呼ばれる基準点)からの距離です。 例えばセグメントアドレスが0000であり、オフセットまたは論理アドレスが0100である場合、物理アドレスは2つのペアを加算することによって計数することができる。 物理アドレス= + 0100 = 0100 0000 セグメントアドレスが1DDDあれば私達の必要な場所が同様0100 のアドレスであることを意味し、オフセットは、次に、0100である。 物理アドレスである:1DDD + 0100 = 1EDD
手段私たちの目的地は1EDDです。