Domanda:
Microprocessori / Microcontrollori - I registri hanno indirizzi?
chevestong
2013-03-08 04:22:38 UTC
view on stackexchange narkive permalink

Il mio professore di sistemi integrati continua a fare riferimento alle posizioni di memoria dei registri come ai rispettivi "indirizzi". Sono confuso da questo; Ho sempre avuto l'impressione che in qualsiasi microprocessore, i registri della CPU non abbiano indirizzi poiché non risiedono nella memoria principale (risiedono nel microprocessore stesso). Sono anche confuso su ciò a cui ci riferiamo quando diciamo "posizione di memoria del registro" - ancora una volta, non è nella memoria principale.

Detto questo, perché ci riferiamo alle posizioni della CPU si registra per "indirizzi"? Tutti / alcuni registri hanno indirizzi?

Ci ho pensato e ho pensato che forse sono "collegati" a certe locazioni di memoria principale, consentendo l'accesso ai valori memorizzati nei registri. Per estendere questo pensiero, è questo che cos'è la mappatura della memoria?

Dovrei anche aggiungere che stiamo lavorando specificamente con il microcontrollore LPC1768 di NXP, che utilizza il microprocessore ARM Cortex-M3.

Nove risposte:
Igor Skochinsky
2013-03-08 17:29:39 UTC
view on stackexchange narkive permalink

La fonte della confusione è che ci sono (in generale) due tipi di cose che possono essere chiamate "registri".

Il primo è probabilmente ciò che conosci: in ARM, registra R0, R1, R2, ... R12, SP, LR, PC e in x86 è eax, ebx, ecx, edx, ebp e così via. Questi possono anche essere chiamati " registri principali " o " registri del processore ". Non hanno indirizzi nello spazio di memoria del sistema e sono accessibili solo tramite istruzioni specifiche.

L'altro sono i registri che possono controllare vari blocchi hardware (periferiche), in la CPU stessa o esterna ad essa. Su LPC1768 e molti altri processori incorporati sono tipicamente mappati in memoria, ed è per questo che hanno indirizzi. Ad esempio, il blocco UART0 si trova all'indirizzo 0x4000C000 ed è lì che devi leggere o scrivere per comunicare con esso. Per distinguerli dai registri core, possono essere chiamati " registri periferici " o " registri hardware ".

Su alcuni 8 bit di fascia bassa microcontrollori come 8051 o PIC, potrebbero non esserci registri di base oltre forse un accumulatore, e tutti gli altri registri sono mappati in varie aree di memoria come "RAM interna" (per archiviazione / calcolo temporaneo) o "Registri di funzioni speciali" (SFR) memoria per i registri di controllo e periferiche. In essi, i "registri" hanno quasi sempre un indirizzo.

Gli ARM più grandi hanno anche registri del coprocessore , che possono essere usati per controllare varie funzioni principali (es. MMU o cache) con istruzioni come MRC o MCR . Questi registri sono simili ai registri principali in quanto non hanno un indirizzo di memoria ma solo un numero.

Inoltre, su x86 puoi avere porte I / O, a cui si accede tramite le istruzioni in e out , che possono essere utilizzate per controllare alcune blocchi hardware. Questi sono simili in funzione ai registri periferici ma di solito non sono chiamati tali.

I registri del processore sono accessibili in qualche modo?
@ProSteve037: ovviamente, altrimenti non avrebbe senso averli :) Di solito la maggior parte delle istruzioni funziona effettivamente con i registri del processore. Per esempio. su ARM: MOV, LDR, STR, ADD, SUB e così via.
@ProSteve037 In un certo senso, i registri del processore * hanno * una sorta di indirizzo, ma è usato nel `campo del registro` del codice operativo (la parola-istruzione del codice macchina) e non può essere confuso con gli indirizzi di memoria (le loro posizioni in il formato del codice operativo è distinto e i campi hanno dimensioni diverse).
Olin Lathrop
2013-03-08 05:08:51 UTC
view on stackexchange narkive permalink

