在编写汇编函数时,序言和尾声是强制性的吗?

最近我在汇编中重写了一些libc函数,对于其中一些(不需要任何调用系统调用指令的那些,如strlen),我丢弃了序言和尾声,因为没有它我的测试没有失败(也许我没有足够复杂的测试)。 在同行评审期间,有人告诉我丢弃它是一种不好的做法,但无法解释为什么。

那么,当我调用没有prologue / epilogue组合的asm函数时,我遇到了问题吗?

即使堆栈上不需要额外的空间,添加它也是一个好习惯吗?

如果出于某些原因强制要求,为什么编译器(我使用过nasm)不会处理它?

谢谢阅读

如果没有设置正确的堆栈帧,调试器很难知道你现在正在使用什么函数。 在ELF目标上,如果没有显式设置堆栈帧,则必须手动提供CFI数据(参见本文 )。 如果没有CFI数据,堆栈展开不起作用,调试器可能无法找到您所使用的function。除非您想手动添加CFI数据(这有点繁琐且容易出错),我建议您使用接受轻微的性能损失,只需设置一个完整的堆栈框架。