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ì comeMOV EAX, [ECX+9]
; con un registro aggiuntivo sono necessari 4 byte. - @StephenKitt: sono corretto. Lunico effettivamente più lungo è [esp + x]