BX este registrul adresei de bază și, dacă da, de ce?

Am „văzut o mulțime de postări pe BX. Cred că astăzi este” un registru cu scop general „. Sunt „confuz cu privire la motivul pentru care oamenii îl numesc Registrul adreselor de bază,

  • De ce se numește istoricul adreselor de bază, din punct de vedere istoric.
  • Oricare dintre acestea este încă relevantă astăzi ?
  • Există o convenție pentru a rezerva utilizarea acestuia pentru adresarea de bază?

O puteți vedea fiind numit aici .

Comentarii

  • Gândindu-ne la asta, nu este ‘ T exact o întrebare RC, deoarece nu ‘ nu vizează nimic despre computerul vechi – mai ales nu deoarece cere relevanță astăzi . Această întrebare ar fi mai potrivită pe site-ul principal SE – și o căutare rapidă arată că s-au cerut multe variații acolo.
  • Cred că o cheie aici este că registrele de pe x86 sunt doar ” scop mai mult sau mai puțin general „, puteți utiliza oricare dintre acestea în operațiile de bază, dar există / au fost situații în care ați fost restricționat cu privire la ce registre puteți u se.
  • Un alt punct cheie este că compararea utilizării istorice și a celei moderne este înșelătoare când vine vorba de x86 (presupun aici că comentariul despre „Registrul cu scop general” se referă mai degrabă la EBX / RBX decât BX). Actualul x86 este compatibil cu versiunea anterioară cu 8086, dar programarea modernă a limbajului de asamblare x86 este foarte, foarte diferită în comparație cu programarea 8086 (sau chiar programarea 386); deci utilizarea BX nu spune neapărat multe despre utilizarea EBX / RBX.

Răspuns

BX a fost întotdeauna unul dintre registrele generale și a fost numit întotdeauna registrul de bază (vezi de exemplu The 8086 Primer , pagina 19). Este registrul de bază, deoarece poate fi utilizat în diferite moduri de adresare bazate: stocarea unei adrese în BX și un offset în SI sau DI (registrele indexului sursă și respectiv destinație), permite accesarea memoriei la BX + SI sau BX + DI ( ibid , pagina 31) sau BX + SI + imediat sau chiar BX + imediat . De asemenea, servește ca bază pentru XLAT.

BP este similar și acceptă toate modurile de adresare de mai sus. Diferența dintre BX și BP este că BX este implicit la segmentul de date (DS), în timp ce BP implicit la segmentul de stivă (SS). (BX și BP au fiecare propriile instrucțiuni specifice) – eg XLAT folosește BX, ENTER și LEAVE utilizați BP.)

Aceste moduri de adresare există și astăzi, deci utilizarea lor este încă relevantă, dar adresarea indexată și indirectă sunt disponibile cu orice registru general, pointer sau index începând cu 32-bit x86 . În timp ce BX și BP sunt „speciale” pe 16 biți x86, prin aceea că sunt singurele registre cu care este posibilă adresarea indirectă sau indexată, nu mai este cazul pe 32 sau 64 biți x86, deci EBX, EBP, RBX și RBP nu sunt atât de speciale. (BP, EBP și RBP sunt încă oarecum speciale, deoarece selectează SS ca registru de bază în modul de 16 și 32 de biți și nu pot fi utilizate ca indicatori fără un offset, ie există nu există cod opțional pentru MOV AX, [BP] și MOV AX, [BP+0] nu se folosește în schimb.)

Nu există nicio convenție pe care o știu de a rezerva în mod specific utilizarea BX pentru adresarea de bază; dacă trebuie să-l utilizați pentru adresarea de bază, îl configurați corespunzător și îl utilizați. Dacă convenția de apelare utilizată impune păstrarea BX, trebuie să vă asigurați că țineți cont de aceasta (ca apelant sau apelant în funcție de convenție și codul pe care îl scrieți).

Comentarii

  • +2 pentru adăugarea XLAT / ENTER / LEAVE.

Răspuns

(Acesta este în plus față de răspunsul lui Stephen Kitts)

De ce se numește istoricul adresei de bază, în mod istoric.

Ei bine, nu este „t. Dacă ar fi totul, atunci ar fi „Index de bază” (sau mai bun Index de bază), deoarece era în adresarea originală pe 16 biți singurul registru care putea fi adăugat ca „bază” în toate adresările indexate. Indexat cu SI sau DI adică. (* 1)

Această adresare a fost simetrică cu BP ca indicator de bază. Ideea de bază a fost că o matrice poate fi indicată cu BX și adresată prin SI sau DI fără alte precizări – sau BP când se află în stack (* 2)

Pe lângă faptul că „este unul dintre registrele de doi octeți cu scop general original.

Este ceva încă relevantă astăzi?

Nu chiar. Cel puțin nu în modul 32/64 biți.REX adresarea permite utilizarea oricărui registru „clasic” ca bază (index) în modul 32 biți – cu excepția BP / SP (* 3). În modul pe 64 de biți, 12 din cele 16 registre pot fi utilizate în același mod (Nu BP / SP / R12 / R13 (* 4)).

