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

前言

最近再看《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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值