究竟什么"程序状态"setjmp保存?

Nor*_*g74 9 c longjmp setjmp

我已经读过传入的jmp_buf变量中的setjmp"保存程序状态",但是我还没有找到任何关于它究竟是什么的描述.它是否复制了所有应用程序的内存?只是寄存器?堆栈?

emb*_*guy 5

以下内容来自Peter Prinz 和 Tony Crawford 的C in a Nutshell

setjmp()宏将调用时的当前环境保存在由其参数指定的缓冲区中。环境包括堆栈,以及所有具有自动存储持续时间的变量。

以下是ISO/IEC 9899:TC2在第 7.13 节中的说明:

调用setjmp宏的环境包含足以调用longjmp函数以将执行返回到正确块并调用该块的信息,如果它是递归调用的话。它不包括浮点状态标志、打开文件或抽象机的任何其他组件的状态。

这是 PJ Plauger 在他的书The Standard C Library 中的一个有趣的参考资料:

[实现 setjmp] 的危险之一在于表达式求值。典型的计算机具有一定数量的寄存器,用于在计算表达式时保存中间结果。但是,编写一个足够复杂的表达式,您可能会用尽可用的寄存器……setjmp必须猜测要在jmp_buf数据对象中存储多少“调用上下文” 。可以肯定的是,必须保存某些寄存器。

最后,来自Peter Van Der Linden 的Expert C Programming

Setjmp 将程序计数器和当前指针的副本保存到堆栈顶部。

根据上述信息,在我看来,“当前环境”是由实施决定的。


jtl*_*lim 4

根据平台 ABI,仅需要在函数调用中保留寄存器。

来源:在各种操作系统上反汇编 x86、x64、arm32、arm64 上的 setjmp。

  • 堆栈指针需要在函数调用期间保留,因此隐式提及。程序计数器显然是由 longjmp 操纵的,以将您带到正确的位置。浮点寄存器取决于 ABI,例如,在 ARM (iOS) 上保存寄存器 s16-s31.... 再次,这全部包含在 ABI 要求中 (3认同)
  • 如果不提及堆栈和程序计数器,就不完整。 (2认同)