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 + -
显示快捷键?