Was in 16-Bit-Assembler-Code OFFSET bedeutet?
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?
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.
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.