2016-08-09 43 views
1

Ich studiere Computerarchitektur vom Intel Handbuch. Die Sache, die ich verstehe, ist, dass die Anweisungen, die wir geben, logische Adressen sind, die aus einem Segmentselektor und einem Offset bestehen. Es ist im Grunde CS register<<4 + offset. Der Segment Selector bildet die GDT oder LDT wie im TI Bit des Segmentselektors angegeben. GDT besteht aus Segment Descriptors, die BASE, LIMIT und RPL haben und der Ausgang ist Basisadresse. Diese base address + offset liefert die logical address.Welches Segmentregister wird standardmäßig verwendet?

Welche Regeln bestimmen, welches Segmentregister (SS, DS usw.) für verschiedene Speicheroperationen gilt? z.B. Was bestimmt, welches Segment für mov eax, [edi] verwendet wird?

+0

Ihre Frage ist mir nicht klar, können Sie ein bisschen erklären? – Rupsingh

+0

im Grunde möchte ich wissen, wie dieses Datensegment, Stack-Segment für eine Prozedur zugeordnet wird. – ashish

+0

Dies kann helfen http://stackoverflow.com/questions/29785991/can-someone-help-me-with-segmentierung-and-8086-intels-microcessor – Rupsingh

Antwort

2

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 Tag Wiki für weitere Links.

+0

Wo befinden sich diese Segmente im Speicher? Lineare Adresse? Physikalische Adresse? – ashish

+1

@ashish: In den aktuellen 32-Bit-Betriebssystemen haben alle Segmente (außer FS und GS) base = 0, limit = 4GiB, was einen flachen Speicherplatz mit 'CS',' DS', 'SS' und' ES ergibt 'sind alle gleichwertig. Die Segmentübersetzung erfolgt vor der Übersetzung von virtueller in physische Adresse. Im Real-Modus indexieren Register nicht Deskriptoren, sie werden nur mit 16 multipliziert und zum Offset-Teil der Adresse hinzugefügt. –

+0

Und im langen Modus, d. H. X86_64-Modus? – ashish