Frage

I für 16-Bit-Real-Modus durch einig Beispiel Assembler-Code werde.

Ich habe über die Linien kommen:

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

was tut das? Was bedeutet hat es ‚OFFSET‘ tun?

War es hilfreich?

Lösung

Wie einige der anderen Antworten sagen, das offset Stichwort aus dem Segment auf den Offset bezieht, in der sie definiert ist. Beachten Sie jedoch, dass die Segmente sich überlappen können und die in einem Segment-Offset kann in einem anderen Segment verschieden sein. Zum Beispiel: Angenommen, Sie das folgende Segment im Real-Modus haben

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

    org 0100h
    foo db 0

    org 01100h
    bar db 0

data ENDS

Der Assembler sieht, dass foo bei Offset 0100h von der Basis der data SEGMENT ist, so, wo immer es offset foo sieht, wird es den Wert 0100h setzen, unabhängig vom Wert von DS zu der Zeit.

Zum Beispiel, wenn wir DS auf etwas anderes als die Basis des data Segment ändert sich der Assembler geht davon aus:

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

Im zweiten Beispiel ist DS 0300h, so dass die Grundfläche des Segments, auf dem durch DS 03000h ist. Dies bedeutet, dass ds:[offset foo] zeigt auf die Adresse 03000h + 0100h die die gleiche wie 02000h + 01100h ist, die bar verweist.

Andere Tipps

Es bedeutet nur, die Adresse dieses Symbols. Es ist ein bisschen wie der Operator & in C, wenn Sie damit vertraut sind.

offset bedeutet, dass si Register auf den Offset der Variablen gleich sein Wert1 (nicht seinen Istwert). Offset ist die Adresse vom Anfang des Speichersegments in dem die Variable gespeichert wird. Der Versatz ist in der Regel relativ Segment ds (in Ihrem Fall ds und cs Register weisen auf das gleiche Segment).

Von MASM Programmierhandbuch 6.1 (Microsoft Macro Assembler)

  

Der OFFSET Operator

     

Adresse Konstante ist eine spezielle Art von unmittelbaren Operanden, die eine Offset oder Segmentwert bestehen. Der Operator OFFSET den Offset einer Speicherstelle zurückkehrt, wie hier gezeigt:

    mov     bx, OFFSET var  ; Load offset address
     

Weitere Informationen über Unterschiede zwischen MASM 5.1 Verhalten und MASM 6.1 Verhalten im Zusammenhang mit OFFSET finden Sie in Anhang A.

     

Da die Daten in verschiedenen Modulen zu einem einzigen Segment gehören können, kann der Assembler nicht für jedes Modul kennt die wahren Offsets innerhalb eines Segments. Somit ist die für var ausgeglichen, wobei bei einem unmittelbaren Wert, erst Link Zeit bestimmt wird.

Wenn Sie genau lesen, wird der Endwert bestimmt, nachdem Sie „Link“ Ihr Objektcode eine DLL / EXE zu erstellen. Vor der Verknüpfung, alles, was Sie haben, ist ein unmittelbarer Wert, der die von der Segmentbasisadresse Offset darstellt.

In x86 16-Bit-Modus-Adressraum ist nicht flach; Stattdessen werden die Adressen einer versetzten zusammengesetzt und ein „Segment“. Das „Segment“ zeigt auf einen 64K-Raum, Offset ist in diesem Raum.

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

Offset ist im Grunde der Abstand von dem Segmentpunkt (auch als Bezugspunkt). beispielsweise ist Segmentadresse 0000 und die Offset oder logische Adresse 0100 dann die physikalische Adresse durch Addieren der zwei Paare gezählt werden. Physikalische Adresse = 0000 + 0100 = 0100 Bedeutet, dass unsere gewünschten Ort auf der Adresse von 0100 ist. Ebenso, wenn die Segmentadresse 1DDD ist und Offset ist dann 0100: Physikalische Adresse lautet: 1DDD + 0100 = 1EDD

Bedeutet, dass unser Ziel ist 1EDD.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top