Ich habe viele Beiträge auf BX gesehen. Ich glaube, heute ist es ein „General Purpose Register“. Ich bin verwirrt darüber, warum die Leute es das Basisadressregister nennen,
- Warum es historisch das Basisadressregister genannt wird.
- Ist irgendetwas davon heute noch relevant? ?
- Gibt es eine Konvention, um die Verwendung für die Basisadressierung zu reservieren?
Sie können sie sehen wird hier so genannt .
Kommentare
- Wenn man daran denkt, ist dies nicht ‚ Es handelt sich nicht genau um eine RC-Frage, da sie ‚ nicht auf alte Computer abzielt – insbesondere nicht, da sie heute nach Relevanz fragt . Diese Frage wäre besser geeignet auf der SE-Hauptseite – und eine schnelle Suche zeigt, dass dort häufig nach Variationen gefragt wurde.
- Ich denke, ein Schlüssel hier ist, dass Register auf x86 nur “ sind Mehr oder weniger allgemeiner Zweck „, Sie können jeden von ihnen in den Grundoperationen verwenden, aber es gab / gab Situationen, in denen Sie eingeschränkt waren, welche Register Sie verwenden konnten se.
- Ein weiterer wichtiger Punkt ist, dass der Vergleich der historischen und der modernen Nutzung in Bezug auf x86 irreführend ist (ich gehe hier davon aus, dass sich der Kommentar zu „General Purpose Register“ eher auf EBX / RBX bezieht als BX). Das aktuelle x86 ist abwärtskompatibel mit dem 8086, aber die moderne x86-Assembler-Programmierung unterscheidet sich sehr stark von der 8086-Programmierung (oder sogar der 386-Programmierung). Die Verwendung von BX sagt also nicht unbedingt viel über die Verwendung von EBX / RBX aus.
Antwort
BX war schon immer eines der allgemeinen Register und wurde immer als Basisregister bezeichnet (siehe zum Beispiel The 8086 Primer . Seite 19). Es ist das Basisregister, da es in verschiedenen Adressierungsmodi verwendet werden kann: Durch Speichern einer Adresse in BX und eines Versatzes in SI oder DI (das Quell- bzw. das Zielindexregister) kann auf den Speicher bei BX + SI oder BX zugegriffen werden + DI ( ibid , Seite 31) oder BX + SI + sofort oder sogar BX + sofort . Es dient auch als Basis für XLAT
.
BP ist ähnlich und unterstützt alle oben genannten Adressierungsmodi. Der Unterschied zwischen BX und BP besteht darin, dass BX standardmäßig das Datensegment (DS) verwendet, während BP standardmäßig das Stapelsegment (SS) verwendet. (BX und BP haben jeweils auch ihre eigenen spezifischen Anweisungen – z. B. XLAT
verwendet BX, ENTER
und LEAVE
BP verwenden.)
Diese Adressierungsmodi existieren noch heute, daher ist ihre Verwendung immer noch relevant, aber indizierte und indirekte Adressierung sind mit jedem General-, Zeiger- oder Indexregister verfügbar, das mit 32-Bit x86 beginnt. Während BX und BP auf 16-Bit-x86 „speziell“ sind, da sie die einzigen Register sind, mit denen eine indirekte oder indizierte Adressierung möglich ist, ist dies auf 32- oder 64-Bit-x86 nicht mehr der Fall, also EBX, EBP, RBX und RBP sind nicht ganz so besonders. (BP, EBP und RBP sind immer noch etwas Besonderes, da sie SS als Basisregister im 16- und 32-Bit-Modus auswählen und nicht als Zeiger ohne Offset verwendet werden können, dh Stattdessen wird kein Opcode für MOV AX, [BP]
und MOV AX, [BP+0]
verwendet.)
Mir ist keine Konvention bekannt die Verwendung von BX für die Basisadressierung ausdrücklich zu reservieren; Wenn Sie es für die Basisadressierung verwenden müssen, richten Sie es entsprechend ein und verwenden es. Wenn die verwendete Anrufkonvention die Beibehaltung von BX vorschreibt, müssen Sie dies berücksichtigen (als Anrufer oder Angerufene, abhängig von der Konvention und dem Code, den Sie schreiben).
Kommentare
- +2 zum Hinzufügen von XLAT / ENTER / LEAVE.
Antwort
(Dies ist zusätzlich zu Stephen Kitts Antwort)
Warum es historisch als Basisadressregister bezeichnet wird.
Nun, das ist es nicht. Wenn alles, dann wäre es „Basisindex“ (oder besser Indexbasis), da es sich bei der ursprünglichen 16-Bit-Adressierung um das einzige Register handelte, das als „Basis“ in allen indizierten Adressen hinzugefügt werden konnte. Indiziert mit SI
oder DI
. (* 1)
Diese Adressierung war symmetrisch mit BP
als Basiszeiger. Die Grundidee war, dass ein Array mit BX angezeigt und über SI
oder DI
ohne weiteres ado – oder BP innerhalb der stack (* 2)
Außerdem ist es eines der ursprünglichen Allzweck-Zwei-Byte-Register.
Ist irgendetwas davon heute noch relevant?
Nicht wirklich. Zumindest nicht im 32/64-Bit-Modus.REX
Die Adressierung ermöglicht die Verwendung eines beliebigen „klassischen“ Registers als (Index-) Basis im 32-Bit-Modus – mit Ausnahme von BP
/ SP
(* 3). Im 64-Bit-Modus können 12 der 16 Register auf die gleiche Weise verwendet werden (Nicht BP
/ SP
/ / R13
(* 4)).
Nun kommt der „Long“ -Modus mit 16-Bit-Codesegmenten im geschützten Modus . Hier wird die klassische (16 Bit) Codierung zusammen mit der Registergröße von 32/64 Bit verwendet. BX
behält seinen Codierungsvorteil bei, da SIB
nicht benötigt wird. Inwieweit dieser eher vergessene Modus relevant ist, steht zur Diskussion.
Gibt es eine Konvention, um seine Verwendung für die Basisadressierung zu reservieren?
Nicht wirklich. Bei Bedarf verwenden. Immerhin ist dies Assembly – es gibt keine Konvention, die Sie nicht wollen :))
Das einzige Problem, das Sie berücksichtigen sollten, ist, sie für Ihren Anrufer aufzubewahren (es sei denn, dies wird ausdrücklich nicht getan)
Sie können sehen, dass es hier so heißt.
Err … lässt Sagen Sie, er liegt nicht falsch, aber ich würde empfehlen, nach einer detaillierteren Beschreibung zu suchen, um mehr über x86 zu erfahren (Check Wiki (Bücher) oder OSDEV-Wiki ). Wenn es sich um eine klassische (16-Bit) x86-Programmierung handelt, können Sie nur ein Buch lesen: Steve Morse „ 8086 Primer . 32/64 Bit ist sowieso anders und muss ohne diese klassischen Annahmen gelernt werden, um wirklich nützlich zu sein, anstatt einen Rucksack mit Sonderfällen für Sonderfälle.
* 1 – Wenn Sie eine Mnemonik zuweisen möchten Namen für die 4 grundlegenden Zwei-Byte-Register, es könnte sich um
- AX = A -Cumulator handeln . Wird für A -Rithmetik (oder A immer die kürzeste Codierung)
- BX = B ase. Wird als Zeiger auf Daten (Strukturen) verwendet.
- CX = C ounter. Wird in Shift / Rotate, String Ops und Loops verwendet.
- DX = D ata. Wird in Arithmetik und E / A verwendet.
* 2 – Bei „Standard“ -Programmierung enthält BP
den Stapelrahmen. Ein Index hier ist also immer ein Index in diesem Frame, es sei denn, BP wird vorübergehend verschoben.
* 3 – SP
kann auch mit -Codierung.
* 4 – SP
/ R12
erneut mit SIB
-Codierung.
Kommentare
-
REX addressing allows [using any register in 32-bit mode]
– meinten Sie SIB hier? - @ilkkachu Nop. Zumindest nicht so weit ich mich erinnere. Mit REX kann der R / M-Modus für alle Register verwendet werden. SIB wird nur für SP und R12 benötigt. Und natürlich, wenn Sie Skalierung verwenden möchten … oder habe ich das vermasselt? Ich muss noch einmal nachsehen.
- Mm. Ich weiß, dass es ‚ möglich ist, alle Register als Zeiger im 32-Bit-Modus zu verwenden, sodass ‚ nicht REX sein kann. Tatsächlich scheint es, dass im 32-Bit-Modus nur das modr / m-Byte ausreicht, um ein einzelnes Register als Adresse zu verwenden, für diesen Fall wird kein SIB benötigt (außer für ESP). wiki.osdev.org/…
- @ilkkachu Jup, aber Sie ‚ ist auch richtig, um ein Register als Basis mit einem anderen als Index zu verwenden, wird SIB benötigt. Lassen Sie mich dies noch einmal überprüfen und meine Antwort korrigieren. ok?
Antwort
BX ist das älteste Indexregister. Normalerweise wird auf ein Element in einer Struktur über [BX + constant]
zugegriffen. daher der Name (oder möglicherweise stammt der Name von [BX + SI]
; auf der linken Seite können nur BX oder BP und auf der rechten Seite nur SI und DI verwendet werden).
Ich konnte nichts über ebx / rbx finden, außer dass es das niedrigste Register ist, das nicht durch eine bestimmte Anweisung (mul / div / shl / shr) überlastet ist, also ist es ein guter Ort, um a zu setzen Zeiger.
Andererseits ist [esp + offset] eine längere Anweisung als [ebp + offset], sodass die Eliminierung von Frame-Zeigern nicht immer kürzeren Code generiert.
Kommentare
- Sind Sie sicher, dass die 32-Bit-Opcodes kürzer sind? Im 16-Bit-Modus gibt es explizite Codierungen für die Kombinationen von BX / BP, SI / DI und einer 8- oder 16-Bit-Verschiebung, und andere Varianten sind nicht codierbar. Im 32-Bit-Modus wird die generische Registercodierung verwendet (EAX / ECX / EDX / EBX / ESP / EBP / ESI / EDI), mit der Ausnahme, dass 100b (normalerweise ESP) zur Kennzeichnung eines SIB-Bytes und 101b (normalerweise EBP) verwendet werden ) ohne Verschiebung wird verwendet, um einen 32-Bit-Offset zu kennzeichnen.
MOV EAX, [EBX+9]
benötigt 3 Bytes, ebenso wieMOV EAX, [ECX+9]
; Mit einem zusätzlichen Register benötigen Sie 4 Bytes. - @StephenKitt: Ich stehe korrigiert. Der einzige, der tatsächlich länger ist, ist [esp + x]