【问题标题】:dword ptr usage confusiondword ptr 用法混乱
【发布时间】:2010-10-15 21:14:43
【问题描述】:

如果我们使用汇编语言

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

【问题讨论】:

    标签: pointers assembly x86 masm dword


    【解决方案1】:

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

    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]。)

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

    【讨论】:

    • "没有括号,意思是一样的。" - 这取决于使用的汇编程序。 MASM 允许这样做,而 nasm/yasm/fasm 不允许(而且恕我直言,有充分的理由 - 当您读取变量时,您 正在 进行间接处理,最好明确说明它。这就是程序集的意义所在,是不是吗?)
    • 是的,当然。一种误解往往等于长时间调试。
    • 你好尖牙,如果加[]和不加[],效果是一样的,为什么要加[]呢?我认为大多数开发人员都很懒惰。 :-)
    • @George2> 同样,在间接括号上坚持的汇编程序通常使用缺少括号来获取变量的偏移量。即{n,f}asm中的“mov eax, myvariable”等价于masm中的“mov eax, offset myvariable”。
    • 你不能对局部变量使用“偏移”,因为它们的地址在编译/汇编时不是固定的。您必须使用 LEA(加载有效地址)。在幕后,本地人被称为 [ESP+xx] 或 [EBP+xx] :)
    【解决方案2】:

    我的理解,汇编中的括号([])是pointer,所以这个指令:

    mov eax, dword ptr[some_variable]

    它从some_variable 复制指向eax 的值,对于这个例子:

    mov eax, dword ptr some_variable

    同样...但是?我猜它受到dword 的影响。如果您有兴趣,可以从头开始编写,例如使用 NASM 语法:

    mov eax, dword [some_variable]

    【讨论】:

    • NASM 和 MASM 非常适合这个。在 MASM 中,[] 括号在符号名称周围是完全可选的;它始终是一个内存操作数。 Confusing brackets in MASM32。在您展示的所有情况下,dworddword ptr 都是可选的;目标寄存器隐含的大小。
    • 错字:非常不同,我是想写的。
    猜你喜欢
    • 1970-01-01
    • 2013-03-05
    • 2016-08-08
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 2012-08-21
    • 2014-03-02
    相关资源
    最近更新 更多