2009-11-03 5 views
13

私は、16ビットリアルモード用のアセンブリコードをいくつか見ていきます。16ビットアセンブリコードのオフセットは何を意味しますか?

私はラインに遭遇しました:これは何を

mov bx, cs 
    mov ds, bx 
    mov si, OFFSET value1 
    pop es 
    mov  di, OFFSET value2 

しているのですか? 「OFFSET」は何をしていますか?

ごめんなさい、非常に基本的な質問ですが、私はこれで初めてです。

答えて

15

他の回答の中には、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になります。

DS0300hであるため、DSが指すセグメントのベースは03000hです。つまり、ds:[offset foo]は、アドレス03000h + 0100hを指し、02000h + 01100hと同じであり、barを指していることを意味します。

編集:

6

ただそのシンボルのアドレスを意味します。 Cの中の&オペレータのようなものです。

1

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

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

3

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

1

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

手段私たちの目的地は1EDDです。

関連する問題