BX è il registro degli indirizzi di base e, in caso affermativo, perché?

Ho visto molti post su BX. Credo che oggi sia un “registro per scopi generici”. Sono confuso sul motivo per cui la gente lo chiama Base Address Register,

  • Perché storicamente è chiamato Base Address Register.
  • Qualcosa di tutto ciò è ancora rilevante oggi ?
  • Esiste una convenzione per riservarne luso per lindirizzamento di base?

Puoi vederlo viene chiamato così qui .

Commenti

  • A pensarci bene, questo non è ‘ t esattamente una domanda RC, in quanto ‘ t indirizza a nulla sul vecchio computer, soprattutto non dal momento che richiede rilevanza oggi . Questa domanda sarebbe più adatta sul sito principale di SE – e una rapida ricerca mostra che sono state richieste molte varianti.
  • Penso che una chiave qui sia che i registri su x86 sono solo ” più o meno generico “, puoi usarne uno qualsiasi nelle operazioni di base ma ci sono / cerano situazioni in cui eri limitato riguardo a quali registri potresti usare se.
  • Un altro punto chiave è che il confronto tra lutilizzo storico e luso moderno è fuorviante quando si tratta di x86 (presumo qui che il commento su “General Purpose Register” si riferisca piuttosto a EBX / RBX di BX). Lattuale x86 è retrocompatibile con l8086, ma la moderna programmazione in linguaggio assembly x86 è molto, molto diversa rispetto alla programmazione 8086 (o addirittura 386); quindi lutilizzo di BX non dice necessariamente molto sullutilizzo di EBX / RBX.

Risposta

BX è sempre stato uno dei registri generali, ed è sempre stato chiamato registro di base (vedi ad esempio The 8086 Primer , pagina 19). È il registro di base perché può essere utilizzato in varie modalità di indirizzamento basate: memorizzare un indirizzo in BX e un offset in SI o DI (rispettivamente i registri dellindice di origine e di destinazione), consente di accedere alla memoria su BX + SI o BX + DI ( ibid , pagina 31) o BX + SI + immediato o anche BX + immediato . Serve anche come base per XLAT.

BP è simile e supporta tutte le modalità di indirizzamento di cui sopra. La differenza tra BX e BP è che BX utilizza per impostazione predefinita il segmento dati (DS), mentre BP utilizza per impostazione predefinita il segmento dello stack (SS). (BX e BP hanno ciascuno le proprie istruzioni specifiche – ad es. XLAT utilizza BX, ENTER e LEAVE usa BP.)

Queste modalità di indirizzamento esistono ancora oggi, quindi il loro utilizzo è ancora pertinente, ma indirizzamento indicizzato e indiretto sono disponibili con qualsiasi registro generale, puntatore o indice che inizia con x86 a 32 bit . Mentre BX e BP sono “speciali” su x86 a 16 bit, in quanto sono gli unici registri con cui è possibile lindirizzamento indiretto o indicizzato, non è più il caso su x86 a 32 o 64 bit quindi EBX, EBP, RBX e RBP non sono così speciali. (BP, EBP e RBP sono ancora un po speciali poiché selezionano SS come registro di base in modalità 16 e 32 bit e non possono essere usati come puntatori senza un offset, ie cè nessun codice operativo per MOV AX, [BP] e MOV AX, [BP+0] finisce per essere utilizzato.)

Non ci sono convenzioni che conosco di riservare specificamente luso di BX per lindirizzamento di base; se è necessario utilizzarlo per lindirizzamento di base, configurarlo in modo appropriato e utilizzarlo. Se la convenzione di chiamata in uso richiede che BX venga preservata, è necessario assicurarsi di tenerne conto (come chiamante o chiamato a seconda della convenzione e del codice che si sta scrivendo).

Commenti

  • +2 per laggiunta di XLAT / ENTER / LEAVE.

Risposta

(Questo è in aggiunta alla risposta di Stephen Kitts)

Perché storicamente “è chiamato registro degli indirizzi di base.

Beh, non è “t. Se fosse tutto, sarebbe “Base Index” (o meglio Index Base), poiché era nellindirizzamento originale a 16 bit lunico registro che poteva essere aggiunto come “Base” in tutti gli indirizzamenti indicizzati. Indicizzato con SI o DI. (* 1)

Questo indirizzamento era simmetrico con BP come puntatore di base. Lidea di base era che un array potesse essere puntato con BX e indirizzato tramite SI o DI senza ulteriori indugi – o BP quando allinterno del stack (* 2)

Oltre a questo è uno dei registri a due byte originali per scopi generali.

È uno di questi ancora rilevante oggi?

