如果我们使用汇编语言
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
答案 0 :(得分:12)
在这两种情况下,您都要求处理器从指定的地址移动值。这是间接的一个层面。在第一种情况下,您要求它从指定的寄存器中获取地址。在第二种情况下,您可以直接指定偏移量。
x86处理器不支持双级间接,因此无法请求从内存中指定的地址加载值 - 您必须将地址加载到寄存器中。
在许多汇编程序(例如MASM并内置到VC ++汇编程序中)中,您也可以编写
mov eax, dword ptr some_variable
没有括号,就意味着相同。
你可以写
move eax, dword ptr [variable][ebx]
这将指示获取“变量”的地址,然后添加ebx的值并使用sum作为加载值的地址。这通常用于通过索引访问数组元素。
在所有这些情况下,处理器都会这样做 - 从指定的地址加载一个值。这是每次间接的一个层次。
答案 1 :(得分:0)
我的理解是,汇编中的括号([]
)是pointer
,因此此说明:
mov eax, dword ptr[some_variable]
它从some_variable
复制指向eax
的值,对于此示例:
mov eax, dword ptr some_variable
相同...但是?我认为它受dword
的影响。如果您有兴趣,可以从头开始编写,例如使用NASM语法:
mov eax, dword [some_variable]