x86的寄存器是不是除了eax以外,都可以混用?

发布于 2022-09-18 00:51:05 字数 171 浏览 10 评论 0

如题,除了eax是ALU指定的寄存器以外,其他的寄存器用哪个是不是无所谓,例如保存堆栈的内容可以用ecx,保存普通的数据可以用ebp,等等。

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

于我来说 2022-09-25 00:51:05

除了作通用寄存器之外,一些寄存器有可能在某些指令上发挥独特的作用.
比如ecx可以作为计数器.
离开了这些指令之外,作为通用寄存器,它们的重要你可以认为一样.
但要注意一些习惯问题,比如习惯上,对于X86体系,使用eax来作为C语言函数返回值.(这只是习惯,如果一开始大家习惯用另外一个通用寄存器来传也一样)

感情洁癖 2022-09-25 00:51:05

另外,esp之所以叫栈指针,是因为它和涉及到栈的操作密切相关.一般不要把esp/ebp挪作他用.

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

蓦然回首 2022-09-25 00:51:05

原帖由 cjaizss 于 2009-7-28 13:15 发表
除了作通用寄存器之外,一些寄存器有可能在某些指令上发挥独特的作用.
比如ecx可以作为计数器.
离开了这些指令之外,作为通用寄存器,它们的重要你可以认为一样.
但要注意一些习惯问题,比如习惯上,对于X86体系, ...

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

一指流沙 2022-09-25 00:51:05

eax作为返回值这是软件的约定.
但ecx作为计数,edx:eax作为32位乘法输出...这是硬件的设计决定.

倥絔 2022-09-25 00:51:05

原帖由 cjaizss 于 2009-7-28 15:37 发表
eax作为返回值这是软件的约定.
但ecx作为计数,edx:eax作为32位乘法输出...这是硬件的设计决定.

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

青衫负雪 2022-09-25 00:51:05

隐约记得还有个约定叫  调用者负责保存的寄存器:eax, ecx, edx
被调用者保存的寄存器:ebx, esi, edi

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

不知道还是不是这个理?

篱下浅笙歌 2022-09-25 00:51:05

原帖由 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系统默认是什么规则呢?????????????????

本王不退位尔等都是臣 2022-09-25 00:51:05

这玩意儿叫ABI,当然你可以不遵守,只要不出错就OK。
=========================================
UNIX采用c的call方式

深居我梦 2022-09-25 00:51:05

原帖由 prolj 于 2009-8-5 11:04 发表
这玩意儿叫ABI,当然你可以不遵守,只要不出错就OK。
=========================================
UNIX采用c的call方式

嗯,还是这种方式好。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文