免费注册 查看新帖 |

Chinaunix

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

x86的寄存器是不是除了eax以外,都可以混用? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-28 13:05 |只看该作者 |倒序浏览
如题,除了eax是ALU指定的寄存器以外,其他的寄存器用哪个是不是无所谓,例如保存堆栈的内容可以用ecx,保存普通的数据可以用ebp,等等。

还是每个寄存器只能用作特定的用途? 谢谢... ...

[ 本帖最后由 jeanlove 于 2009-7-28 13:07 编辑 ]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2009-07-28 13:15 |只看该作者
除了作通用寄存器之外,一些寄存器有可能在某些指令上发挥独特的作用.
比如ecx可以作为计数器.
离开了这些指令之外,作为通用寄存器,它们的重要你可以认为一样.
但要注意一些习惯问题,比如习惯上,对于X86体系,使用eax来作为C语言函数返回值.(这只是习惯,如果一开始大家习惯用另外一个通用寄存器来传也一样)

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
3 [报告]
发表于 2009-07-28 13:18 |只看该作者
另外,esp之所以叫栈指针,是因为它和涉及到栈的操作密切相关.一般不要把esp/ebp挪作他用.

[ 本帖最后由 cjaizss 于 2009-7-28 13:21 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-07-28 14:47 |只看该作者
原帖由 cjaizss 于 2009-7-28 13:15 发表
除了作通用寄存器之外,一些寄存器有可能在某些指令上发挥独特的作用.
比如ecx可以作为计数器.
离开了这些指令之外,作为通用寄存器,它们的重要你可以认为一样.
但要注意一些习惯问题,比如习惯上,对于X86体系, ...


嗯,也就是说,只是一个约定

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
5 [报告]
发表于 2009-07-28 15:37 |只看该作者
eax作为返回值这是软件的约定.
但ecx作为计数,edx:eax作为32位乘法输出...这是硬件的设计决定.

论坛徽章:
0
6 [报告]
发表于 2009-07-28 16:11 |只看该作者
原帖由 cjaizss 于 2009-7-28 15:37 发表
eax作为返回值这是软件的约定.
但ecx作为计数,edx:eax作为32位乘法输出...这是硬件的设计决定.

明白了,这几个是不能随便改。

论坛徽章:
0
7 [报告]
发表于 2009-08-02 15:02 |只看该作者
隐约记得还有个约定叫  调用者负责保存的寄存器:eax, ecx, edx
被调用者保存的寄存器:ebx, esi, edi

也就是说A调用B, A必须保存eax, ecx, edx,因为在B里有可能覆盖它们,由于A保存了一份,所以不会被破坏。
保存就是调用前将相应寄存器压栈,到时候恢复就弹到相应寄存器。

不知道还是不是这个理?

论坛徽章:
0
8 [报告]
发表于 2009-08-05 10:54 |只看该作者
原帖由 bsdc 于 2009-8-2 15:02 发表
隐约记得还有个约定叫  调用者负责保存的寄存器:eax, ecx, edx
被调用者保存的寄存器:ebx, esi, edi

也就是说A调用B, A必须保存eax, ecx, edx,因为在B里有可能覆盖它们,由于A保存了一份,所以不会被破坏 ...


这个应该和操作系统的规定和语言实现有关系吧。

Win32下面的系统API默认约定就是stdcall(从左到右),否则采用C语言的_cdesc(从右到左)

不知道*nix系统默认是什么规则呢?????????????????

论坛徽章:
0
9 [报告]
发表于 2009-08-05 11:04 |只看该作者
这玩意儿叫ABI,当然你可以不遵守,只要不出错就OK。
=========================================
UNIX采用c的call方式

论坛徽章:
0
10 [报告]
发表于 2009-08-05 11:18 |只看该作者
原帖由 prolj 于 2009-8-5 11:04 发表
这玩意儿叫ABI,当然你可以不遵守,只要不出错就OK。
=========================================
UNIX采用c的call方式

嗯,还是这种方式好。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP