Er BX basisadresseregisteret, og i så fall hvorfor?

Jeg har sett mange innlegg på BX. Jeg tror i dag at det er et «General Purpose Register». Jeg er forvirret over hvorfor folk kaller det baseadresseregisteret,

  • Hvorfor det kalles baseadresseregisteret, historisk.
  • Er noe av det som fremdeles er relevant i dag ?
  • Er det en konvensjon om å reservere den til baseadressering?

Du kan se den blir kalt det her .

Kommentarer

  • Når du tenker på det, er dette ikke ‘ ikke akkurat et RC-spørsmål, da det ‘ ikke retter seg mot noe om gammel datamaskin – spesielt ikke siden den ber om relevans i dag . Dette spørsmålet vil være bedre egnet på SE hovedside – og et raskt søk viser at det er blitt spurt om variasjoner der mye.
  • Jeg tror en nøkkel her er at registrene på x86 bare er » mer eller mindre generelt formål «, du kan bruke hvilken som helst av dem i de grunnleggende operasjonene, men det er / var situasjoner der du var begrenset til hvilke registre du kunne bruke se.
  • Et annet sentralt poeng er at sammenligning av historisk bruk og moderne bruk er misvisende når det gjelder x86 (jeg antar her at kommentaren om «General Purpose Register» egentlig refererer til EBX / RBX enn BX). Nåværende x86 er bakoverkompatibel med 8086, men moderne x86-monteringsspråklig programmering er veldig, veldig forskjellig fra 8086-programmering (eller til og med 386 programmering); slik at bruken av BX ikke nødvendigvis sier mye om bruken av EBX / RBX.

Svar

BX har alltid vært en av de generelle registerene, og den har alltid blitt kalt baseregisteret (se for eksempel The 8086 Primer , side 19). Det er basisregisteret fordi det kan brukes i forskjellige baserte adresseringsmodi: lagring av en adresse i BX, og en forskyvning i SI eller DI (henholdsvis kilde- og destinasjonsregister), gjør det mulig å få tilgang til minne på BX + SI eller BX + DI ( ibid , side 31), eller BX + SI + øyeblikkelig , eller til og med BX + øyeblikkelig . Den fungerer også som base for XLAT.

BP er lik, og støtter alle adresseringsmodusene ovenfor. Forskjellen mellom BX og BP er at BX er standard til datasegmentet (DS), mens BP som standard er stablesegmentet (SS). (BX og BP har hver sin spesifikke instruksjon også – f.eks XLAT bruker BX, ENTER og LEAVE bruk BP.)

Disse adresseringsmodusene eksisterer fortsatt i dag, så bruken er fortsatt relevant, men indeksert og indirekte adressering er tilgjengelig med et hvilket som helst generelt, peker- eller indeksregister som starter med 32-biters x86 . Mens BX og BP er «spesielle» på 16-biters x86, fordi de er de eneste registerene som indirekte eller indeksert adressering er mulig med, er det ikke lenger tilfelle på 32- eller 64-biters x86, så EBX, EBP, RBX , og RBP er ikke helt så spesielle. (BP, EBP og RBP er fremdeles noe spesielle siden de velger SS som basisregister i 16- og 32-biters modus, og ikke kan brukes som pekere uten en forskyvning, ie det er ingen opcode for MOV AX, [BP] og MOV AX, [BP+0] blir brukt i stedet.)

Det er ingen konvensjon jeg er klar over av å spesifikt reservere bruken av BX for base-adressering; Hvis du trenger å bruke den til baseadressering, konfigurerer du den riktig og bruker den. Hvis den anropskonvensjonen som er i bruk, pålegger at BX skal bevares, må du sørge for at du tar hensyn til det (som innringer eller ringe avhengig av konvensjonen og koden du skriver).

Kommentarer

  • +2 for tillegg av XLAT / ENTER / LEAVE.

Svar

(Dette er i tillegg til Stephen Kitts svar)

Hvorfor det heter historisk basisadresseregister.

Vel, det er ikke det. Hvis alt, ville det være «Base Index» (eller bedre Index Base), som det var i original 16 bit adressering av det eneste registeret som kunne legges til som en «Base» i all indeksert adressering. Indeksert med SI eller DI altså. (* 1)

Denne adresseringen var symmetrisk med BP som basepeker. Grunnideen var at en matrise kan pekes på med BX og adresseres via SI eller DI uten videre – eller BP når det er innenfor stack (* 2)

Ved siden av at det er en av de to generelle originalregistrene for generell bruk.

Er noe av det fortsatt relevant i dag?

