setjmp.c
来自「SimpleGraphicOperatingSystem 32位图形化操作系统 」· C语言 代码 · 共 37 行
C
37 行
#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 + =
减小字号Ctrl + -
显示快捷键?