Er BX basisadresseregistret, og i så fald hvorfor?

Jeg har set mange indlæg på BX. Jeg tror i dag, det er et “General Purpose Register”. Jeg er forvirret over, hvorfor folk kalder det baseadresseregisteret,

  • Hvorfor det kaldes baseadresseregisteret historisk.
  • Er noget af det, der stadig er relevant i dag ?
  • Er der en konvention om at reservere den til base-adressering?

Du kan se den kaldes det her .

Kommentarer

  • Når man tænker på det, er dette ikke ‘ nøjagtigt et RC-spørgsmål, da det ikke ‘ ikke målretter mod noget om gammel computer – især ikke da det beder om relevans i dag . Dette spørgsmål ville være bedre egnet på SEs hovedside – og en hurtig søgning viser, at der er blevet spurgt meget om variationer der.
  • Jeg tror, en nøgle her er, at registre på x86 kun er ” mere eller mindre generelt formål “, du kan bruge en hvilken som helst af dem i de grundlæggende operationer, men der er / var situationer, hvor du var begrænset til, hvilke registre du kunne bruge se.
  • Et andet nøglepunkt er, at sammenligning af historisk brug og moderne brug er vildledende, når det kommer til x86 (jeg antager her, at kommentaren om “General Purpose Register” virkelig henviser til EBX / RBX end BX). Nuværende x86 er bagudkompatibel med 8086, men moderne x86-samlingssprogsprogrammering er meget, meget forskellig i forhold til 8086 programmering (eller endda 386 programmering); så brugen af BX siger ikke nødvendigvis meget om brugen af EBX / RBX.

Svar

BX har altid været et af de generelle registre, og det har altid været kaldt basisregisteret (se f.eks. 8086 Primer , side 19). Det er basisregistret, fordi det kan bruges i forskellige baserede adresseringstilstande: lagring af en adresse i BX og en forskydning i SI eller DI (henholdsvis kilde- og destinationsindeksregistrene) gør det muligt at få adgang til hukommelse ved BX + SI eller BX + DI ( ibid , side 31) eller BX + SI + øjeblikkelig eller endda BX + øjeblikkelig . Det fungerer også som base for XLAT.

BP er ens og understøtter alle ovennævnte adresseringstilstande. Forskellen mellem BX og BP er, at BX er standard til datasegmentet (DS), mens BP som standard er stakksegmentet (SS). (BX og BP har også hver deres specifikke instruktioner – f.eks XLAT bruger BX, ENTER og LEAVE brug BP.)

Disse adresseringstilstande findes stadig i dag, så deres anvendelse er stadig relevant, men indekseret og indirekte adressering er tilgængelige med ethvert generelt, pointer- eller indeksregister, der starter med 32-bit x86 . Mens BX og BP er “specielle” på 16-bit x86, idet de er de eneste registre, som indirekte eller indekseret adressering er mulig med, er det ikke længere tilfældet på 32- eller 64-bit x86, så EBX, EBP, RBX og RBP er ikke helt så specielle. (BP, EBP og RBP er stadig noget specielle, da de vælger SS som basisregister i 16- og 32-bit-tilstand og ikke kan bruges som pegepinde uden en forskydning, dvs. der er ingen opcode for MOV AX, [BP] og MOV AX, [BP+0] bliver brugt i stedet.)

Der er ingen konvention, jeg er opmærksom på af specifikt at reservere brugen af BX til base-adressering; hvis du har brug for det til base-adressering, skal du konfigurere det korrekt og bruge det. Hvis den opkaldskonvention, der er i brug, pålægger, at BX bevares, skal du sikre dig, at du tager det i betragtning (som opkalder eller callee afhængigt af konventionen og den kode, du skriver).

Kommentarer

  • +2 for tilføjelse af XLAT / ENTER / LEAVE.

Svar

(Dette er i tillæg til Stephen Kitts svar)

Hvorfor det historisk kaldes base-adresseregistret.

Nå, det er ikke det. Hvis det hele er, ville det være “Base Index” (eller bedre Index Base), da det var i original 16 bit adressering af det eneste register, der kunne tilføjes som en “Base” i al indexeret adressering. Indekseret med SI eller DI altså. (* 1)

Denne adressering var symmetrisk med BP som Base Pointer. Grundideen var, at en matrix kan peges på med BX og adresseres via SI eller DI uden yderligere ado – eller BP, når det er inden for stack (* 2)

Udover at det er en af de oprindelige to-byte-registre til det generelle formål.

Er noget af det stadig relevant i dag?

