Sie können ein Segment-Override-Präfix verwenden, um auszuwählen, welches Segment für den Speicheroperanden in einer Anweisung gelten soll.
Code abrufen verwendet immer CS
.
Die Standardeinstellung ist die meiste Zeit DS
(z. B. für mov eax, [edi]
). Einige Disassembler machen das Segment explizit, auch wenn es die Standardeinstellung ist. Daher sehen Sie eine Menge DS:
, die den Disassembly-Ausgang durcheinander bringt.
Die movs
instruction liest von [DS:ESI]
und schreibt zu [ES:EDI]
, so dass es einfach ist, zwischen Segmenten ohne Segment überschreiben Präfixe zu kopieren. Einige andere String-Anweisungen verwenden auch ES
.
Speicheroperanden esp
oder ebp
als Basisregister Standard SS
verwenden und so auch die impliziten Stapelzugriffe für Befehle wie push
/pop
/call
/ret
.
FS
und GS
sind nie die Standardeinstellung, so dass sie für besondere Zwecke verwendet werden (wie gewinde lokaler Speicher) in einem flachen Speicher Modellsystem wie moderne 32 und 64-Bit-OSes.
wikipedia explains the same thing here.
Dies spiegelt sich auch in Intel's ISA manuals offiziell dokumentiert. z.B. in Band 2 (Befehlssatzref), Tabelle 2-1. 16-Bit-Formen mit dem ModR/M-Byte hat eine Fußnote sagen Adressierung:
Der Standardsegmentregister SS ist für die effektiven Adressen enthalten, einen BP-Index, DS für andere effektive Adressen.
(beachten Sie, dass SP-Adresse für 16-Bit-Adressierung Modi keine gültige Basis.)
Es gibt keine entsprechende Fußnote für 32- oder 64-Bit-Modus-Adressierung, so dass die Details in einem anderen Volume sein müssen des Handbuchs.
Siehe auch das x86 Tag Wiki für weitere Links.
Ihre Frage ist mir nicht klar, können Sie ein bisschen erklären? – Rupsingh
im Grunde möchte ich wissen, wie dieses Datensegment, Stack-Segment für eine Prozedur zugeordnet wird. – ashish
Dies kann helfen http://stackoverflow.com/questions/29785991/can-someone-help-me-with-segmentierung-and-8086-intels-microcessor – Rupsingh