Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly mov-eax,dword-ptr[eax]做什么?_Assembly_X86 - Fatal编程技术网

Assembly mov-eax,dword-ptr[eax]做什么?

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可能是一个无操作代码,但这不是您

我知道dword ptr是一个size指令,指示移动到何处的对象的大小,我知道mov eax,eax是nop代码的一种形式,但这有什么作用


我认为它将eax的地址与内部的十六进制值交换,但我不太确定,甚至不知道为什么会发生这种情况。

它使用eax最初指向的DWORD值加载eax


在C语言中,它对最初保存在EAX中的值的解引用如下:“EAX=*EAX”

dword ptr[EAX]
-指向内存,地址是EAX,因此该语句将32位值从内存复制到指令
EAX

mov 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]
,这取决于您处理堆栈参数的策略。在代码中发现这种情况的一个更可能的原因是链表或树上的循环。但是如果它不在循环中,它实际上可能是任何解引用,当你以后不再需要指针值时。就像只是通过一个或两个间接的链接来获得一些东西。