путаница в использовании dword ptr - PullRequest
18 голосов
/ 27 марта 2009

На ассемблере, если мы используем

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

1 Ответ

12 голосов
/ 27 марта 2009

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

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

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

mov eax, dword ptr some_variable

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

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

move eax, dword ptr [variable][ebx]

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

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

...