前言
最近再看《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]