2009-03-27 8 views
15

Nel linguaggio assembly se usiamodword utilizzo PTR confusione

mov eax, dword ptr[ebx] 

allora significa copiare il valore puntato da EBX (ebx contiene il valore di indirizzo, non il valore effettivo, questa istruzione copia il valore effettivo nell'indirizzo)?

Se usiamo

mov eax, dword ptr[some_variable] 

allora significa copiare il valore della variabile "some_variable" stessa per eax, non copiare il valore indicato dalla variabile "some_variable"?

La mia comprensione è corretta?

Se sì, sono confuso perché le stesse istruzioni di assemblaggio hanno due significati diversi: nel primo caso c'è un livello di riferimento indiretto, ma nel secondo non c'è un ulteriore livello di riferimento indiretto.

Qualche commento?

EDIT:

Non ogni [] non prendere qualsiasi effetto, ad esempio, istruzioni xchg avrà un livello di in-direzione, che carica valore puntato da edx.

intero codice sorgente potrebbe essere trovato da,

http://www.codeproject.com/KB/threads/spinlocks.aspx

#ifdef WIN32 
inline int CPP_SpinLock::TestAndSet(int* targetAddress, int nValue) 
{ 
    __asm { 
     mov edx, dword ptr [pTargetAddress] 
     mov eax, nValue 
     lock xchg eax, dword ptr [edx] 
    } 
} 
#endif // WIN32 

risposta

12

In entrambi i casi si chiede al processore per spostare il valore da un indirizzo specificato. È un livello di riferimento indiretto. Nel primo caso chiedete di prendere l'indirizzo da un registro specificato. Nel secondo caso specifichi direttamente un offset.

I processori x86 non supportano l'indirizzamento a due livelli, quindi non è possibile richiedere di caricare un valore da un indirizzo specificato da qualche parte nella memoria: è necessario caricare l'indirizzo su un registro.

Sotto un certo numero di assemblatori (MASM e costruito in VC++ assembler, per esempio) si potrebbe pure scrivere semplicemente

mov eax, dword ptr some_variable 

senza parentesi, vorrebbe dire la stessa cosa.

Si potrebbe scrivere

move eax, dword ptr [variable][ebx] 

questo avrebbe istruito a prendere l'indirizzo della "variabile", quindi aggiungere il valore di EBX e utilizzare la somma come un indirizzo da cui caricare un valore. Questo è spesso usato per accedere agli elementi dell'array per indice.

In tutti questi casi il processore farebbe lo stesso - caricare un valore da un indirizzo specificato. È un livello di riferimento indiretto ogni volta.

+1

"senza parentesi, significherebbe lo stesso." - Dipende dall'assemblatore usato. MASM permette a questo, nasmo/yasm/fasm di non farlo (e imho con una buona ragione - tu * stai * facendo l'indirezione quando leggi una variabile, meglio essere espliciti a riguardo. Ecco di cosa tratta l'assemblaggio, non è vero?) – snemarch

+0

Sì, certo. Un malinteso spesso equivale a un debug lungo tempo. – sharptooth

+0

Hi sharptooth, se aggiungi [] e senza aggiungere [], gli effetti sono gli stessi, perché le persone digitano ulteriori []? Penso che molti sviluppatori siano pigri.:-) – George2