Acum, după ce am spus că, vine modul „Long” cu segmente de cod de mod protejat pe 16 biți . Aici codificarea clasică (16 biți) este utilizată împreună cu dimensiunea registrului de 32/64 biți. BX își păstrează avantajul de codificare, deoarece SIB nu este necesar. Cât de relevant este acest mod destul de uitat, este în discuție.

Există o convenție care să rezerve utilizarea acestuia pentru adresarea de bază?

Nu chiar. Folosiți după cum este necesar. La urma urmei, aceasta este Asamblarea – nu există nicio convenție pe care să nu o doriți :))

Singura problemă de care trebuie să aveți în vedere este păstrarea pentru apelantul dvs. (cu excepția cazului în care nu este realizată în mod explicit)

Puteți vedea cum se numește aici aici.

Err … spune că nu greșește, dar aș recomanda să căutați o descriere mai detaliată mai bună pentru a afla despre x86 (Verificați Wiki (cărți) sau OSDEV-Wiki ). Sau dacă este specific programării clasice (16 biți) x86, atunci există o singură carte pe care să o citiți: Steve Morse „ 8086 Primer . 32/64 Bit este oricum diferit și trebuie învățat fără ca aceste ipoteze clasice să fie cu adevărat utile în loc de un rucsac de cazuri speciale pentru cazuri speciale.


* 1 – Dacă doriți să atribuiți mnemonic nume la cele 4 registre de bază pe doi octeți, ar putea fi

  • AX = A ccumulator . Folosit pentru A ritmică (sau A întotdeauna cea mai scurtă codificare)
  • BX = B ase. Folosit ca indicator la date (structuri)
  • CX = C ounter. Folosit în shift / rotate, string ops și bucle.
  • DX = D ata. Folosit în aritmetică și I / O.

* 2 – Din nou, în cazul programării „standard” BP deține cadrul stivei, deci un index aici este întotdeauna un index în acel cadru, cu excepția cazului în care BP este mutat temporar.

* 3 – SP poate fi utilizat și cu .

* 4 – SP / R12 din nou cu SIB.

Comentarii

  • REX addressing allows [using any register in 32-bit mode] – v-ați referit SIB aici?
  • @ilkkachu Nop. Cel puțin nu din câte îmi amintesc. REX permite utilizarea modului r / m cu toate registrele. SIB este necesar doar pentru SP și R12. Și, bineînțeles, dacă doriți să utilizați scalarea … sau am înșelat asta? Trebuie să verific din nou.
  • Mm. Știu că ‘ este posibil să se utilizeze toate registrele ca indicatori în modul pe 32 de biți, deci nu poate fi ‘ REX. De fapt, se pare că în modul pe 32 de biți, doar octetul modr / m este suficient pentru a utiliza un singur registru ca adresă, nu este nevoie de SIB pentru acest caz (cu excepția ESP). wiki.osdev.org/…
  • @ilkkachu Jup, dar tu ‘ are dreptate, de asemenea, să utilizați un registru ca bază cu altul ca index, este nevoie de SIB. Permiteți-mi să verific acest lucru și să-mi corectez răspunsul. ok?

Răspuns

BX este cel mai vechi registru de indexare. De obicei, un element dintr-o structură ar fi accesat de [BX + constant]; de aici și numele său (sau, eventual, numele provine de la [BX + SI]; numai BX sau BP ar putea fi utilizate pe partea stângă și numai SI și DI ar putea fi utilizate pe partea dreaptă).

Nu am putut găsi un anumit lucru despre ebx / rbx, cu excepția celui mai mic registru care nu este acoperit de o instrucțiune specifică (mul / div / shl / shr), deci este un loc bun pentru a pune un pointer.

Pe de altă parte, [esp + offset] este o instrucțiune mai lungă decât [ebp + offset], astfel încât eliminarea indicatorului de cadru nu generează întotdeauna cod mai scurt.

Comentarii

  • Sunteți sigur că opcodurile pe 32 de biți sunt mai scurte? În modul pe 16 biți, există codificări explicite pentru combinațiile de BX / BP, SI / DI și o deplasare de 8 sau 16 biți, iar alte variante nu sunt codabile; în modul pe 32 de biți, se utilizează codarea generică a registrului (EAX / ECX / EDX / EBX / ESP / EBP / ESI / EDI), cu excepția faptului că 100b (de obicei ESP) este utilizat pentru a semnifica un octet SIB și 101b (de obicei EBP ) fără deplasare este folosit pentru a semnifica un offset pe 32 de biți.MOV EAX, [EBX+9] ia 3 octeți, la fel ca și MOV EAX, [ECX+9]; cu un registru suplimentar aveți nevoie de 4 octeți.
  • @StephenKitt: Sunt corectat. Singurul care este de fapt mai lung este [esp + x]

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *