2016-04-10 36 views
5

Secondo Intel in x64 i seguenti registri sono chiamati registri di uso generale (RAX, RBX, RCX, RDX, RBP, RSI, RDI, RSP e R8-R15) https://software.intel.com/en-us/articles/introduction-to-x64-assembly.Perché rpb e rsp vengono chiamati registri di scopo generale?

Nel seguente articolo, è scritto che RBP e RSP sono registri di scopo speciale (punto RBP alla base del frame dello stack corrente e punto RSP all'inizio del frame dello stack corrente). https://www.recurse.com/blog/7-understanding-c-by-learning-assembly

Ora ho due affermazioni contraddittorie. La dichiarazione di Intel dovrebbe essere quella attendibile, ma che cosa è corretto e perché RBP e RSP hanno definito lo scopo generale?

Grazie per qualsiasi aiuto.

+4

È possibile utilizzare entrambi come registri di uso generale, vale a dire che le normali istruzioni aritmetiche e logiche funzionano correttamente. 'rbp' è praticamente uno scopo generale, la cosa del puntatore del frame è solo convenzione. – Jester

+0

Per ogni registro sono disponibili alcune caratteristiche (eccetto R8-R15), per alcune istruzioni. Per RSP, è speciale per 'push' /' pop'/'call' /' ret', quindi la maggior parte del codice non la usa mai per nient'altro. Ma in condizioni controllate (come nessun gestore di segnale) non * devi * usarlo per un puntatore allo stack. per esempio. puoi usarlo per leggere un array in un ciclo con 'pop', come [in questa risposta code-golf] (https://codegolf.stackexchange.com/questions/133618/extreme-fibonacci/135618#135618). (In realtà ho usato 'esp' nel codice a 32 bit, ma la stessa differenza). –

+0

Immagino che se estendi la definizione di "particolarità" alla codifica, anche 'r13' è un po 'speciale, sebbene non sia realmente funzionale in quanto puoi ancora utilizzare efficacemente ogni modalità di indirizzamento (anche se l'assembly a volte inserisce uno spostamento zero nascosto per te). – BeeOnRope

risposta

8

Scopo generale significa che tutti questi registri possono essere utilizzati con qualsiasi istruzione che esegua il calcolo con registri generali, mentre, ad esempio, non è possibile fare ciò che si desidera con il puntatore di istruzioni (RIP) o il registro flag (RFLAGS).

Alcuni di questi registri sono stati concepiti per essere utilizzati per un uso specifico, e comunemente lo sono. I più critici sono RSP e RBP.

Se è necessario utilizzarli per i propri scopi, è necessario salvarne il contenuto prima di archiviare qualcos'altro all'interno e ripristinarli al loro valore originale una volta terminato.

+0

Alcuni compilatori hanno l'opzione di non utilizzare i puntatori dei frame, nel qual caso RBP diventa un computer di uso generale. – rcgldr

+2

È wroth notare che l'uso di 'rpb' come un puntatore di fotogramma è essenzialmente interamente _convention_ e non ha alcun supporto per la CPU (infatti, l'ABI di Windows 64 ti permette di usare qualsiasi registro come puntatore di fotogramma e non preferisce' rbp'). Questo è molto diverso da 'rsp' che è strettamente legato alla sua funzione a livello hardware poiché è implicitamente usato da' push', 'pop' e amici. – BeeOnRope

+0

@BeeOnRope Grazie per il tuo commento, risposta aggiornata. – jlliagre