Is BX het basisadresregister, en zo ja, waarom?

Ik “heb veel berichten op BX gezien. Ik geloof dat het vandaag een” algemeen doelregister “is. Ik begrijp niet waarom mensen het het basisadresregister noemen,

  • waarom het historisch gezien het basisadresregister wordt genoemd.
  • Is dat nog steeds relevant ?
  • Is er een conventie om het gebruik ervan te reserveren voor basisadressering?

Je kunt het zien wordt hier zo genoemd .

Reacties

  • Als je erover nadenkt, is dit niet ‘ Het is precies een RC-vraag, aangezien deze ‘ nergens op gericht is op een oude computer – vooral niet omdat deze vandaag om relevantie vraagt. Deze vraag zou beter geschikt zijn op de hoofdsite van SE – en een snelle zoekactie laat zien dat daar vaak naar variaties wordt gevraagd.
  • Ik denk dat een sleutel hier is dat registers op x86 alleen ” zijn min of meer algemeen gebruik “, je kunt ze allemaal gebruiken in de basisbewerkingen, maar er zijn / waren situaties waarin je beperkt was tot welke registers je kon gebruiken se.
  • Een ander belangrijk punt is dat het vergelijken van historisch gebruik en modern gebruik misleidend is als het gaat om x86 (ik neem hier aan dat de opmerking over “General Purpose Register” echt verwijst naar EBX / RBX dan BX). De huidige x86 is achterwaarts compatibel met de 8086, maar de moderne x86-assembleertaalprogrammering is heel, heel anders dan 8086-programmering (of zelfs 386-programmering); dus het gebruik van BX zegt niet per se veel over het gebruik van EBX / RBX.

Answer

BX is altijd een van de algemene registers geweest, en werd altijd het basisregister genoemd (zie bijvoorbeeld The 8086 Primer , pagina 19). Het is het basisregister omdat het kan worden gebruikt in verschillende adresseringsmodi: door een adres op te slaan in BX en een offset in SI of DI (respectievelijk de bron- en bestemmingsindexregisters), kan geheugen worden benaderd op BX + SI of BX + DI ( ibid , pagina 31), of BX + SI + onmiddellijk , of zelfs BX + onmiddellijk . Het dient ook als de basis voor XLAT.

BP is vergelijkbaar en ondersteunt alle bovenstaande adresseringsmodi. Het verschil tussen BX en BP is dat BX standaard het gegevenssegment (DS) gebruikt, terwijl BP standaard het stapelsegment (SS) gebruikt. (BX en BP hebben ook elk hun eigen specifieke instructies – bijv. XLAT gebruikt BX, ENTER en LEAVE gebruiken BP.)

Die adresseringsmodi bestaan nog steeds, dus hun gebruik is nog steeds relevant, maar geïndexeerde en indirecte adressering zijn beschikbaar met elk algemeen, pointer- of indexregister beginnend met 32-bit x86 . Hoewel BX en BP “speciaal” zijn op 16-bit x86, omdat ze de enige registers zijn waarmee indirecte of geïndexeerde adressering mogelijk is, is dat niet langer het geval op 32- of 64-bit x86, dus EBX, EBP, RBX , en RBP zijn niet zo bijzonder. (BP, EBP en RBP zijn nog steeds enigszins speciaal omdat ze SS selecteren als het basisregister in 16- en 32-bits modus, en niet kunnen worden gebruikt als aanwijzers zonder een offset, ie er is geen opcode voor MOV AX, [BP] en MOV AX, [BP+0] wordt in plaats daarvan gebruikt.)

Er is geen conventie die ik ken of om specifiek het gebruik van BX te reserveren voor basisadressering; als u het moet gebruiken voor basisadressering, stelt u het op de juiste manier in en gebruikt u het. Als de gebruikte aanroepconventie voorschrijft dat BX behouden blijft, moet je ervoor zorgen dat je daar rekening mee houdt (als beller of gebelde afhankelijk van de conventie en de code die je schrijft).

Opmerkingen

  • +2 voor toevoeging van XLAT / ENTER / LEAVE.

Antwoord

(Dit is een aanvulling op het antwoord van Stephen Kitts)

Waarom wordt het historisch gezien het basisadresregister genoemd.

Nou, dat is het niet. Als het allemaal zou zijn, dan zou het “Base Index” (of beter Index Base) zijn, aangezien het in de originele 16 bit adressering het enige register was dat als een “Base” bij alle geïndexeerde adressering kon worden toegevoegd. Geïndexeerd met SI of DI dat wil zeggen. (* 1)

Deze adressering was symmetrisch met BP als Base Pointer. Het basisidee was dat naar een array kan worden verwezen met BX en geadresseerd via SI of DI zonder verder oponthoud – of BP binnen de stack (* 2)

Daarnaast is het een van de oorspronkelijke registers van twee bytes voor algemene doeleinden.

Is een van dat nog steeds relevant vandaag?

