x86的寄存器是不是除了eax以外,都可以混用?
如题,除了eax是ALU指定的寄存器以外,其他的寄存器用哪个是不是无所谓,例如保存堆栈的内容可以用ecx,保存普通的数据可以用ebp,等等。
还是每个寄存器只能用作特定的用途? 谢谢... ...
[ 本帖最后由 jeanlove 于 2009-7-28 13:07 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
除了作通用寄存器之外,一些寄存器有可能在某些指令上发挥独特的作用.
比如ecx可以作为计数器.
离开了这些指令之外,作为通用寄存器,它们的重要你可以认为一样.
但要注意一些习惯问题,比如习惯上,对于X86体系,使用eax来作为C语言函数返回值.(这只是习惯,如果一开始大家习惯用另外一个通用寄存器来传也一样)
另外,esp之所以叫栈指针,是因为它和涉及到栈的操作密切相关.一般不要把esp/ebp挪作他用.
[ 本帖最后由 cjaizss 于 2009-7-28 13:21 编辑 ]
嗯,也就是说,只是一个约定
eax作为返回值这是软件的约定.
但ecx作为计数,edx:eax作为32位乘法输出...这是硬件的设计决定.
明白了,这几个是不能随便改。
隐约记得还有个约定叫 调用者负责保存的寄存器:eax, ecx, edx
被调用者保存的寄存器:ebx, esi, edi
也就是说A调用B, A必须保存eax, ecx, edx,因为在B里有可能覆盖它们,由于A保存了一份,所以不会被破坏。
保存就是调用前将相应寄存器压栈,到时候恢复就弹到相应寄存器。
不知道还是不是这个理?
这个应该和操作系统的规定和语言实现有关系吧。
Win32下面的系统API默认约定就是stdcall(从左到右),否则采用C语言的_cdesc(从右到左)
不知道*nix系统默认是什么规则呢?????????????????
这玩意儿叫ABI,当然你可以不遵守,只要不出错就OK。
=========================================
UNIX采用c的call方式
嗯,还是这种方式好。