Ikke rigtig. I det mindste ikke i 32/64 bit-tilstand.REX adressering tillader brug af ethvert af det “klassiske” register som (indeks) base i 32 bit tilstand – undtagen BP / SP (* 3). I 64 bit-tilstand kan 12 af de 16 registre bruges på samme måde (Ikke BP / SP / R12 / R13 (* 4)).

Når det er sagt, kommer “Lang” -tilstand med 16 bit beskyttet tilstandskodesegmenter . Her bruges klassisk (16 bit) kodning sammen med 32/64 bit registerstørrelse. BX bevarer sin fordel ved kodning, da SIB ikke er nødvendig. Hvor meget denne ret glemte tilstand er relevant, kan diskuteres.

Er der en konvention, der forbeholder sig brugen til base-adressering?

Ikke rigtig. Brug efter behov. Dette er trods alt forsamling – der er ingen konvention, du ikke vil have :))

Det eneste spørgsmål, du skal huske på, er at bevare det for din opkalder (medmindre det udtrykkeligt ikke er gjort)

Du kan se, at det hedder det her.

Fejl … lader siger, at han ikke er forkert, men jeg vil anbefale at kigge efter en bedre detaljeret beskrivelse for at lære om x86 (tjek Wiki (bøger) eller OSDEV-Wiki ). Eller hvis det er specifikt om klassisk (16 Bit) x86-programmering, er der kun en bog, du skal læse: Steve Morse “ 8086 Primer . 32/64 Bit er alligevel anderledes og skal læres uden disse klassiske antagelser for at være virkelig nyttige i stedet for en rygsæk med specielle sager i specielle tilfælde.


* 1 – Hvis du vil tildele mnemonic navne til de 4 grundlæggende to byte-registre, det kan være

  • AX = A ccumulator . Bruges til A rytmetik (eller A lways den korteste kodning)
  • BX = B ase. Bruges som en markør til data (strukturer)
  • CX = C ounter. Brugt i skift / rotering, streng ops og sløjfer.
  • DX = D ata. Anvendes i aritmetik og I / O.

* 2 – Så igen, i tilfælde af “standard” programmering BP holder stakrammen, så et indeks her er altid et indeks i den ramme, medmindre BP midlertidigt flyttes.

* 3 – SP kan også bruges med SIB kodning.

* 4 – SP / R12 igen med SIB kodning.

Kommentarer

  • REX addressing allows [using any register in 32-bit mode] – mente du SIB her?
  • @ilkkachu Nop. I det mindste ikke så vidt jeg husker. REX giver mulighed for at bruge r / m-tilstand med alle registre. SIB er kun nødvendigt til SP og R12. Og selvfølgelig, hvis du vil bruge skalering … eller skruede jeg det op? Jeg er nødt til at tjekke igen.
  • Mm. Jeg ved, at det ‘ er muligt at bruge alle registre som pegepinde i 32-bit-tilstand, så det kan ‘ t være REX. Faktisk ser det ud til, at i 32-bit tilstand er bare modr / m-byte nok til at bruge et enkelt register som adresse, ingen SIB er nødvendig i den sag (undtagen ESP). wiki.osdev.org/…
  • @ilkkachu Jup, men du ‘ er også rigtigt at bruge et register som base med et andet som indeks, der er brug for SIB. Lad mig dobbelttjekke dette og rette mit svar. ok?

Svar

BX er det ældste indekseringsregister. Typisk vil et element i en struktur få adgang til [BX + constant]; dermed navnet (eller muligvis navnet kommer fra [BX + SI]; kun BX eller BP kunne bruges på venstre side, og kun SI og DI kunne bruges på højre side).

Jeg kunne ikke finde en bestemt ting ved ebx / rbx bortset fra at det er det laveste register, der ikke er klodset af en bestemt instruktion (mul / div / shl / shr), så det er et godt sted at sætte en pointer.

På den anden side er [esp + offset] en længere instruktion end [ebp + offset], så eliminering af rammemarkør genererer ikke altid kortere kode.

Kommentarer

  • Er du sikker på, at 32-bit opcodes er kortere? I 16-bit-tilstand er der eksplicit kodning til kombinationerne af BX / BP, SI / DI og en 8 eller 16-bit forskydning, og andre varianter kan ikke kodes; i 32-bit-tilstand bruges den generiske registerkodning (EAX / ECX / EDX / EBX / ESP / EBP / ESI / EDI), bortset fra at 100b (normalt ESP) bruges til at betegne en SIB-byte og 101b (normalt EBP ) uden forskydning bruges til at betegne en 32-bit forskydning.MOV EAX, [EBX+9] tager 3 byte, ligesom MOV EAX, [ECX+9]; med et ekstra register har du brug for 4 byte.
  • @StephenKitt: Jeg står korrigeret. Den eneste der faktisk er længere er [esp + x]

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *