免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1280 | 回复: 4
打印 上一主题 下一主题

[内核入门] ebx寄存器?? [复制链接]

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-11-02 20:57 |只看该作者 |倒序浏览
    下面这段代码是《Linux内核源代码情景分析》中用来说明系统调用过程时,用的例子(反编译sethostname()得到的汇编代码):
   

    我的问题是int $0x80之前,eax、ebx、ecx寄存器都被修改了,以及通过int指令进入内核后,可能还有其它寄存器也被修改了,为什么int $0x80之后,唯独恢复了ebx寄存器的值?而且是以破坏edx寄存器的代价被修改的,ebx寄存器有什么特殊性吗?以及如果edx在返回用户态之前又被改了一次怎么办?

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
2 [报告]
发表于 2016-11-02 22:11 |只看该作者
http://www.cnblogs.com/qq78292959/archive/2012/07/20/2600865.html
作为基址寄存器时,ebx默认与ds"一对",ebp默认与ss"一对",估计和需要保持ebp平衡一样,ebx用于传参后,也要恢复吧?

论坛徽章:
0
3 [报告]
发表于 2016-11-03 10:05 |只看该作者
回复 1# _nosay

这是x86的调用约定。
ebx ebp esp esi edi 是 callee saved register
eax ecx edx 是 caller saved register

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
4 [报告]
发表于 2016-11-03 10:33 |只看该作者
回复 3# notyet


,非常感谢。

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
5 [报告]
发表于 2016-11-03 20:05 |只看该作者
本帖最后由 _nosay 于 2016-11-03 20:09 编辑

回复 3# notyet

    根据惯例,寄存器%eax、%edx和%ecx为调用者保存寄存器(caller-saved registers,当函数P调用Q时,Q可以覆盖这些寄存器,而不会破坏任何P所需的数据。寄存器%ebx、%esi和%edi为被调用者保存寄存器(callee-saved registers,即Q在覆盖这些寄存器的值时,必须先把它们保存到栈中,并在返回前恢复它们,因为P可能会用到这些值。此外,根据惯例,必须保持寄存器%ebp和%esp,即函数返回后,这两个寄存器必须恢复到调用前的值,换句话说,必须恢复调用者的栈帧。http://blog.csdn.net/xiaogugood/article/details/38490663


所以sethostname()里面在返回前恢复了ebx寄存器值,eax、ecx、edx由调用sethostname()的函数恢复,可以尽情修改。


同样一个函数,可以被调用,也可以调用别的函数,所以:
① 函数返回前恢复callee-saved registers;
② call指令后,恢复caller-saved registers。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP