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
4

2 回答 2

12

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

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]常用的。)

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

于 2009-03-27T07:27:55.133 回答
0

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

mov eax, dword ptr[some_variable]

它将值从some_variable 指向eax和复制到此示例:

mov eax, dword ptr some_variable

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

mov eax, dword [some_variable]

于 2019-12-28T03:53:38.300 回答