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
"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
Sì, certo. Un malinteso spesso equivale a un debug lungo tempo. – sharptooth
Hi sharptooth, se aggiungi [] e senza aggiungere [], gli effetti sono gli stessi, perché le persone digitano ulteriori []? Penso che molti sviluppatori siano pigri.:-) – George2