Egentlig ikke. I det minste ikke i 32/64 bit-modus.REX adressering tillater bruk av hvilket som helst av det «klassiske» registeret som (indeks) base i 32-biters modus – bortsett fra BP / SP (* 3). I 64-biters modus kan 12 av de 16 registerene brukes på samme måte (Ikke BP / SP / R12 / R13 (* 4)).

Nå når det er sagt, kommer «Lang» -modus med 16 bit beskyttet moduskodesegmenter . Her brukes klassisk (16 bit) koding sammen med 32/64 bit registerstørrelse. BX beholder sin kodingsfordel, da SIB ikke er nødvendig. Hvor mye denne ganske glemte modusen er relevant, kan diskuteres.

Finnes det en konvensjon som reserverer bruk for baseadressering?

Egentlig ikke. Bruk etter behov. Dette er tross alt forsamling – det er ingen konvensjon du ikke vil ha :))

Det eneste du må huske på er å bevare den for den som ringer (med mindre det eksplisitt ikke er gjort)

Du kan se at det heter det her.

Err … lets si at han ikke er galt, men jeg vil anbefale å se etter bedre detaljert beskrivelse for å lære om x86 (sjekk Wiki (bøker) eller OSDEV-Wiki ). Eller hvis det er spesifikt om klassisk (16-biters) x86-programmering, så er det bare en bok du skal lese: Steve Morse « 8086 Primer . 32/64 Bit er uansett annerledes og må læres uten at disse klassiske forutsetningene er veldig nyttige i stedet for en ryggsekk med spesielle tilfeller i spesielle tilfeller.


* 1 – Hvis du vil tildele mnemonic navn til de 4 grunnleggende to byteregistrene, det kan være

  • AX = A ccumulator . Brukes til A rytmetikk (eller A fortsetter den korteste kodingen)
  • BX = B ase. Brukes som peker til data (strukturer)
  • CX = C ounter. Brukt i shift / rotate, string ops og loops.
  • DX = D ata. Brukt i aritmetikk og I / O.

* 2 – Så igjen, i tilfelle «standard» programmering BP holder stabelrammen, så en indeks her er alltid en indeks i den rammen, med mindre BP flyttes midlertidig.

* 3 – SP kan også brukes med SIB koding.

* 4 – SP / R12 igjen med SIB koding.

Kommentarer

  • REX addressing allows [using any register in 32-bit mode] – mente du SIB her?
  • @ilkkachu Nop. I det minste ikke så langt jeg husker. REX gjør det mulig å bruke r / m-modus med alle registre. SIB er bare nødvendig for SP og R12. Og selvfølgelig hvis du vil bruke skalering … eller har jeg skrudd det opp? Jeg må sjekke igjen.
  • Mm. Jeg vet at det ‘ er mulig å bruke alle registrene som pekere i 32-biters modus, så det kan ‘ t være REX. Egentlig ser det ut til at i 32-biters modus er bare modr / m-byte nok til å bruke et enkelt register som adresse, ingen SIB er nødvendig i den saken (bortsett fra ESP). wiki.osdev.org/…
  • @ilkkachu Jup, men du ‘ er også riktig, å bruke et register som base med et annet som indeks, SIB er nødvendig. La meg dobbeltsjekke dette og korrigere svaret mitt. ok?

Svar

BX er det eldste indekseringsregisteret. Vanligvis vil et element i en struktur få tilgang til [BX + constant]; derav navnet (eller muligens navnet kommer fra [BX + SI]; bare BX eller BP kunne brukes på venstre side, og bare SI og DI kunne brukes på høyre side).

Jeg kunne ikke finne en bestemt ting om ebx / rbx bortsett fra at det er det laveste registeret som ikke er sperret av en bestemt instruksjon (mul / div / shl / shr), så det er et godt sted å sette pekeren.

På den annen side er [esp + offset] en lengre instruksjon enn [ebp + offset], så eliminering av rammepekeren genererer ikke alltid kortere kode.

Kommentarer

  • Er du sikker på at 32-biters opcodes er kortere? I 16-biters modus er det eksplisitte kodinger for kombinasjonene av BX / BP, SI / DI, og en 8 eller 16-bit forskyvning, og andre varianter er ikke kodbare; i 32-biters modus brukes den generiske registerkodingen (EAX / ECX / EDX / EBX / ESP / EBP / ESI / EDI), bortsett fra at 100b (vanligvis ESP) brukes til å betegne en SIB-byte, og 101b (vanligvis EBP ) uten forskyvning brukes til å betegne en 32-bit forskyvning.MOV EAX, [EBX+9] tar 3 byte, det samme gjør MOV EAX, [ECX+9]; med et tilleggsregister trenger du 4 byte.
  • @StephenKitt: Jeg står korrigert. Den eneste som faktisk er lengre er [esp + x]

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *