20

16 ビット リアル モードのアセンブリ コードの例をいくつか見ていきます。

私は次の行に出くわしました:

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

これは何をしているのですか?そこに「オフセット」があることは何をしますか?

4

6 に答える 6

22

他の回答のいくつかが言うように、offsetキーワードはそれが定義されているセグメントからのオフセットを指します。ただし、セグメントがオーバーラップし、あるセグメントのオフセットが別のセグメントで異なる場合があることに注意してください。たとえば、リアルモードで次のセグメントがあるとします。

data SEGMENT USE16 ;# at segment 0200h, linear address 2000h

    org 0100h
    foo db 0

    org 01100h
    bar db 0

data ENDS

アセンブラは、それがのベースからfooオフセットされていることを確認します。したがって、アセンブラは、その時点の値に関係なく、それが表示される場所に値を配置します。 0100hdata SEGMENToffset foo0100hDS

たとえば、セグメントの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 + 0100h02000h + 01100hbar

于 2009-11-03T20:02:43.763 に答える
16

そのシンボルのアドレスを意味するだけです。C の & 演算子に慣れている場合は、少し似ています。

于 2009-11-03T19:38:15.817 に答える
3

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

于 2009-11-03T19:43:10.333 に答える
2

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

http://en.wikipedia.org/wiki/Memory_segmentationを参照してください。

于 2009-11-03T19:40:00.230 に答える