C 语言中 setjmp 和 longjmp( 二 )

voidf()

{

//...

Label:

//...

voidg()

{

//...

GOTOLabel;

//...

首先我们要知道 , 实现这种类型的跳转 , 和操作系统中任务切换的上下文切换有点类似 , 我们只需要恢复 Label 标签处函数上下文即可 。 函数的上下文包括以下内容:

函数栈帧 , 主要是栈帧指针BP和栈顶指针SP

程序指针PC , 此处为指向 Label 语句的地址

其它寄存器 , 这是和体系相关的 , 在 x86 体系下需要保存有的 AX/BX/CX 等等 callee-regs 。

这样 , 在执行GOTO Label;这条语句 , 我们恢复 Label 处的上下文 , 即完成跳转到 Label 处的功能 。

推荐阅读