5

Sono un po 'confuso con le dimensioni dell'istruzione e lo spazio indirizzabile (presumo che le dimensioni dell'istruzione debbano essere uguali alle dimensioni dei bit di indirizzo. book) Se sono corretto, allora in teoria se disponiamo di 2^32 unità indirizzabili (byte) di memoria nell'architettura a 32 bit (stile RISC) come un'istruzione di caricamento di dimensioni 4byte mantiene l'opcode e l'indirizzo?Istruzioni di caricamento in attesa a 32 bit IR (architettura a 32 bit in stile RISC)

+0

Si potrebbe anche avere * non * bit di indirizzo nelle istruzioni, dipende dalle modalità di indirizzamento che si intende avere – harold

+0

Stai assumendo che una singola istruzione può codificare un carico da un indirizzo assoluto arbitrario. Ci sono trucchi per rendere flessibili i salti, ma il codice di solito non * ha bisogno * di contenere indirizzi hard-coded per dati che potrebbero essere molto lontani. –

+0

Quindi, di solito non possiamo accedere ad alcun indirizzo arbitrario usando la modalità immediata? – Saravanan

risposta

1

È possibile codificare un valore immediato a 32 bit in un'istruzione a 4 byte limitando la quantità di valori che possono essere rappresentati nell'intervallo.

ARM esegue codifica immediata con 8 bit, più un campo aggiuntivo a 4 bit che specifica una rotazione. La CPU calcola il valore immediato prendendo questi 8 bit e spostandoli il numero di volte indicato dal campo a 4 bit.

2

Per le istruzioni di accesso alla memoria, le istruzioni in genere utilizzano un registro di indirizzi con offset. Qualcosa nella forma: load R1, [R2 + 8]. ARM, x86, MIPS e molti altri offrono questa modalità. C'è spesso la possibilità di utilizzare il PC come registro degli indirizzi, per poter recuperare le costanti che si trovano accanto al codice.

Per istruzioni di salto, oltre a utilizzare un registro di indirizzi, è spesso presente un salto di offset, che non utilizza alcun registro ma salta le istruzioni X in avanti o indietro. L'offset è solitamente limitato nell'intervallo e può essere spostato di una certa quantità (limitando agli indirizzi multipli di 2, 4 ...), quindi può essere contenuto in un piccolo operando immediato.
I MIPS utilizzano anche un mix tra salto assoluto e relativo: l'istruzione j salta a un indirizzo assoluto, ma nella regione dell'istruzione corrente. Per essere precisi, nell'indirizzo immediato mancano alcuni bit superiori (in modo che possano adattarsi) e utilizzano invece i bit superiori del PC corrente.

1

E uno scherzo in più (anche ARM utilizza una versione di questo): se l'indirizzo dell'istruzione deve essere allineato a 4 byte, non includere i 2 bit più bassi - devono essere zero. Ora hai 2 bit per l'opcode.

E alcuni processori non supportano affatto gli indirizzi assoluti, solo offset relativi piuttosto lunghi. Questi sistemi usano trampolini per salti più lunghi.

3

Si presume che una singola istruzione possa codificare un carico da un indirizzo assoluto arbitrario. Questo è vero su x86, anche in modalità 64 bit (ma esiste un opcode speciale per il caricamento da un indirizzo assoluto a 64 bit senza registro di spostamento o indice, e il dest deve essere rax).

Sulla maggior parte delle architetture RISC, il caricamento da un indirizzo assoluto viene in genere eseguito con due istruzioni mov-immediate per impostare la metà superiore e inferiore di un registro, quindi utilizzare tale registro come indirizzo per un carico.

Per esempio,

int a; 
int foo(void) { return a; } 

compiles to (ARM gcc 4.8.2 on godbolt):

foo(): 
    movw r3, #:lower16:.LANCHOR0 @ tmp113, 
    movt r3, #:upper16:.LANCHOR0 @ tmp113, 
    ldr r0, [r3] @, a 
    bx lr @ 
a: 
    .space 4