#include <setjmp.h>

int main(int argc, const char* argv[])

{

 

    jmp_buf buf = {0,};

    int k = 0;

    setjmp(buf);

 

    k = 1;

 

    longjmp(buf, 1);

}

测试代码如上所示, 看一下Disassemble的代码

__setjmp3:

69CDFC38  mov         edx,dword ptr [esp+4] 

69CDFC3C  mov         dword ptr [edx],ebp 

69CDFC3E  mov         dword ptr [edx+4],ebx 

69CDFC41  mov         dword ptr [edx+8],edi 

69CDFC44  mov         dword ptr [edx+0Ch],esi 

69CDFC47  mov         dword ptr [edx+10h],esp 

69CDFC4A  mov         eax,dword ptr [esp] 

69CDFC4D  mov         dword ptr [edx+14h],eax 

69CDFC50  mov         dword ptr [edx+20h],56433230h 

69CDFC57  mov         dword ptr [edx+24h],0 

69CDFC5E  mov         eax,dword ptr fs:[00000000h] 

69CDFC64  mov         dword ptr [edx+18h],eax 

69CDFC67  cmp         eax,0FFFFFFFFh 

69CDFC6A  jne         _s3_get_count (69CDFC75h) 

69CDFC6C  mov         dword ptr [edx+1Ch],0FFFFFFFFh 

69CDFC73  jmp         _s3_done (69CDFCB0h) 

_s3_get_count:

69CDFC75  mov         ecx,dword ptr [esp+8] 

69CDFC79  or          ecx,ecx 

69CDFC7B  je          _s3_default_trylevel (69CDFC87h) 

69CDFC7D  mov         eax,dword ptr [esp+0Ch] 

69CDFC81  mov         dword ptr [edx+24h],eax 

69CDFC84  dec         ecx  

69CDFC85  jne         _s3_save_trylevel (69CDFC8Fh) 

_s3_default_trylevel:

69CDFC87  mov         eax,dword ptr [eax+0Ch] 

69CDFC8A  mov         dword ptr [edx+1Ch],eax 

69CDFC8D  jmp         _s3_done (69CDFCB0h) 

_s3_save_trylevel:

69CDFC8F  mov         eax,dword ptr [esp+10h] 

69CDFC93  mov         dword ptr [edx+1Ch],eax 

69CDFC96  dec         ecx  

69CDFC97  je          _s3_done (69CDFCB0h) 

69CDFC99  push        esi  

69CDFC9A  push        edi  

69CDFC9B  lea         esi,[esp+1Ch] 

69CDFC9F  lea         edi,[edx+28h] 

69CDFCA2  cmp         ecx,6 

69CDFCA5  jbe         _s3_save_data (69CDFCACh) 

69CDFCA7  mov         ecx,6 

_s3_save_data:

69CDFCAC  rep movs    dword ptr es:[edi],dword ptr [esi] 

69CDFCAE  pop         edi  

69CDFCAF  pop         esi  

_s3_done:

69CDFCB0  sub         eax,eax 

69CDFCB2  ret              

69CDFCB3  int         3    

69CDFCB4  int         3    

69CDFCB5  int         3    

69CDFCB6  int         3    

69CDFCB7  int         3    

69CDFCB8  int         3    

69CDFCB9  int         3    

69CDFCBA  int         3    

69CDFCBB  int         3    

69CDFCBC  int         3    

69CDFCBD  int         3    

69CDFCBE  int         3    

69CDFCBF  int         3    

将刚刚压入栈中的buf[esp + 4]赋值给edx,然后分别将线程相关的Context的各个register,以及TEB中的某些字段fs:[00000000h]放到该结构体中。

fs:[00000000h]保存的是与SEH相关的信息,参考:http://www.mouseos.com/windows/SEH3.html

参考:http://blog.csdn.net/zhongyh/article/details/1467654

总之,一旦调用longjmp,那么包括esp在内的Context可能都会被改变

最新文章

  1. Java NIO5:选择器1---理论篇
  2. Oracle Deadlock / 死锁 处理
  3. jquery parent和parents的区别
  4. 利用Java实现表达式二叉树
  5. The maximum number of cell styles was exceeded. You can define up to 4000 styles
  6. 怎么安装MySQL,安装MySQL遇到的一些问题!!!!!!
  7. 初识bd时的一些技能小贴士
  8. angularJs-route路由详解
  9. windows server 2012 R2汉化 -- 玩转Microsoft Azure
  10. 最小生成树 A - 畅通工程
  11. WebAPI接口安全校验
  12. day3 python学习
  13. 一个关于WCF调用远程链接返回405错误不允许使用此方法的问题
  14. 使用adb查看CPU和内存
  15. centos 6.9 +nginx 配置GIT HTTPS服务器(证书采用自签名)
  16. 弹指之间 -- Slow Soul
  17. 原生js返回顶部
  18. bzoj 1171 并查集优化顺序枚举 | 线段树套单调队列
  19. Java的数组和list升序,降序,逆序函数Collections.sort和Arrays.sort的使用
  20. 【转载】Android Bug分析系列:第三方平台安装app启动后,home键回到桌面后点击app启动时会再次启动入口类bug的原因剖析

热门文章

  1. php函数的使用技巧
  2. 用 Flask 来写个轻博客 (5) — (M)VC_SQLAlchemy 的 CRUD 详解
  3. Angularjs实现简单的登陆框
  4. 接口调用post请求参数在body中
  5. 34-python基础-python3-列表删除元素-remove()方法-del语句-pop()方法
  6. mac 卸载编辑器卸不干净
  7. js将数字转换成货币形式的字符
  8. Javascript高级程序设计--读书笔记之面向对象(二)
  9. HTML + CSS (下)【更新中】
  10. JNI中修改(基本类型)参数并返回到Java层使用