2009-05-29 8 views
6

Ich sehe Code wie:Warum hat die Anweisung mov ax direkt anstelle von zwei Segmentregistern?

mov ax, cs 
mov ds, ax 
mov es, ax 

Warum kann ich nicht komprimieren dies nur zu:

mov ds, cs 
mov es, cs 

ist der erste Weg schneller, da seine Verwendung der Speicher registrieren? Aber das scheint nicht intuitiv, da cs und ds Segment Register sind. Oder gibt es Einschränkungen, die mir nicht bewusst sind?

Ich benutze übrigens nasm.

Antwort

9

Sie können das Segmentregister nicht in das Segmentregister verschieben - es gibt keine Anweisung dafür.

+0

Wenn ich. Lies zuerst deine Antwort, die ich nicht belügt habe ieve you, aber in der NASM-Dokumentation, sicher genug, keine mov reg_dseg, reg_cseg Anweisung. – samoz

+0

Dies ist nicht der Grund, es ist das Ergebnis. –

+1

Was? Ich verstehe nicht, was du meinst Neil. – samoz

1

Es gibt nur so viel Platz in einem Prozessor für den Mikrocode für alle seine Anweisungen. So wird eine allgemeine Anweisung oft gegenüber mehreren speziellen Zwecken für selten verwendete Operationen bevorzugt, die Segmentregister ändern. Außerdem ist die Anzahl der Befehle für einige Prozessoren durch die Architektur absolut begrenzt - zum Beispiel war der ursprüngliche 8080-Prozessor auf 256 Befehle beschränkt, da alle den Op-Code in einem einzigen Byte codieren mußten.

+0

+1 für die Erklärung des Grundes hinter dem Grund – dss539

1

Es ist nicht die Assemblersprache, sondern die zugrundeliegende Maschinensprache, die diese Operationen verhindert.

Während die Montage aus leicht zu lesenden Wörtern oder Mnemonics besteht, repräsentieren sie eigentlich ziemlich direkt die 1s und 0s des Maschinencodes. Auf x86-CPUs besteht jeder Befehl typischerweise aus einer Sequenz von Bytes mit einzelnen Bytes oder sogar Bits innerhalb der Bytes mit Bedeutung. Bestimmte Bits stellen die Anweisung dar, andere stellen die addressing mode dar. In Registeradressierungsmodi wie Ihren Beispielen stellen einige Bits dar, welche spezifischen Register als Quelle und Ziel des Befehls mov verwendet werden sollen.

Die x86-Familie der Prozessoren reicht weit zurück in die 1970er Jahre, als die CPU-Architektur einfacher war. In diesen Tagen war das Konzept der von entscheidender Bedeutung - ax ist der 16-Bit-x86-Akku. Alle Berechnungen wurden in diesem Register aufgebaut oder "akkumuliert", so dass es für alle Anweisungen verfügbar war. Andere Allzweckregister hatten einen eingeschränkteren Anwendungsbereich.

Da die Anweisungen auf Bytes basierten, wollten Sie so wenige Bytes wie möglich, um eine Instruktionsdecodierung schnell zu halten. Um möglichst viele Befehle so kurz wie möglich zu halten, wird die Verwendung des Akkumulators zentral gemacht.

Auf moderneren CPUs wie dem Motorola 680x0 haben allgemeinere Register mehr Fähigkeiten, die früher die Domäne des Akkumulators waren. Auf RISC-CPUs sind alle Register so flexibel wie Akkumulatoren. Ich habe gehört, dass im 64-Bit-Modus der aktuelle x86/amd64-Befehlssatz jetzt viel weniger eingeschränkt ist.

+0

Nicht bis x86_64, die Register kann so verwendet werden. Seit 32-Bit x86 können die meisten Register mehr oder weniger als Allzweckregister fungieren. –

+0

Es scheint, als wäre mir nicht bewusst gewesen, dass die Frage sowohl die Segmentregister als auch den Akkumulator war. Ich bin nie in die x86-Assembly geraten, wegen der schrecklichen Art, wie der Speicher funktioniert, aber dann mit den Segmentregistern und so. Ich glaube, es ist viel schöner, jetzt zu arbeiten, als es ein schönes flaches Speichermodell gibt. – hippietrail

+0

Ich gehe nicht viel obwohl x86 Versammlung auch. Aber es gibt immer noch Segment-Anweisungen auf x86. Der Adressraum von x86 ist nicht flach –

1

Betrachten Sie die Spalte Intel Manual Volume 2 Instruction Set Reference - 325383-056US September 2015 "MOV Move" "Anweisung".

mov r/m16, Sreg 

Und „3.1.1:

Die einzigen 16-Bit-mov zu Registern in codiert.3 Instruction Spalte in der Opcode Übersichtstabelle“erläutert:

  • r/m16 - Ein Wort Allzweckregister oder Speicheroperanden verwendet, um Anweisungen, deren Operanden-size Attribut ist 16 Bits, die das Wort Allzweck- Register sind. :.. AX, CX, DX, BX, SP, BP, SI, DI
  • Sreg - ein Segmentregister

so ist mov ds, cs nicht codierbar, da es keine mov Sreg, Sreg Version ist