Dipende dal particolare processore se i "registri" si trovano nello stesso spazio degli indirizzi della normale memoria dati o sono separati. In entrambi i casi, se ce ne sono più di uno, ognuno necessita comunque di un indirizzo.

Supponiamo che il processore abbia 16 registri che sono strettamente accoppiati alla CPU e implementati separatamente dalla memoria dati. Quei registri devono ancora essere identificati in qualche modo. In questo caso, sarebbe necessario un indirizzo a 4 bit per distinguere i singoli registri. In un'architettura RISC, l'indirizzo a 4 bit di qualunque registro (i) su cui ha lavorato un'istruzione sarebbe incluso nel codice dell'istruzione. Ad esempio, l'istruzione ADD potrebbe aggiungere il valore di un registro sorgente in un registro di destinazione. Tale istruzione includerebbe 4 bit per identificare il registro sorgente e altri 4 bit per identificare il registro di destinazione. La documentazione può fare riferimento a questi registri con un "numero" da 0 a 15, ma questo è davvero l'indirizzo di dove risiedono i registri in una piccola memoria speciale dalla CPU.

Oltre a quanto sopra, anche quando un il processore dispone di registri speciali dedicati, tali registri potrebbero essere mappati nello spazio di indirizzi dei dati di uso generale. I riferimenti a quegli indirizzi sono intrappolati e si riferiscono ai registri interni.

Ci sono molti schemi là fuori, ma se hai più di un registro, questi registri devono essere distinti l'uno dall'altro in qualche modo e all'interno l'hardware che avrà un "indirizzo", che lo si chiami nella documentazione o meno.

Ah, quindi c'è il problema. Ho sempre associato la memoria principale / RAM con indirizzi di memoria, ** esclusivamente **; Non avrei mai pensato di associare gli indirizzi di memoria a nient'altro. Grazie per aver chiarito tutto!
Inoltre, ora sono curioso; quale componente è responsabile della localizzazione e dell'accesso a questi indirizzi di registro?
Se sono registri dedicati ci sarà hardware solo per selezionare un registro. Poiché ci sono così pochi registri, è possibile utilizzare più hardware per decodificare e agire sui bit di indirizzo che potresti utilizzare in una normale memoria di grandi dimensioni. Ciò può rendere la decodifica più veloce, consentire più porte, ecc. Di solito qualsiasi registro può pilotare l'ingresso ALU e può salvare l'output ALU. In alcune architetture (dsPIC è un esempio) tre registri separati possono eseguire queste cose separatamente nella stessa istruzione.
Sam M-G
2013-03-08 04:47:06 UTC
view on stackexchange narkive permalink

Hai ragione sul fatto che alcuni registri non si trovano all'interno della memoria principale, ma piuttosto nel microprocessore stesso, e che quei registri sono mappati dalla memoria in determinate posizioni.

