longjmp.c

来自「一个类linux的dos下开发的操作系统.」· C语言 代码 · 共 31 行

C
31
字号
#include <setjmp.h> /* jmp_buf */
/*****************************************************************************
*****************************************************************************/
__inline__ void longjmp(jmp_buf buf, int ret_val)
{
	unsigned *esp2;

/* make sure return value is not 0 */
	if(ret_val == 0)
		ret_val++;
/* store it in buf->eax */
	buf->eax = ret_val;
/* get ESP for new stack */
	esp2 = (unsigned *)buf->esp2;
/* push return EIP on new stack */
	esp2--;
	*esp2 = buf->eip;
/* update stored ESP */
	buf->esp2 = (unsigned)esp2;
/* make buf the stack */
	__asm__ __volatile__("movl %0,%%esp\n"
/* pop GP registers */
		"popa\n"
/* pop ESP for new stack */
		"pop %%esp\n"
/* return */
		"ret\n"
		:
		: "m"(buf));
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?