2009-03-27 4 views
15

В ассемблере, если мы используем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 

ответ

12

В обоих случаях вы задаете процессор, чтобы переместить значение из указанного адреса. Это один уровень косвенности. В первом случае вы просите его взять адрес из указанного регистра. Во втором случае вы прямо указываете смещение.

Процессоры x86 не поддерживают двухуровневую обратную связь, поэтому невозможно запросить загрузить значение из адреса, указанного где-то в памяти, - вы должны загрузить адрес в регистр.

Под номером монтажников (MASM и встроенный в VC++ ассемблер, например), вы могли бы и написать просто

mov eax, dword ptr some_variable 

без скобок, то это будет означать то же самое.

Вы могли бы написать

move eax, dword ptr [variable][ebx] 

это даст указание взять адрес «переменной», а затем добавить значение EBX и использовать сумму в качестве адреса, с которого загружать значение. Это часто используется для доступа к элементам массива по индексу.

Во всех этих случаях процессор будет делать то же самое - загрузить значение с указанного адреса. Каждый раз это один уровень косвенности.

+1

«Без кронштейнов это будет означать то же самое». - это зависит от используемого ассемблера. MASM позволяет это, nasm/yasm/fasm не делает (и imho с уважительной причиной - вы * совершаете косвенные действия, когда читаете переменную, лучше всего ясны в ней). Вот что такое сборка, не так ли?) – snemarch

+0

Да, конечно. Одно недоразумение часто равно длительной отладке. – sharptooth

+0

Привет sharptooth, если добавить [] и без добавления [], эффекты будут одинаковыми, почему люди будут печатать дополнительные []? Я думаю, что большинство разработчиков ленивы.:-) – George2

Смежные вопросы