jeanlove 发表于 2009-07-28 13:05

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

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

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

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

cjaizss 发表于 2009-07-28 13:15

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

cjaizss 发表于 2009-07-28 13:18

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

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

jeanlove 发表于 2009-07-28 14:47

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

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

cjaizss 发表于 2009-07-28 15:37

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

jeanlove 发表于 2009-07-28 16:11

原帖由 cjaizss 于 2009-7-28 15:37 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
eax作为返回值这是软件的约定.
但ecx作为计数,edx:eax作为32位乘法输出...这是硬件的设计决定.
明白了,这几个是不能随便改。

bsdc 发表于 2009-08-02 15:02

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

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

不知道还是不是这个理?

jeanlove 发表于 2009-08-05 10:54

原帖由 bsdc 于 2009-8-2 15:02 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
隐约记得还有个约定叫调用者负责保存的寄存器:eax, ecx, edx
被调用者保存的寄存器:ebx, esi, edi

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

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

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

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

prolj 发表于 2009-08-05 11:04

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

jeanlove 发表于 2009-08-05 11:18

原帖由 prolj 于 2009-8-5 11:04 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
这玩意儿叫ABI,当然你可以不遵守,只要不出错就OK。
=========================================
UNIX采用c的call方式
嗯,还是这种方式好。
页: [1]
查看完整版本: x86的寄存器是不是除了eax以外,都可以混用?