dword ptr使用混淆

18

在汇编语言中如果我们使用

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
2个回答

12
在这两种情况下,你都要求处理器从指定的地址移动值。这是一级间接寻址。在第一种情况下,你要求它从特定的寄存器中获取地址。在第二种情况下,你直接指定偏移量。
x86处理器不支持双重间接寻址,因此无法请求从内存中某个指定的地址加载值 - 必须将地址加载到寄存器中。
在一些汇编器(MASM和集成在VC++汇编器中)中,你也可以简单地写如下代码:
mov eax, dword ptr some_variable
没有括号,它的意思是一样的。 你可以这样写:
mov eax, dword ptr [variable][ebx]
这将指示取"variable"的地址,然后加上ebx的值,并使用总和作为地址来加载一个值。这通常用于通过索引访问数组元素。(语法上有一些变化得到支持,例如常见的mov eax, dword ptr variable[ebx],以及也很常见的mov eax, dword ptr [variable + ebx]等形式)
在所有这些情况下,处理器都会执行相同的动作——从指定地址加载一个值。每次都是一个间接级别。

3
没有方括号,意思是相同的,但这取决于所使用的汇编程序。MASM可以这样做,nasm/yasm/fasm不行(而且我认为有很好的理由 - 当你读取一个变量时,你正在进行间接寻址,最好明确表达出来。汇编语言不就是这个意思吗?) - snemarch
3
同时,坚持使用间接括号的汇编器通常会利用缺少括号来获取变量的偏移量。也就是说,在{n,f}asm中,“mov eax,myvariable”等同于在masm中使用“mov eax,offset myvariable”。 - snemarch
处理器也是一样的。你可以写"mov eax, 100",处理器会复制值"100"。当你使用dword_ptr时,你告诉它从一个地址加载值。这就是间接寻址。 - sharptooth
@sharptooth,您真是一位大师!我在 C 语言中遇到了一些问题。我认为 C 语言和汇编语言中变量的主要区别在于:当我们在 C 语言中写变量时,它的值被表示出来;而在汇编语言中,当我们写一个变量时,它被视为“偏移量”,可以看作指向该变量的指针(地址)。 - George2
1
你不能在本地变量中使用“offset”,因为它们的地址在编译/汇编时不是固定的。你必须使用LEA(加载有效地址)。在幕后,本地变量被引用为[ESP+xx]或[EBP+xx] :) - snemarch
显示剩余30条评论

0

我理解,在汇编语言中,方括号([])表示指针,因此这条指令:

mov eax, dword ptr[some_variable]

它将从指向some_variable的地址复制值到eax寄存器中。对于这个例子:

mov eax, dword ptr some_variable

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

mov eax, dword [some_variable]


1
NASM和MASM非常适合这个。在MASM中,[]括号在符号名称周围完全是可选的;它始终是一个内存操作数。Confusing brackets in MASM32。在您展示的所有情况中,dworddword ptr都是可选的;目标寄存器指定了大小。 - Peter Cordes
笔误了:我本来想写“非常不同”。 - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接