如果使用汇编语言

mov eax, dword ptr[ebx]


那么这意味着复制ebx指向的值(ebx包含地址值,而不是实际值,此指令将实际值复制到地址中)?

如果我们使用

mov eax, dword ptr[some_variable]


那么这意味着将变量“ some_variable”本身的值复制到eax,而不是复制变量“ some_variable”所指向的值?

我的理解正确吗?

如果是的话,我很困惑为什么同一汇编指令具有两种不同的含义-第一种情况下有一个间接级别,但是在第二种情况下没有附加的间接级别。

任何意见?

编辑:

并非每个[]都不会产生任何效果,例如,指令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

最佳答案

在这两种情况下,您都要求处理器将值从指定的地址移出。这是间接的一种级别。在第一种情况下,您要求它从指定的寄存器中获取地址。在第二种情况下,您可以直接指定偏移量。

x86处理器不支持双级间接寻址,因此不可能请求从内存中某处指定的地址加载值-您必须将该地址加载到寄存器中。

在许多汇编程序(例如MASM并内置到VC ++汇编程序)下,您也可以只编写

mov eax, dword ptr some_variable


如果没有括号,则表示相同。

你可以写

mov eax, dword ptr [variable][ebx]


这将指示获取“变量”的地址,然后将ebx的值相加并将其总和用作从中加载值的地址。这通常用于按索引访问数组元素。 (支持语法差异,例如mov eax, dword ptr variable[ebx]是常用的,而mov eax, dword ptr [variable + ebx]也很常见。)

在所有这些情况下,处理器都将执行相同的操作-从指定地址加载值。每次都是一个间接级别。

关于pointers - dword ptr使用困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/688799/

10-11 07:09