📄 setjmp.c
字号:
#include <osdef.h>
#include <stdio.h>
#include "crt.h"
EXPORT int setjmp( void* buf )
{
PI386ProcessContext context = (PI386ProcessContext) buf;
asm volatile(
"push %%edi\n\t" \
"push %%esi\n\t" \
"push %%ebp\n\t" \
"push %%ebx\n\t" \
"pop %0\n\t" \
"pop %1\n\t" \
"pop %2\n\t" \
"pop %3\n\t" \
:"=m"( context->ebx),"=m"( context->ebp),"=m"( context->esi),"=m"( context->edi));
context->eip = *((int*)(context->ebp+sizeof(int)));
asm volatile( "push %%esp\n\tpop %0":"=m"( context->esp ) );
return 0;
}
EXPORT int longjmp( void* buf, int ret )
{
PI386ProcessContext context = (PI386ProcessContext) buf;
asm volatile("movl %0, %%edi\n\t" \
"movl %1, %%esi\n\t" \
"movl %2, %%ebp\n\t" \
"movl %3, %%ebx\n\t" \
:"=m"( context->edi ), "=m"( context->esi ), "=m"( context->ebp ), "=m"( context->ebx ) );
asm volatile("movl %0, %%esp\n\t": "=m"(context->esp) );
*((int*)(context->ebp+sizeof(int))) = context->eip;
return ret;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -