首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dword ptr用法混乱

dword ptr用法混乱
EN

Stack Overflow用户
提问于 2009-03-27 07:14:45
回答 2查看 30K关注 0票数 18

如果我们使用汇编语言

代码语言:javascript
复制
mov eax, dword ptr[ebx]

那么它意味着复制ebx所指向的值(ebx包含地址值,而不是实际值,此指令复制地址中的实际值)?

如果我们使用

代码语言:javascript
复制
mov eax, dword ptr[some_variable]

那么它意味着将变量"some_variable“本身的值复制到eax,而不是复制变量"some_variable”所指向的值?

我的理解正确吗?

如果是,我很困惑为什么同一汇编指令有两种不同的含义-在第一种情况下有一个间接级别,而在第二种情况下没有额外的间接级别。

有什么意见吗?

编辑:

并不是每个[]都不起作用,例如,指令xchg将采用一个内向的级别,它加载edx所指向的值。

完整的源代码可以从

http://www.codeproject.com/KB/threads/spinlocks.aspx

代码语言:javascript
复制
#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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-03-27 07:27:55

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

x86处理器不支持双重间接寻址,因此不可能从内存中指定的某个地址请求加载值-您必须将该地址加载到寄存器中。

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

代码语言:javascript
复制
mov eax, dword ptr some_variable

没有括号,意思是一样的。

你可以写

代码语言:javascript
复制
mov eax, dword ptr [variable][ebx]

这将指示获取“变量”的地址,然后将ebx的值相加,并使用总和作为加载值的地址。这通常用于按索引访问数组元素。(支持语法的变体,如常用的mov eax, dword ptr variable[ebx]和常用的mov eax, dword ptr [variable + ebx]。)

在所有这些情况下,处理器都会执行相同的操作-从指定地址加载值。每次都是一个级别的间接性。

票数 12
EN

Stack Overflow用户

发布于 2019-12-28 11:53:38

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

mov eax, dword ptr[some_variable]

它从指向eax some_variable复制值,对于此示例:

mov eax, dword ptr some_variable

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

mov eax, dword [some_variable]

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/688799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档