Il microcontrollore LPC1768 ha solo 64kB di RAM (cosa credo tu intenda per memoria principale) tuttavia un bus di indirizzi a 32 bit e 4 GB di spazio di indirizzi totale. Il resto di questo spazio di indirizzi contiene la memoria flash in cui è archiviato il programma e i registri per tutte le periferiche (ad esempio gli stati dei pin di uscita o l'ADC).

In genere quando si tenta di accedere a una memoria- posizione mappata, la logica all'interno del microcontrollore identificherà dove si trova fisicamente l'indirizzo di memoria e gestirà le linee di controllo in modo che i dati arrivino a dove erano destinati, indipendentemente dal fatto che si trovino nella RAM, in una porta GPIO o in un registro di controllo periferico. / p>

Ciò semplifica la scrittura del software, poiché non è necessario preoccuparsi troppo di dove si trovano fisicamente i registri e rende molto più semplice la compilazione di linguaggi di livello superiore (come il C).

Nel caso specifico dell'LPC1768, guardando il datasheet ( http://www.nxp.com/documents/data_sheet/LPC1769_68_67_66_65_64_63.pdf) possiamo vedere la mappa degli indirizzi a pagina 20 (Figura 4 ), che mostra dove sono mappate tutte le periferiche in memoria.

Ovviamente, il processore contiene anche una manciata di i registri interni che non sono mappati in memoria, è possibile accedervi molto più rapidamente di qualsiasi altra cosa nello spazio degli indirizzi, poiché la logica di gestione della memoria è lenta rispetto al core e vengono utilizzati come memoria temporanea durante le operazioni. Parte del lavoro di un compilatore è gestire l'archiviazione dei dati nei registri e spostarli dalla / nella memoria per te.

Wouter van Ooijen
2013-03-08 04:36:20 UTC
view on stackexchange narkive permalink

Come termine generico "registro" significa semplicemente un luogo in cui è possibile memorizzare ("registrare") informazioni, niente di più.

La maggior parte delle architetture riserva il termine registro per le posizioni all'interno della CPU che sono identificati da bit in un'istruzione e che sono spesso accessibili molto più velocemente della memoria di massa generale ("RAM"). (E spesso è possibile accedere a 2 o 3 registri in parallelo in un ciclo di esecuzione.)

Tuttavia, la documentazione PIC di Microchip, ad esempio, si riferisce a tutte le posizioni indirizzabili come registri, inclusa la RAM. Quando il tuo professore copia questo uso del termine dovrebbe IMO informarti che questo non è il modo in cui il termine "registro" è comunemente usato al giorno d'oggi. (Come spero di aver fatto nelle mie classi assembler PIC.)

Non solo microchip: guarda l'8051 per un esempio molto precedente, e anche quello potrebbe avere predecessori.
@ChrisStratton: Sono abbastanza sicuro che il PIC della General Instruments (su cui si basava il 16C54 di Microchip) sia precedente all'8051, e potrebbe persino precedere il suo predecessore l'8048.
Sì, sembra che sia precedente all'8048 di circa un anno.
Passerby
2013-03-08 18:21:25 UTC
view on stackexchange narkive permalink

Come altri hanno detto, dipende dalla famiglia del microcontrollore. E dipende da cosa intendi per registro.

Il msp430, ad esempio, ha due serie di "registri". Il primo è il file di registro RISC, con 16 registri a 16 bit. Questi includono i registri Program Counter, Stack Pointer, Status e Constant Generator e 12 registri di uso generale. Questi sono i registri nell'architettura tradizionale dell'uso della parola.

Register File

Il secondo insieme di registri è tutto il resto. Porte, periferiche, interrupt, ecc. Fanno parte del singolo file di memoria e condividono lo spazio con la RAM e la Flash (Code Space) di uso generale

Memory Map

Ad esempio il msp430g2231 ha un registro di uscita della porta 1 all'indirizzo di memoria 0x21.

Specifics

Puoi accedere al registro con il nome del registro p1out, ma è solo un puntatore alla memoria a 8 bit indirizzo 0x21. Soprattutto, è così che lo vede il compilatore. Il file di intestazione, in questo caso msp430g2231.h, definisce "p1out" come 0x0021. A parte il file di registro RISC, l'uso comune di Register significa semplicemente un indirizzo di memoria per l'opzione specifica x. Quello che vedi come Register p1out, è proprio il modo in cui una lingua più alta ti rende più facile programmare , invece di memorizzare le mappe di memoria.

Se usi un puntatore all'indirizzo di memoria 0x27f, dovresti invece leggere dalla RAM. Puntatore all'indirizzo di memoria 0xffdf e invece leggerai il codice compilato. Tutto un registro è, è un indirizzo di memoria per una funzione speciale.

Brian Drummond
2013-03-08 04:34:07 UTC
view on stackexchange narkive permalink

I registri hanno indirizzi, anche se generalmente non risiedono in memoria.

Pensaci un attimo: un indirizzo denota una posizione in uno spazio, dove la memoria è solo un'istanza di uno spazio. L'I / O ha spesso il proprio spazio di indirizzi; in alcune architetture di microcontrollori, la memoria del codice e la memoria dei dati sono spazi separati.

E così anche i registri possono avere il proprio spazio: a volte FP e registri interi (e sul 68000 credo, registri di indirizzo) hanno ciascuno il proprio spazio separato.

Una domanda è: come facciamo a sapere se l'indirizzo 1 si riferisce al byte 1 in memoria, alla porta I / O 1 o al registro 1? Di solito dal contesto: in un'istruzione IN o OUT, ovviamente una porta. In un'istruzione da registro a registro, è un indirizzo di registro. In un'istruzione Load, ci saranno un indirizzo di memoria (grande) e un indirizzo di registro (piccolo), e così via.

In un core ARM, un indirizzo di memoria sarà solitamente un numero a 32 bit; un indirizzo di registro sarà un numero a 5 bit.

Molti processori hanno alcuni registri ai quali si accede "per numero", ma anche alcuni registri che sono accessibili solo tramite istruzioni speciali. Non so come si possa descrivere in modo significativo il registro "S" del 6502 come avente un indirizzo, per esempio. A parte push / pop / call / return, le uniche istruzioni che accedono sono TSX / TXS (trasferimento da S a X o da X a S). Il bit 4 del codice operativo seleziona tra TSX e TAX, o tra TXS e TXA, ma non ha senso considerare gli opcode come "Trasferisci X al registro #b", poiché nessun'altra istruzione si riferisce ad A è reg # 0 e S come reg # 1.
supercat
2013-03-09 03:45:10 UTC
view on stackexchange narkive permalink

Se si definisce un indirizzo come un insieme di k bit che possono essere utilizzati per selezionare un elemento da un insieme di fino a 2 ^ k elementi, allora È comune che molti registri in molti processori e controllori abbiano indirizzi, ma anche che i controllori abbiano alcuni registri che sono bloccati da circuiti che rilevano condizioni particolari e non sono identificabili tramite alcuna forma di indirizzo. È importante notare, tuttavia, che in molti casi i cavi di indirizzo che controllano i registri della CPU non avranno alcuna relazione con i cavi di indirizzo che sono collegati a sistemi di memoria più grandi. In quanto tali, gli "indirizzi" di registro esisteranno spesso in un "universo" completamente separato dagli indirizzi di memoria.

Sulla maggior parte dei processori, gli "indirizzi" di registro sono sempre generati internamente dalla logica del processore, fuori dal controllo del programmatore o recuperato da determinati bit in ciascuna istruzione. L'unico modo in cui il codice di modifica potrebbe influenzare dal software quale registro dovrebbe essere recuperato da una particolare istruzione sarebbe quello di correggere i bit appropriati all'interno di tale istruzione. Sul PIC di General Instruments, il cui design vive sotto forma di PIC Microchip, se un codice operativo specificasse tutti gli zeri per un indirizzo, l'hardware sostituirebbe il contenuto di un registro diverso situato all'indirizzo 3. Ciò consente al codice di utilizzare calcoli per selezionare un indirizzo.

Forse la cosa più importante da capire sugli indirizzi è che è possibile per un sistema avere spazi di indirizzi differenti che esistono effettivamente in universi differenti. Sull'8051, ad esempio, ci sono, a seconda di come si conta, almeno quattro diversi spazi di indirizzi e possibilmente fino a sei; quattro di loro sono completamente indipendenti (le istruzioni:

  mov a, 80h; Direct address spacemov a, @ r0; Assume R0 = 80hmovc a, @ a + dptr; Assume A = 0 and DPTR = 80hmovx a, @ dptr; Assumi DPTR = 80h  

tutti recuperano i dati dall '"indirizzo 80h" ma leggono quattro cose non correlate: un indirizzo nello spazio I / O (il registro dati della porta 0 credo), registro dati interno 80h, memoria codice all'indirizzo 0x0080 e memoria dati esterna all'indirizzo 0x0080. In molti sistemi, queste cose non avrebbero di fatto alcuna relazione tra loro. Il fatto che un registro risponda a un particolare indirizzo in un universo dice poco o nulla sul fatto che risponderà a quello o a qualsiasi altro indirizzo in un universo diverso.

david
2013-03-08 10:59:51 UTC
view on stackexchange narkive permalink

RISC significa "Computer con set di istruzioni ridotto". Parte del modo in cui riduci la dimensione del set di istruzioni è disporre di un solo tipo di posizione dei dati, che include registri, RAM o I / O.

Quando le persone prendevano sul serio queste idee, i due si aspettavano i vantaggi dei progetti RISC erano che potevi rendere il processore molto più veloce se lo rendessi molto più semplice e che potresti ottimizzare il codice del tuo programma se potessi usare qualsiasi indirizzo di memoria per qualsiasi cosa, invece di forzare il caricamento e lo scaricamento di tutto passando attraverso il Il registro ALU per l'aritmetica, il registro Memory Address per l'indirizzamento della memoria ecc.

Due residui di quel modo di pensare sono: (1) Abbiamo processori che Fingono che tutti i registri siano uguali, mappando i registri nello spazio di memoria e (2) abbiamo professori che Fingono che tutti i registri siano uguali, chiamando le posizioni di memoria dei registri.

Sii tollerante. Era un'importante area di ricerca per gli studenti di dottorato di ricerca, che ha avuto un impatto significativo e duraturo sul modo in cui sono stati progettati alcuni processori.

No. RISC non tende a significare la perdita di distinzione tra il file di registro e la memoria principale, poiché ciò complicherebbe la decodifica delle istruzioni, che è l'opposto degli obiettivi RISC. Il RISC è tradizionalmente basato su semplici istruzioni che fanno ciò che fanno rapidamente e lascia che il programmatore / compilatore le metta insieme. Quindi le versioni di registro e di indirizzo di memoria delle istruzioni hanno codifiche diverse in un'architettura RISC classica. E l'accesso alla memoria è di solito a un indirizzo fornito da un registro con uno spostamento immediato limitato poiché nella parola di istruzione sono disponibili solo tanti bit.
Hai capito bene tranne la prima frase. La perdita di distinzione tra il file di registro e la memoria principale è uno dei modi in cui il RISC classico ha semplificato la decodifica delle istruzioni, che è uno degli obiettivi del RISC. In pratica intervengono considerazioni pratiche. Ad esempio, vedere [The Ultimate RISC] (http://homepage.cs.uiowa.edu/~jones/arch/risc/)
Una parola di istruzione RISC codifica abbastanza esplicitamente un numero di registro o un riferimento di memoria, il che è un presidio di distinzione rispetto alla situazione qui contemplata in cui un registro è codificato esattamente allo stesso modo di un indirizzo di memoria.
Si prega di leggere prima il riferimento. Prima di postare.
Il riferimento è a un'architettura accademica stravagante, non ai classici progetti Risc come effettivamente costruiti.
Hai notato! Ora torna indietro e leggi il post originale e la mia risposta. Notare la parola "professore" in entrambi i post. Vedere? Domanda risposta. Risposta, domanda. Stretta relazione. Non ho scelto di scrivere su un argomento diverso.
old_timer
2013-03-09 08:09:00 UTC
view on stackexchange narkive permalink

L'8051 se ricordo bene si poteva accedere ai registri utilizzando indirizzi di memoria, ma questo non è il caso generale per tutti i processori. I processori ARM non hanno modo di farlo, i registri per scopi generali r0-r15 non sono accessibili sul bus di memoria.



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...