Non proprio, almeno non in modalità 32/64 bit.Lindirizzamento REX consente luso di qualsiasi registro “classico” come base (indice) in modalità a 32 bit, tranne BP / SP (* 3). Nella modalità a 64 bit, 12 dei 16 registri possono essere utilizzati allo stesso modo (non BP / SP / R12 / R13 (* 4)).

Ora, detto questo, arriva la modalità “Long” con segmenti di codice in modalità protetta a 16 bit . Qui viene utilizzata la codifica classica (16 bit) insieme alla dimensione del registro a 32/64 bit. BX conserva il suo vantaggio di codifica, poiché SIB non è necessario. È in discussione quanto sia rilevante questa modalità piuttosto dimenticata.

Esiste una convenzione per riservarne luso per lindirizzamento di base?

Non proprio. Utilizzare secondo necessità. Dopotutto, questo è Assembly – non cè nessuna convenzione che non vuoi :))

Lunico problema da tenere a mente è preservarlo per il tuo chiamante (a meno che non sia esplicitamente non fatto)

Puoi vedere che si chiama così qui.

Err … lascia dico che non ha torto, ma consiglierei di cercare una descrizione più dettagliata per conoscere x86 (controlla Wiki (libri) o OSDEV-Wiki ). Oppure, se è specifico della programmazione x86 classica (16 bit), cè solo un libro da leggere: Steve Morse “ 8086 Primer . 32/64 Bit è comunque diverso e deve essere appreso senza questi classici presupposti per essere davvero utile al posto di uno zaino di casi speciali su casi speciali.


* 1 – Se si desidera assegnare mnemonici nomi ai 4 registri di base a due byte, potrebbe essere

  • AX = A ccumulator . Utilizzato per A rithmetic (o A sempre la codifica più breve)
  • BX = B ase. Utilizzato come puntatore a dati (strutture)
  • CX = C ounter. Utilizzato in shift / rotate, string ops e loop.
  • DX = D ata. Utilizzato in aritmetica e I / O.

* 2 – Di nuovo, in caso di programmazione “standard” BP contiene lo stack frame, quindi un indice qui è sempre un indice in quel frame, a meno che BP non venga temporaneamente spostato.

* 3 – SP può essere utilizzato anche con SIB codifica.

* 4 – SP / R12 di nuovo con SIB codifica.

Commenti

  • REX addressing allows [using any register in 32-bit mode] – intendevi SIB qui?
  • @ilkkachu Nop. Almeno non per quanto ricordo. REX consente di utilizzare la modalità r / m con tutti i registri. SIB è necessario solo per SP e R12. E ovviamente se vuoi usare il ridimensionamento … o ho sbagliato? Devo ricontrollare.
  • Mm. So che ‘ è possibile utilizzare tutti i registri come puntatori in modalità a 32 bit, quindi ‘ non può essere REX. In realtà, sembra che nella modalità a 32 bit, solo il byte modr / m sia sufficiente per utilizzare un singolo registro come indirizzo, nessun SIB necessario per quel caso (eccetto ESP). wiki.osdev.org/…
  • @ilkkachu Jup, ma tu ‘ hai ragione anche, per usare un registro come base con un altro come indice, è necessario il SIB. Consentitemi di ricontrollare questo e correggere la mia risposta. ok?

Risposta

BX è il registro di indicizzazione più vecchio. In genere si accede a un elemento in una struttura [BX + constant]; da qui il suo nome (o forse il nome deriva da [BX + SI]; solo BX o BP potrebbero essere usati sul lato sinistro e solo SI e DI potrebbero essere usati sul lato destro).

Non sono riuscito a trovare una cosa particolare su ebx / rbx tranne che “è il registro più basso non rovinato da unistruzione specifica (mul / div / shl / shr), quindi” è un buon posto dove mettere un pointer.

Daltra parte, [esp + offset] è unistruzione più lunga di [ebp + offset] quindi leliminazione del frame pointer non genera sempre codice più breve.

Commenti

  • Sei sicuro che i codici operativi a 32 bit siano più brevi? Nella modalità a 16 bit, sono presenti codifiche esplicite per le combinazioni di BX / BP, SI / DI e uno spostamento a 8 o 16 bit e altre varianti non sono codificabili; in modalità a 32 bit, viene utilizzata la codifica del registro generico (EAX / ECX / EDX / EBX / ESP / EBP / ESI / EDI), tranne che 100b (solitamente ESP) viene utilizzato per indicare un byte SIB e 101b (solitamente EBP ) senza spostamento viene utilizzato per indicare un offset a 32 bit.MOV EAX, [EBX+9] richiede 3 byte, così come MOV EAX, [ECX+9]; con un registro aggiuntivo sono necessari 4 byte.
  • @StephenKitt: sono corretto. Lunico effettivamente più lungo è [esp + x]

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *