Frage

Ich sehe Code wie:

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

Warum kann ich nicht komprimieren nur dies:

mov ds, cs
mov es, cs

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

Ich verwende nasm durch die Art und Weise.

War es hilfreich?

Lösung

Sie können nicht mov Segment Segmentregister registrieren -. Es gibt keine Anweisung für sie

Andere Tipps

Es gibt nur so viel Platz in einem Prozessor für den Mikro für alle seine Anweisungen. So eine allgemeine Anweisung wird oft über mehrere Zweck diejenigen bevorzugt für selten uused Operationen See Ändern Segmentregister. Auch für einige Prozessoren der Anzahl der Befehle unbedingt durch die Architektur beschränkt ist - z. B. wurde der ursprüngliche 8080-Prozessor 256 Anweisungen beschränkt, da sie alle den OP-Code in einem einzigen Byte codiert haben mußten

Es ist nicht die Assemblersprache wirklich aber die zugrunde liegende Maschinensprache, die diese Operationen verhindert.

Sie während der Montage aus leicht gemacht wird, Worte oder Mnemotechnik zu lesen, stellen sie eigentlich ganz direkt auf die 1 und 0 des Maschinencodes. Auf x86-CPUs wird jeder Befehl typischerweise aus einer Folge von Bytes mit einzelnem Bytes oder Bits innerhalb der Bytes Bedeutung gemacht. Bestimmte Bits stellen die Instruktion, andere stellen die Modus-Adressierung. In Registeradressierungsart wie Ihre Beispiele einig Bits repräsentieren, welche spezifische Register sind als die Quelle und das Ziel der mov Anweisung verwendet werden sollten.

Nun ist die x86-Prozessorfamilie gehen einen langen Weg in die 1970er Jahre zurück, als CPU-Architektur einfacher war. In jenen Tagen wird das Konzept des Akkumulator war von zentraler Bedeutung - ax ist die 16 -Bit-x86-Akkumulator. Alle Berechnungen wurden aufgebaut oder „angehäuft“ in diesem Register, so dass es für alle Anweisungen zur Verfügung stand. Andere Mehrzweckregister hatte einen eingeschränkteren Einsatzbereich.

Da die Anweisungen wurden auf Bytes basierend wollten Sie so wenige Bytes eine Anweisung wie möglich darzustellen Anweisung zu halten schnelle Decodierung. Zu halten, wie viele Anweisungen so kurz wie möglich ist die Verwendung des Akkumulators wird von zentraler Bedeutung.

Ein moderner CPUs wie das Motorola mehrere Mehrzweckregister 680x0 haben mehr Fähigkeiten, die bisher die Domäne des Akkumulators waren. Auf RISC-CPUs sind alle Register so flexibel wie Akkumulatoren. Ich habe gehört, dass in 64-Bit-Modus des aktuelle x86 / amd64-Befehlssatz ist jetzt viel weniger eingeschränkt.

Blick auf die Intel Manual Volume 2 Instruction Set Reference - 325383-056US September 2015 " MOV move“Spalte "Befehl".

Die einzigen 16-Bit-mov zu Registern codiert in:

mov r/m16, Sreg

Und "3.1.1.3 Anweisung Spalte in der Opcode Übersichtstabelle", erklärt:

  • r / m16 - Ein Wort Allzweckregister oder Speicheroperanden für Befehle verwendet, deren Operanden-size Attribut ist 16 Bit. Das Wort Allzweckregister sind. AX, CX, DX, BX, SP, BP, SI, DI
  • Sreg -. Ein Segmentregister

So wird mov ds, cs nicht kodierbare, da es keine mov Sreg, Sreg Version.

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