2016-04-25 17 views
1

Ich bin neu in der Montage und meine Frage ist:x86 - Anzahl der Register vs Anzahl der reservierten Bits

Wenn eine Maschine hat, beispielsweise n-Register. Wie viele Bits müssen in der Assembleranweisung reserviert werden, um jedes der n Register zu adressieren?

Und um wieviel könnte eine funktionale Aufteilung die benötigten Bits reduzieren?

+2

Das klingt wie Hausaufgaben, vor allem der letzte Teil. Wenn Sie das nicht herausfinden können, brauchen Sie wirklich ein Stück Papier und setzen Sie sich zum Nachdenken hin. – DarkDust

+2

Beachten Sie, dass die x86-ISA keine Anweisungen fester Größe verwendet. Wenn Sie sich für die Details der Befehlscodierung auf dem x86 interessieren, lesen Sie das [Intel Softwareentwicklungshandbuch] (http://www.intel.com/content/www/us/en/processors/architectures-software-developer- handbooks.html) (der Abschnitt über ModR/M-Bytes könnte für Sie von besonderem Interesse sein). – Michael

+0

@DarkDust Ich folge nur einem Lehrbuch und ich frage mich, wie sie zu der geringsten Anzahl von Bits benötigt werden. – ethane

Antwort

4

Es gibt keine universelle Antwort darauf. Offensichtlich würden Sie bei am meisten genug Bits benötigen, um die Anzahl der Register zu speichern. Wenn Sie also 12 Register haben, benötigen Sie 4 Bits (2^4 == 16).

Aber ein Befehlssatz könnte einige Register auf verschiedene Arten behandeln (z. B. Anweisungen, die implizit nur ein bestimmtes Register adressieren; siehe LOOP für x86). Eine CPU könnte also 9 Register haben, aber da man nur mit spezialisierter Anweisung darauf zugreifen kann, benötigt man nur 3 Bits, um die restlichen 8 zu adressieren. Einige Befehle können auch nur eine bestimmte Teilmenge von Registern zulassen, wodurch auch die Anzahl reduziert wird Bits, die benötigt werden, um sie zu adressieren (sagen wir, ein Befehl erlaubt nur den Betrieb in den Registern 0-3).

Und um es noch komplizierter zu machen, gibt es register windows, die nur einen Teil der physischen Register für den Befehlssatz verfügbar machen.

+0

'loop' oder' movsb' wäre ein besseres Beispiel. 'rep' ist keine eigenständige Anweisung und kann nur für einige andere Insn- ten gelten. Was meintest du damit, dass einige Opcodes nur begrenzte Register adressieren können? Sprichst du über 64-Bit-Modus ohne ein REX-Präfix? Ich kann mir kein Beispiel vorstellen, bei dem Sie eine begrenzte Auswahl an Registern haben, die in weniger Bits als normal codiert sind. (Anders als 16-Bit-Adressierungsmodi, und dass 'esp/rsp' kein Indexregister im 32/64-Bit-Adressierungsmodus sein kann.) –

+0

@PeterCordes: Sie haben recht,' loop' ist ein viel besseres Beispiel. Habe meine Antwort aktualisiert. Zu den begrenzten Registern: Meine Antwort bezieht sich auf generische (also auch theoretische) CPU-Designs, obwohl ich mich schwach erinnerte, dass es in 8086 und/oder M68000 Anweisungen mit solchen Einschränkungen gab; Ich versuche, diese zu finden, es scheint, ich habe mich geirrt. Die x86-Familie verwendet auch keine Registerfenster, BTW. – DarkDust

+1

Sie sollten die "einige x86 Opcodes machen dies", weil es falsch ist. Der Rest deiner Antwort ist gut (und ich war nicht der Downvoter), und es ist klar, dass du im Rest nicht von x86 sprichst. Wenn Sie nach Beispielen suchen, einige Architektur (ARM, IIRC, aber ich bin mir nicht sicher) hat Anweisungen, die zwei Register verwenden, und die zweite Anweisung ist implizit der ungerade/gerade Partner der expliziten reg (umschalten Sie das niedrige Bit, anstatt 1) ​​hinzuzufügen. Für spezielle regs: MIPS hat 32 GP-Register plus HI und LO, um das Ergebnis einer Voll-Multiplikation zu halten (32x32b => 64b), gutes Beispiel für Ihre 8 + 1. –

Verwandte Themen