2009-11-03 10 views
13

Ich gehe durch ein Beispiel Assembler-Code für 16-Bit-Real-Modus.Was bedeutet OFFSET im 16-Bit Assembly-Code?

Ich habe über die Linien kommen:

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

was dies zu tun ist? Was hat "OFFSET" dort zu tun?

Sorry, wenn es eine sehr grundlegende Frage ist, bin ich neu hier.

Antwort

15

Wie einige der anderen Antworten sagen, bezieht sich das Schlüsselwort offset auf den Offset des Segments, in dem es definiert ist. Beachten Sie jedoch, dass Segmente sich überlappen können und der Offset in einem Segment in einem anderen Segment unterschiedlich sein kann. Zum Beispiel: Angenommen, Sie das folgende Segment im Real-Modus

data SEGMENT USE16 ;# at 02000h 

    org 0100h 
    foo db 0 

    org 01100h 
    bar db 0 

data ENDS 

und Blick auf den folgenden Code haben:

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 

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

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

edit: korrigierten logische Fehler in Code

6

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

1

Im 16-Bit-16-Bit-Modus ist der Adressraum nicht flach; stattdessen bestehen die Adressen aus einem Offset und einem "Segment". Das "Segment" zeigt auf ein 64K-Space, der Offset ist innerhalb dieses Space.

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

3

offset bedeutet, dass si Register auf den Offset des variablen Wert1 gleich sein (nicht in seine Ist-Wert). Offset ist die Adresse vom Anfang des Speichersegments, in dem die Variable gespeichert ist. Der Offset ist normalerweise relativ zu ds Segment (in Ihrem Fall ds und cs Register zeigen auf das gleiche Segment).

1

Offset ist im Grunde der Abstand von dem Segmentpunkt (auch Bezugspunkt genannt). zum Beispiel ist die Segmentadresse 0000 und die Offset- oder logische Adresse ist 0100, dann kann die physikalische Adresse durch Hinzufügen der zwei Paare gezählt werden. Physical Address = 0000 + 0100 = 0100 bedeutet, dass unsere gewünschten Ort auf der Adresse 0100. ist Ebenso, wenn Segmentadresse 1DDD und Offset ist 0100 dann: Physikalische Adresse lautet: 1DDD + 0100 = 1EDD

Means dass unser Ziel 1EDD ist.