うな形のオフセット16ビットの組み立てコードを意味するのか。
質問
私は一例で組み立てのコードを16-bitリアルモードになります。
私のライン:
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
レジスタは可変のオフセット値1 の(ない実際の値)に等しくなることを意味します。オフセット変数が格納されているメモリセグメントの先頭からのアドレスです。オフセットは通常ds
セグメント(あなたのケースでds
とcs
レジスタは同一のセグメントを指している)に対するものである。
から MASMプログラマーズガイド6.1 (マイクロソフトマクロアセンブラ)
の オフセット オペレーター
住所定することはできず、当面のオペランドからのオフセット又はセグメント値です。のオフセットオペレーターのオフセットを返しますaメモリ位置を明示的に定義しています。
mov bx, OFFSET var ; Load offset address
のための情報の違いMASM5.1動MASM6.1行動の関係のオフセット"付録A"を参照してください。
以降のデータを異なるモジュールに属する単一セグメント、アセンブラを知ることはできないための各モジュールの真のオフセット内のセグメントこれにより、オフセットのためのvarは、直ちに価値が決まるまでのリンク。
だをよくお読みになり、最終値が決定した後、"リンク"をごオブジェクトコードをDLL/EXE.以前のリンクはすべてあなたが直ちに価値を表すオフセットからセグメントのベースアドレスです。
は、x86 16ビット・モードでは、アドレススペースは、平坦ではありません。代わりに、アドレスオフセット及び「セグメント」から構成されています。オフセット64K空間に「セグメント」の点は、その空間内にあります。
オフセット基本的区分点(とも呼ばれる基準点)からの距離です。 例えば、セグメントアドレスは0000であり、オフセットまたは論理アドレスが物理アドレスは、2つのペアを追加することによって計数することができる0100です。 物理アドレス= 0000 + 0100 = 0100 私たちの必要な場所には0100のアドレスにあることを意味します。 セグメントアドレスが1DDD、オフセット同様ならば、0100です。 物理アドレスは次のとおりです。1DDD + 0100 = 1EDD
私たちの目的地が1EDDであることを意味します。