2015-07-03 19 views
7

ero debug di codice CLR in assemblea, e avuto modo di una lineaCosa QWORD ptr [HexValue] dire senza una base registrarmi

mov rax, qword ptr [ff4053c0h] 

penso qword ptr [ff4053c0h] si riferisce ad una stringa che mi interessa, ma ff4053c0h non è una posizione di memoria valida. Leggendo su qword ptr sembra fare riferimento a un indirizzo basato su un registro di base (ad esempio qword ptr [rsp+30h] è 30 byte nello stack), ma non riesco a trovare cosa significhi senza registro di base.

+0

Si riferisce alla posizione di indirizzo indicata da 'ff4053c0h' come una parola quadrupla (64 bit). Qualunque sia il valore a 64 bit a quell'indirizzo verrà caricato in 'rax'. Se l'indirizzo non è valido, allora c'è un problema. Sei sicuro che non sia valido? – lurker

risposta

7

Se non viene fornito il registro di base, significa data segment (http://www.osdata.com/system/physical/memory.htm). Nel tuo codice, mov rax, qword ptr [ff4053c0h] significa "prendi 8 byte dal segmento di dati offset FF4053C0h e inseriscili in RAX".

Come si indica correttamente, la presenza di un registro di base come rsp indica chiaramente il segmento dello stack. Nel tuo caso, nessun registro di base significa segmento di dati.

Ora, circa il grande numero di "FF4053C0h", che è "4 282 405 824", è perfettamente possibile avere 4 GB di memoria indirizzabile (http://wiki.osdev.org/Protected_Mode), che conferma che la linea di codice potrebbe essere valido ed è di accesso a compensare FF4053C0h in un enorme segmento di dati (http://www.ece.unm.edu/~jimp/310/slides/micro_arch2.html).

Un'altra fonte = Assembly: Using the Data Segment Register (DS).

+0

Ho detto che l'indirizzo non era valido perché quando lo cerco nella finestra di memoria nel debugger di Visual Studio mostrava una memoria non mappata (invece dei contenuti). La finestra di memoria dovrebbe mostrare il segmento di dati per impostazione predefinita, quindi non sono sicuro di cosa mi manchi, controllerò di nuovo più tardi. – Rattle

+0

@Rattle, il sistema operativo potrebbe proteggere la memoria dall'accesso di altri processi, quindi questi processi non possono vedere la memoria protetta. –

5

senza complicare le cose per nessuna buona ragione:

significa che un valore a 64 bit viene letto dal indirizzo 0ff4053c0h nel registro RAX.

L'indirizzo deve essere valido, ricontrollare.
Il QWORD PTR è solo un identificatore di dimensioni (ridondante qui, ma migliora la leggibilità), non è correlato con un registro di base.

Se sei veramente interessato alle varie modalità di indirizzamento della CPU, puoi leggere i manuali Intel (Google).

0

Si sta spostando un valore a 64 bit dalla memoria nel registro rax. Il valore viene letto dall'indirizzo ff4053c0h. qword ptr è un suggerimento per l'assemblatore di creare un codice operativo di spostamento (codice macchina) usando un indirizzo costante a 64 bit. Il valore fornito è un valore a 32 bit (8 cifre esadecimali => 8 volte una cifra esadecimale/lettera => 8 * 4 bit => 32 bit).

Ci sono codici operativi di spostamento che supportano operazioni a 32 bit ma (molto probabilmente controllano le specifiche per la CPU/Modalità) non per caricare la memoria in un registro a 64 bit. Quindi qword è necessario per garantire all'assembler di voler veramente esprimere un indirizzo a 64 bit.

Per il tuo commento sull'indirizzo che punta alla memoria indefinita (vedi i commenti per la risposta accettata), capisci che al giorno d'oggi ogni processo ha una tabella di memoria virtuale assegnata. La memoria virtuale fondamentalmente mappa un indirizzo logico in un indirizzo nella memoria reale. Impedisce ai processi di vedere e modificare la memoria che non appartiene al processo, fornendo una grande stabilità a un sistema in esecuzione.

Avendo due processi che condividono una porzione di memoria, è possibile che ogni singolo processo visualizzi la stessa memoria fisica in indirizzi logici diversi. Il sistema operativo decide come appare la memoria virtuale di ogni processo.

La mappatura viene fornita su un livello per pagina (ad esempio pagina = 4KB) e il processore esegue internamente la mappatura effettiva.

Questo concetto è molto vero per mappare i file in memoria e condividere la memoria tra diversi processi. In questo modo è possibile mappare un file da 2 GB in memoria e utilizzare contemporaneamente 10 processi con lo stesso file mappato mentre viene consumata solo (al massimo) 2 GB di memoria effettiva. È il modo in cui il file io-caching viene eseguito principalmente a livello di sistema operativo.