Niet echt, tenminste niet in 32/64 bit modus.REX adressering staat het gebruik toe van elk van de “klassieke” registers als (index) basis in 32-bits modus – behalve BP / SP (* 3). In 64-bits modus kunnen 12 van de 16 registers op dezelfde manier worden gebruikt (niet BP / SP / R12 / R13 (* 4)).

Nu, dat gezegd hebbende, de “Lange” modus met 16 bit beschermde modus codesegmenten komt langs . Hier wordt klassieke (16 bit) codering gebruikt in combinatie met 32/64 bit registergrootte. BX behoudt zijn coderingsvoordeel, aangezien SIB niet nodig is. Hoeveel deze nogal vergeten modus relevant is, staat ter discussie.

Is er een conventie om het gebruik ervan voor basisadressering te reserveren?

Niet echt. Gebruik indien nodig. Dit is tenslotte Assembly – er is geen conventie die u niet wilt :))

Het enige probleem dat u in gedachten moet houden, is het bewaren voor uw beller (tenzij het expliciet niet wordt gedaan)

Je kunt zien hoe dat hier wordt genoemd.

Err … laten we zeggen dat hij “niet verkeerd is”, maar ik zou aanraden om naar een betere gedetailleerde beschrijving te zoeken om meer te weten te komen over x86 (controleer Wiki (boeken) of OSDEV-Wiki ). Of als het specifiek is over klassieke (16-bits) x86-programmering, dan is er maar één boek dat u kunt lezen: Steve Morse “ 8086 Primer . 32/64 Bit is hoe dan ook anders en moet worden geleerd zonder deze klassieke aannames om echt nuttig te zijn in plaats van een rugzak met speciale gevallen voor speciale gevallen.


* 1 – Als u geheugensteuntje wilt toewijzen namen toe aan de 4 basisregisters van twee bytes, het kan zijn

  • AX = A ccumulator . Gebruikt voor A ritmetiek (of A altijd de kortste codering)
  • BX = B ase. Gebruikt als een verwijzing naar gegevens (structuren)
  • CX = C ounter. Gebruikt in shift / rotate, string-ops en loops.
  • DX = D ata. Gebruikt in rekenkunde en I / O.

* 2 – Aan de andere kant, in het geval van “standaard” programmeren bevat BP het stapelframe, dus een index hier is altijd een index in dat frame, tenzij BP tijdelijk wordt verplaatst.

* 3 – SP kan ook worden gebruikt met SIB codering.

* 4 – SP / R12 opnieuw met SIB codering.

Reacties

  • REX addressing allows [using any register in 32-bit mode] – bedoelde je SIB hier?
  • @ilkkachu Nee. In ieder geval niet voor zover ik me herinner. REX maakt het mogelijk om de r / m-modus te gebruiken met alle registers. SIB is alleen nodig voor SP en R12. En natuurlijk als je schaalvergroting wilt gebruiken … of heb ik dat verknald? Ik moet het nog een keer controleren.
  • Mm. Ik weet dat het ‘ mogelijk is om alle registers te gebruiken als verwijzingen in 32-bits modus, dus het kan ‘ niet REX zijn. Eigenlijk lijkt het erop dat in de 32-bits modus alleen de modr / m byte voldoende is om een enkel register als adres te gebruiken, voor dat geval is geen SIB nodig (behalve voor ESP). wiki.osdev.org/…
  • @ilkkachu Jup, maar jij ‘ hebben ook gelijk, om een register te gebruiken als basis met een ander als index, is SIB nodig. Laat me dit dubbel controleren en mijn antwoord corrigeren. ok?

Answer

BX is het oudste indexeringsregister. Typisch zou een element in een struct worden benaderd door [BX + constant]; vandaar de naam (of mogelijk komt de naam van [BX + SI]; alleen BX of BP kon aan de linkerkant worden gebruikt, en alleen SI en DI konden aan de rechterkant worden gebruikt).

Ik kon niets specifieks vinden over ebx / rbx, behalve dat het het laagste register is dat niet wordt overbrugd door een specifieke instructie (mul / div / shl / shr), dus het is een goede plek om een pointer.

Aan de andere kant, [esp + offset] is een langere instructie dan [ebp + offset], dus frame pointer eliminatie genereert niet altijd kortere code.

Opmerkingen

  • Weet u zeker dat de 32-bits opcodes korter zijn? In de 16-bits modus zijn er expliciete coderingen voor de combinaties van BX / BP, SI / DI en een 8- of 16-bits verplaatsing, en andere varianten kunnen niet worden gecodeerd; in 32-bits modus wordt de generieke registercodering gebruikt (EAX / ECX / EDX / EBX / ESP / EBP / ESI / EDI), behalve dat 100b (meestal ESP) wordt gebruikt om een SIB-byte aan te duiden, en 101b (meestal EBP ) zonder verplaatsing wordt gebruikt om een 32-bits offset aan te duiden.MOV EAX, [EBX+9] duurt 3 bytes, net als MOV EAX, [ECX+9]; met een extra register heb je 4 bytes nodig.
  • @StephenKitt: Ik sta gecorrigeerd. De enige die eigenlijk langer is, is [esp + x]

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *