【发布时间】:2018-05-01 23:16:51
【问题描述】:
我有几个关于装配的基本问题。
在汇编中编写函数时,是否所有函数都有“函数序言”?我看到一些在线编写的功能,但他们没有,这让我感到困惑。我认为您总是需要它来通过递减堆栈来获取新的基指针和局部变量?
此外,每个压栈指令是否都需要堆栈指针的减法指令,因为我们总是希望堆栈指针位于堆栈顶部,如果不是,为什么?所以如果
push %eax
sub $4, %esp
我的最后一个问题是,是否有任何资源可以用外行的方式解释组装?
【问题讨论】:
-
序言不是绝对必要的,但如果没有提供展开或调试信息,它确实有助于调试器。
push指令隐式地从堆栈指针中减去4,这就是拥有它的全部意义所在。详情请参考组装教程。 -
如果 push 对你有用,你为什么要从堆栈指针中分出?
-
汇编语言本身并不关心你做什么。但是,您与之互操作的代码可能会关心。
-
您可以使用
sub快速分配一块堆栈。比如说,你需要 128 字节的缓冲区,你可以做sub $128, %esp。想象一下,不得不做 32 个pushes 的垃圾。 -
@cloudiebro 当你想在堆栈上腾出空间但不关心内存有什么内容时,你会减少堆栈指针。一个非常常见的用例。