質問

私は一例で組み立てのコードを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

アセンブラはそのfoo0100hのベースからのオフセット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の例ではDS0300hので、セグメントのベースはDSによって指さは03000hあります。これはds:[offset foo]を指す03000h + 0100h、同じであるアドレス02000h + 01100hbarポイントことを意味する。

他のヒント

それはちょうどそのシンボルのアドレスを意味しています。あなたはそれに精通している場合は、ビットCでの&演算子のようなものです。

offsetsiレジスタは可変のオフセット値1 の(ない実際の値)に等しくなることを意味します。オフセット変数が格納されているメモリセグメントの先頭からのアドレスです。オフセットは通常dsセグメント(あなたのケースでdscsレジスタは同一のセグメントを指している)に対するものである。

から MASMプログラマーズガイド6.1 (マイクロソフトマクロアセンブラ)

オフセット オペレーター

住所定することはできず、当面のオペランドからのオフセット又はセグメント値です。のオフセットオペレーターのオフセットを返しますaメモリ位置を明示的に定義しています。

    mov     bx, OFFSET var  ; Load offset address

のための情報の違いMASM5.1動MASM6.1行動の関係のオフセット"付録A"を参照してください。

以降のデータを異なるモジュールに属する単一セグメント、アセンブラを知ることはできないための各モジュールの真のオフセット内のセグメントこれにより、オフセットのためのvarは、直ちに価値が決まるまでのリンク。

だをよくお読みになり、最終値が決定した後、"リンク"をごオブジェクトコードをDLL/EXE.以前のリンクはすべてあなたが直ちに価値を表すオフセットからセグメントのベースアドレスです。

は、x86 16ビット・モードでは、アドレススペースは、平坦ではありません。代わりに、アドレスオフセット及び「セグメント」から構成されています。オフセット64K空間に「セグメント」の点は、その空間内にあります。

http://en.wikipedia.org/wiki/Memory_segmentationする

オフセット基本的区分点(とも呼ばれる基準点)からの距離です。 例えば、セグメントアドレスは0000であり、オフセットまたは論理アドレスが物理アドレスは、2つのペアを追加することによって計数することができる0100です。 物理アドレス= 0000 + 0100 = 0100 私たちの必要な場所には0100のアドレスにあることを意味します。 セグメントアドレスが1DDD、オフセット同様ならば、0100です。 物理アドレスは次のとおりです。1DDD + 0100 = 1EDD

私たちの目的地が1EDDであることを意味します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top