web-dev-qa-db-ja.com

16ビットアセンブリコードのオフセットとはどういう意味ですか?

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

アセンブラは、foo0100hのベースからのオフセットdata SEGMENTにあることを認識しているため、offset fooが存在する場合は常に、0100hの値に関係なくそのときのDSの値。

たとえば、DSdataセグメントのベース以外のものに変更すると、アセンブラは次のことを想定します。

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を指すことと同じであることを意味します。

20
Nathan Fellman

それは単にそのシンボルのアドレスを意味します。慣れていれば、Cの&演算子に少し似ています。

9
copumpkin

offsetは、siレジスタが変数のオフセットと等しくなることを意味しますvalue1(実際の値ではありません)。オフセットは、変数が格納されているメモリセグメントの先頭からのアドレスです。オフセットは通常dsセグメントに相対的です(あなたの場合dscsレジスターは同じセグメントを指しています)。

3
Alexey Kalmykov

From MASM Programmer's Guide 6.1 (Microsoft Macro Assembler)

[〜#〜] offset [〜#〜]演算子

アドレス定数は、オフセットまたはセグメント値で構成される特殊な即値オペランドです。次に示すように、OFFSET演算子はメモリ位置のオフセットを返します。

    mov     bx, OFFSET var  ; Load offset address

MASM 5.1の動作とOFFSETに関連するMASM 6.1の動作の違いについては、付録Aを参照してください。

異なるモジュールのデータは単一のセグメントに属している可能性があるため、アセンブラは、各モジュールについて、セグメント内の実際のオフセットを知ることができません。したがって、varのオフセットは、即値ではありますが、リンク時まで決定されません。

注意深く読んだ場合、DLL/EXEを作成するためにオブジェクトコードを「リンク」した後、最終的な値が決定されます。リンクする前は、セグメントのベースアドレスからのオフセットを表す即時値しかありません。

2
user10058428

オフセットは基本的に、セグメントポイント(データムポイントとも呼ばれます)からの距離です。たとえば、セグメントアドレスが0000で、オフセットまたは論理アドレスが0100の場合、2つのペアを追加することで物理アドレスをカウントできます。物理アドレス= 0000 + 0100 = 0100必要な場所が0100のアドレスであることを意味します。同様に、セグメントアドレスが1DDDでオフセットが0100の場合、物理アドレスは:1DDD + 0100 = 1EDDです。

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

1
user2961595

X86 16ビットモードでは、アドレス空間はフラットではありません。代わりに、アドレスはオフセットと「セグメント」で構成されます。 「セグメント」は64Kスペースを指し、オフセットはそのスペース内にあります。

参照 http://en.wikipedia.org/wiki/Memory_segmentation

1