Assembly mov-eax,dword-ptr[eax]做什么?
我知道dword ptr是一个size指令,指示移动到何处的对象的大小,我知道mov eax,eax是nop代码的一种形式,但这有什么作用Assembly mov-eax,dword-ptr[eax]做什么?,assembly,x86,Assembly,X86,我知道dword ptr是一个size指令,指示移动到何处的对象的大小,我知道mov eax,eax是nop代码的一种形式,但这有什么作用 我认为它将eax的地址与内部的十六进制值交换,但我不太确定,甚至不知道为什么会发生这种情况。它使用eax最初指向的DWORD值加载eax 在C语言中,它对最初保存在EAX中的值的解引用如下:“EAX=*EAX”dword ptr[EAX]-指向内存,地址是EAX,因此该语句将32位值从内存复制到指令EAXmov EAX,eax可能是一个无操作代码,但这不是您
我认为它将eax的地址与内部的十六进制值交换,但我不太确定,甚至不知道为什么会发生这种情况。它使用eax最初指向的DWORD值加载eax
在C语言中,它对最初保存在EAX中的值的解引用如下:“EAX=*EAX”
dword ptr[EAX]
-指向内存,地址是EAX,因此该语句将32位值从内存复制到指令EAXmov EAX,eax
可能是一个无操作代码,但这不是您在这里看到的代码。您正在从内存中加载,如[]
“contents of”字符所示
它用当前由eax
指向的内存内容加载eax
也许一张图形图片会有帮助:
之前:
eax:0x12345678
内存@0x12345678:0xffffffff
之后:
eax:0xffffffff
内存@0x12345678:0xffffffff
至于可能的用途,无疑有很多。一个立即浮现在脑海中的是一个链表结构,在这个结构中,对于列表中的单个元素(伪程序集)有类似的内容:
next:word;一个字。
有效载荷:字节?(32);32字节。
如果eax
用作指向其中一个元素的指针,则可以使用您看到的指令获取下一个元素:
mov eax, dword ptr [eax]
关于为什么会发生这种情况,这取决于上下文
例如,这可以用于在堆栈上加载[eax]
的值,将其用作函数调用的参数。此操作不能一次完成(如在mov dword[esp+4],dword[eax]
中,同一条指令中不能有两个内存引用),因此它被拆分为两条指令:
mov eax, dword [eax]
mov dword [esp + 4], eax
哦,我其实不知道[]的意思是什么。有没有可能在没有括号的情况下执行dword ptr eax呢?@user2893243,这没有意义eax
是一个确定的32位值,而您可能希望从内存中加载一个单字节、一个字、一个dword或(至少在x64中)一个四字(用于rax
而不是eax
)。啊,好吧,如果我想做word ptr eax
,这一开始就没有意义了,我只想做:ax
。顺便说一句,你知道汇编方面有什么好书吗?顺便说一下,这种从指针寄存器加载到自身的方法经常出现在链接数据结构(例如,链接列表)中,因为它允许编译器将单个寄存器用作“当前元素”指针。@Leeor:很好的用例,我在答案中添加了这个,虽然有点晚了:-)+1表示“取消引用”指针,在我看来这是最简单的正确答案,您通常会执行推送dword ptr[eax]
,这取决于您处理堆栈参数的策略。在代码中发现这种情况的一个更可能的原因是链表或树上的循环。但是如果它不在循环中,它实际上可能是任何解引用,当你以后不再需要指针值时。就像只是通过一个或两个间接的链接来获得一些东西。