В ассемблере, если мы используемDWORD путаница использование PTR
mov eax, dword ptr[ebx]
, то это означает скопировать значение, на который указывает EBX (EBX содержит значение адреса, а не фактическое значение, это инструкция копирует фактическое значение в адресе)?
Если мы используем
mov eax, dword ptr[some_variable]
, то это означает скопировать значение переменной «some_variable» себя в EAX, а не копировать значение указываемого переменной «some_variable»?
Правильно ли я понимаю?
Если да, то я смущен, почему одна и та же инструкция по сборке имеет два разных значения - в первом случае существует уровень косвенности, но во втором нет дополнительного уровня косвенности.
Любые комментарии?
EDIT:
Не каждый [] не принимает никакого эффекта, например, инструкция XCHG будет принимать уровень в направлении, которое загружает значение, на который указывает EDX.
Весь исходный код может быть найден из,
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
«Без кронштейнов это будет означать то же самое». - это зависит от используемого ассемблера. MASM позволяет это, nasm/yasm/fasm не делает (и imho с уважительной причиной - вы * совершаете косвенные действия, когда читаете переменную, лучше всего ясны в ней). Вот что такое сборка, не так ли?) – snemarch
Да, конечно. Одно недоразумение часто равно длительной отладке. – sharptooth
Привет sharptooth, если добавить [] и без добавления [], эффекты будут одинаковыми, почему люди будут печатать дополнительные []? Я думаю, что большинство разработчиков ленивы.:-) – George2