PUSH eax和mov [esp], eax之间的区别是什么?

6
这两行之间的区别是什么?
push eax

mov [esp], eax

它不将eax推送到堆栈上(esp指向的位置,就像mov [esp],eax一样)?


1
"push" 会自动增加 "esp"(栈指针)的值。而 "mov" 不会。 - lurker
1个回答

16

"push" 命令会自动将 "esp"(堆栈指针)的值增加。而 "mov" 并不会这样做。因此,如果你想在栈上放置多个元素,使用 push,只需执行以下操作:

push eax
push ebx
...

使用mov,为了获得相同的结果,你需要:

sub  esp,4
mov  [esp], eax
sub  esp,4
mov  [esp], ebx
...

而 push 的好处是有相反的操作,也就是pop,能够以相反的顺序把事物取回。这正是堆栈的全部意义 :)


1
啊,好的,但是因为栈向较低的值进行扩展,所以不应该是 sub esp, 4 吗? - Zimm3r
1
@Zimm3r 是的,在x86架构中是这样(更正)。在某些架构中,堆栈可能会“向上增长”,而不是向下。但是x86是向下的。 :) - lurker
啊,好的,谢谢。一开始我还有点担心自己做错了。 - Zimm3r
2
@Zimm3r 注意,手动操作时应先进行减法,然后再进行移动。堆栈指针始终指向最后一个被推入的元素。 - lurker
1
编译器为什么要使用 sub esp, 4mov dword ptr ss:[esp],2E 而不是 PUSH 2E(6A2E,2字节 vs 10字节)?我在我的程序中看到它发生了,不确定是否有任何目的我没有注意到。 - Zackline
1
@Zackline,我认为你没有漏掉任何内容。从功能上讲,这个操作有相同的目的。在sub esp, 4等情况下,sub esp, 4会“保留”栈空间,然后随后的mov会使用那个空间。 - lurker

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