探秘C函数栈帧---实现自己的setjmp/longjmp

原创 2015年11月18日 22:18:43

前言

最近再看《C标准库》看到了setjmp和longjmp函数这里,所以就打算好好学习下C的函数栈帧。

__start

在标准C库中,它是通过汇编语言完成的,但是我们这里为了研究原理,所以用C 语言来完成这个库函数。

[c]
#include<stdio.h>
#include<string.h>
#define _JBFP 1
#define _JBMOV 60
#define _JBOFF 4
#define _NSETJMP 17

typedef int jmp_buff[_NSETJMP];
static int getfp(void){
int arg;
return (int)(&arg + _JBFP);  /*获取这个时候的esp*/
}

int setjmp(jmp_buff env){

env[1] = getfp();

return 0;
}

static void setfp(int fp){
int arg;
(&arg)[_JBFP] = fp;
}

static int dojmp(jmp_buff env)
{

setfp(env[1]);
return (env[0]);
}

void longjmp(jmp_buff env,int val)
{

env[0] = val?val:1;
dojmp(env);
}

static char *stackptr(void){
char ch;
return (&ch);
}

jmp_buff env;
int main(){
char *sp = stackptr();
if(sp == stackptr()){
printf("stack is ok\n");
}else{
printf("the statk is change\n");
}
setjmp(env);
int i = 0;
if(i == 0){
printf("i will jump!!\n");
longjmp(env,1);      /*调转*/
}else{
printf("scuess\n");
}
}

[/c]

查看原文:http://zmrlinux.com/2015/11/18/%e6%8e%a2%e7%a7%98c%e5%87%bd%e6%95%b0%e6%a0%88%e5%b8%a7-%e5%ae%9e%e7%8e%b0%e8%87%aa%e5%b7%b1%e7%9a%84setjmplongjmp/

版权声明:本文为博主原创文章,未经博主允许不得转载。

C Interfaces and Implementations 关于setjmp,longjmp和volatile

setjmp longjmp volatile

[转]C标准库中的setjmp与longjmp

在C标准库中有一对非常有趣的函数setjmp()函数与longjmp()函数,用来实现代替goto实现一些非常重要的功能,如异常处理。C语言中,标准库函数setjmp和longjmp形成了结构化异常工...
  • arriod
  • arriod
  • 2012年09月06日 08:05
  • 915

C异常处理机制:setjmp和longjmp

setjmp()和longjum()是通过操纵过程活动记录实现的。它是C语言所独有的。它们部分你不了C语言有限的转移能力。这个两个函数协同工作,如下所示:     *setjmp(jmp_buf j...

setjmp & longjmp in C language

最近几天重新把尘封已久的那本Expert C Porgramming拿出来又扫了一遍,发现以前遗漏了好多C语言的特性,看来之前那遍是白看了。书中第六章:运行时数据结构有一小节专门拿出来讲ISO C中的...

C语言实现异常处理(使用 setjmp 和 longjmp 函数)

C语言实现异常处理(使用 setjmp 和 longjmp 函数) 废话少说,直接贴上 MSDN 的实例代码,如果看不懂说明你水平不行 :)   // crt_fpreset.c // Thi...
  • iw1210
  • iw1210
  • 2015年03月19日 17:35
  • 332

setjmp和longjmp函数使用详解

非局部跳转语句---setjmp和longjmp函数。非局部指的是,这不是由普通C语言goto,语句在一个函数内实施的跳转,而是在栈上跳过若干调用帧,返回到当前函数调用路径上的某一个函数中。 #inc...

setjmp和longjmp函数

在C中,goto语句是不能跨越函数的,而执行这类跳转功能的是函数setjmphe lo
  • aganyg
  • aganyg
  • 2014年06月03日 16:07
  • 375

setjmp 和 longjmp 函数

成员函数 int setjmp(jmp_buf env) 创建本地的jmp_buf缓冲区并且初始化,用于将来跳转回此处。这个子程序[1] 保存程序的调用环境于env参数所指的缓冲区,env将被l...

setjmp/longjmp非局部跳转函数分析

之前就一直好奇setjmp()/longjmp()函数是怎么实现非局部跳转的,心中猜测应该是通过保存调用setjmp()函数处的栈上下文(stack context),之后通过函数longjmp()来...

非局部跳转函数 setjmp 和 longjmp

1. 非局部跳转函数 - setjmp 和 longjmp 函数    非局部指的是,这不是由普通C语言goto语句在一个函数内实施的跳转,而是在栈上跳过若干调用帧,    返回到当前函数调用路径...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:探秘C函数栈帧---实现自己的setjmp/longjmp
举报原因:
原因补充:

(最多只允许输入30个字)