⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 setjmp.c

📁 SimpleGraphicOperatingSystem 32位图形化操作系统 多进程 支持FAT32 详见www.sgos.net.cn
💻 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 + -