当前位置:  开发笔记 > 编程语言 > 正文

dword ptr使用混乱

如何解决《dwordptr使用混乱》经验,为你挑选了1个好方法。

如果我们使用汇编语言

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

sharptooth.. 12

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

x86处理器不支持双级间接,因此无法请求从内存中指定的地址加载值 - 您必须将地址加载到寄存器中.

在许多汇编程序(MASM和内置于VC++汇编程序中)下,您也可以编写

mov eax, dword ptr some_variable

没有括号,就意味着相同.

你可以写

move eax, dword ptr [variable][ebx]

这将指示获取"变量"的地址,然后添加ebx的值并使用sum作为加载值的地址.这通常用于通过索引访问数组元素.

在所有这些情况下,处理器都会这样做 - 从指定的地址加载一个值.这是每次间接的一个层次.



1> sharptooth..:

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

x86处理器不支持双级间接,因此无法请求从内存中指定的地址加载值 - 您必须将地址加载到寄存器中.

在许多汇编程序(MASM和内置于VC++汇编程序中)下,您也可以编写

mov eax, dword ptr some_variable

没有括号,就意味着相同.

你可以写

move eax, dword ptr [variable][ebx]

这将指示获取"变量"的地址,然后添加ebx的值并使用sum作为加载值的地址.这通常用于通过索引访问数组元素.

在所有这些情况下,处理器都会这样做 - 从指定的地址加载一个值.这是每次间接的一个层次.

推荐阅读
路人甲
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有