冰霜烛火 发表于 2014-10-12 16:58:32

Win32汇编:这三条指令无法理解

本帖最后由 冰霜烛火 于 2014-10-15 21:39 编辑

Win32汇编 517 页处,SEH 处理异常,里面的 NT_TIB结构
书上说:
             push    offset_Handler
               push    fs:
               mov   fs: ,esp


第一条指令 pushoffset _Handler 指令将回调函数的地址推入堆栈;

第二条指令 pushfs: 指令则将原先使用的 EXCEPTION_REGISTRATION 结构地址推入堆栈,

现在堆栈指令 ESP 指向的地方刚好是一个新的 EXCEPTION_REGISTRATION结构——


等于原始结构地址,也就是prev字段,而 等于回调函数地址,也就是 handler 字段;


当第三条指令 mov fs:,esp,将 ESP 的值放入 fs:后,设置工作就完成了!




前两条指令的说明勉强可以理解,后面的说明就想不通了,有没前辈走过的指点一下?

漩涡鸣人 发表于 2014-10-12 19:23:08

本帖最后由 漩涡鸣人 于 2014-10-12 19:25 编辑

没什么难理解的吧,举个例子执行完前两句,堆栈顶部状态如下图:

冰霜烛火 发表于 2014-10-13 15:29:18

漩涡鸣人 发表于 2014-10-12 19:23
没什么难理解的吧,举个例子执行完前两句,堆栈顶部状态如下图:

谢谢你的回复,第一句只是把回调函数的地址堆入栈,第二PUSH FS: 乱了,只是把ExceptionList个字段堆入吧,ExceptionList字段又指向另一个结构,结构第一字段是prev(前一个ExceptionList 结构的地址),那这个PUSH的内容到底是什么 ……还是模糊了

漩涡鸣人 发表于 2014-10-13 21:44:26

本帖最后由 漩涡鸣人 于 2014-10-13 21:45 编辑

冰霜烛火 发表于 2014-10-13 15:29
谢谢你的回复,第一句只是把回调函数的地址堆入栈,第二PUSH FS: 乱了,只是把ExceptionList个字段堆 ...

就形成一个链表而已,push FS:就是把上一个ExceptionList的值压栈,ExceptionList指向链表首结点,也就是说新节点指向原链表首节点
图片说明:

ilboyvm 发表于 2014-10-13 22:59:51

不会,帮楼主顶上去

冰霜烛火 发表于 2014-10-15 21:37:57

漩涡鸣人 发表于 2014-10-13 21:44
就形成一个链表而已,push FS:就是把上一个ExceptionList的值压栈,ExceptionList指向链表首结点, ...

明白了,谢谢你,前辈!

网络学习 发表于 2014-10-18 01:00:01

高手云集   俺来学习
页: [1]
查看完整版本: Win32汇编:这三条指令无法理解