Frage

Ich entschied mich Assemblersprache zu unterrichten.

Ich habe erkannt, dass mein Programm nicht kompiliert, wenn ich den Wert jedes Segmentregister zu ändern versuchen.

Jeder Artikel, die ich gefunden habe, sagt, dass ich in der Tat den Wert von mindestens 4 Segmentregister ändern können, so was gibt?

Ich bin wirklich daran interessiert sind nur in die, warum an dieser Stelle ich bei der Änderung dieser Adressen keinen wirklichen Zweck haben.

War es hilfreich?

Lösung

Sie sagten, Sie interessierten sich, warum so:

in Realmodus, ein Segment ist ein 64K „Fenster“ auf dem physischen Speicher und diese Fenster sind 16 Bytes voneinander beabstandet sind. Im geschützten Modus ist ein Segment, ein Fenster zu physischen oder virtuellen Speichern, Größe und Lage, deren durch das Betriebssystem bestimmt und viele andere Eigenschaften, inklusive welcher Berechtigungsstufe ein Prozess zugreifen muß es muss.

Von hier an alles, was ich sagen bezieht sich auf den geschützten Modus.

Es gibt eine Tabelle im Speicher der globale Deskriptortabelle (GDT) genannt, das ist, wo die Informationen über diese Fenstergrößen und Standorte und andere Eigenschaften gehalten werden. Es gibt auch lokale Descriptor Tabellen auf einer Basis pro Prozess sein kann, und sie arbeiten in einer ähnlichen Art und Weise, so dass ich nur konzentrieren sich auf die GDT.

Der Wert, den Sie in ein Segmentregister geladen ist bekannt als ein Segment-Selektor . Es ist ein Index in die GDT oder LDT, mit einem wenig zusätzlichen Sicherheitsinformationen. Selbstverständlich, wenn ein Programm versucht, einen Deskriptor zu laden, die außerhalb der Grenzen des GDT ist, tritt eine Ausnahme. Auch wenn der Prozess nicht genug Privileg hat, um das Segment zugreifen, oder etwas anderes ist ungültig, eine Ausnahme auftritt.

Wenn eine Ausnahme auftritt, wird der Kernel behandelt sie. Diese Art der Ausnahme wäre wahrscheinlich als Segmentierungsfehler eingestuft werden. Also das O tötet Ihr Programm.

Es gibt eine letzte Einschränkung: in dem x86-Befehlssatz, können Sie nicht sofort Werte in Segmentregister geladen werden. Sie müssen ein Zwischenregister oder einen Speicheroperanden oder POP in das Segmentregister verwendet werden.

MOV DS, 160  ;INVALID - won't assemble

MOV AX, 160  ;VALID - assembles, but will probably result in an
MOV DS, AX   ;exception, and thus the death of your program

Ich denke, es sollte darauf hingewiesen werden, dass die Architektur für die Halden von Segmenten ermöglicht. Aber AFAIK, wenn es um die Betriebssysteme Mainstream x86 kommt, Segmentregister dienen nur wenige Zwecke:

  • Sicherheitsmechanismen, wie User-Space Prozesse von halten sie oder das Betriebssystem zu schädigen
  • Der Umgang mit mehreren / Multi-Core-Prozessoren
  • Thread-lokalen Speicher: als Optimierung, einige Betriebssysteme (einschließlich Linux und Windows) verwenden Segmentregister für Thread-Local Storage (TLS). Da Threads den gleichen Adressraum teilen, ist es schwer für einen Thread zu „wissen“, wo seine TLS Region ist ein Systemaufruf oder verschwenden ein Register, ohne ... aber da gibt es Registern Segment praktisch nutzlos, kein Schaden in „verschwenden“ sie im Interesse des schnellen TLS. Beachten Sie, dass, wenn diese Einrichtung, ein Betriebssystem die Segmentregister überspringen könnte und schreiben Sie direkt an Deskriptorcache Register, die „versteckte“ Register verwendet zwischenzuspeichern die GDT / LDT-Lookups sind ausgelöst durch Verweise auf die Segmentregister, in dem Fall, wenn Sie versuchen, aus dem Segment lesen registriert Sie es nicht sehen.

Neben einem Segment pro Thread für TLS, wirklich nur eine Handvoll von Segmenten (multipliziert mit der Anzahl der Prozessoren) verwendet werden, und nur durch das Betriebssystem. Anwendungsprogramme können vollständig ignorieren die Segmentregister.

Dies ist auf OS-Design, nicht alle technischen Beschränkungen. Es können Betriebssysteme eingebettet werden, die mit den Segmentregister arbeiten User-Space-Programme erfordern, obwohl ich weiß nicht, irgend.

Andere Tipps

Sind Sie ausführbare Windows-Dateien zu schreiben?

In Protected-Mode (Win32), Segmentregister werden nicht mehr verwendet wird.

Referenz :

  

Speichermodell ist auch drastisch   unterscheidet sich von den alten Tagen des   16-Bit-Welt. Unter Win32, brauchen wir nicht   mit Speichermodell betroffen sein oder   Segment mehr! Es gibt nur einen   Speichermodell: Flachspeichermodell.   Es gibt keine mehr 64K Segmente. Das   Speicher ist eine große zusammenhängende Fläche von   4GB. Das bedeutet auch Sie nicht haben   mit Segmentregistern zu spielen. Sie   verwenden kann jedes Segmentregister zu   jeden Punkt in dem Speicherraum adressieren.   Das ist eine große Hilfe für Programmierer.   Das macht Win32 Assembler   Programmierung so einfach wie C.

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