2017-02-13 18 views
4

最近我重新编写了一些libc函数在汇编中,并且对于其中一些(不需要任何调用系统调用指令,如strlen),我放弃了序言和后记,因为我的测试没有没有它就失败了(也许我没有足够复杂的测试)。 在同行评审期间,有人告诉我放弃它是一种不好的做法,但无法解释为什么。编写汇编函数时,序言和结语是强制性的吗?

那么,当我调用没有序言/尾声组合的asm函数时,是否会遇到问题?

即使在堆栈上不需要额外的空间时添加它也是一种很好的做法吗?

如果由于某些原因是强制性的,为什么编译器(我使用nasm)不关心它?

感谢您阅读

+2

在优化的生产代码中,如果不需要,跳过序言/尾声。然而,对于调试或分析,有一个干净的栈帧可能是有用的,许多调试器依赖于此。 – Ctx

回答

4

如果没有设置正确的堆栈帧,它可以是很难调试知道什么工作,你是在现在。在ELF目标上,如果没有明确设置堆栈帧,则必须手动提供CFI数据(参见this article)。如果没有CFI数据,堆栈展开不起作用,调试器可能无法找到你所在的功能。除非你想手动添加CFI数据(这有点乏味且容易出错),我建议你接受轻微的性能损失,并设置完整的堆栈帧。

+0

好吧,我明白了。我会尝试在我的函数中使用和不使用新的堆栈框架进行一些调试,以获得更好的结果 –