有多少寄存器和哪种寄存器可用于c语言的存储类REGISTER

时间:2015-04-03 05:26:16

标签: intel cpu-registers storage-class-specifier

寄存器存储类用于快速访问变量,其内存在CPU中分配。但是cpu中的寄存器是有限的。我使用的是英特尔酷睿i5-4260U处理器。我已经访问了英特尔网站了解注册的详​​细信息。但我无法找到cpu包含多少寄存器的任何规范  (访问网站点击here)。  即使我能找到寄存器的数量((来自How many registers are there in 8086/8088?)) 但我无法弄清楚c存储类使用了多少这些。

2 个答案:

答案 0 :(得分:0)

  

但我找不到任何有关多少寄存器的规范   cpu是否包含

只需查看“ia32编程模型”或“amd64编程模型”。

  

我无法弄清楚c存储类使用了多少这些。

这是依赖于实现的。编译器甚至可以忽略它。如果使用高级优化调用,它们中的一些使用自动寄存器映射,无论变量的声明方式如何。

例如:IA32上用户模式应用程序的编程模型由寄存器EAXEBXECXEDXESI组成。 ,EDIEBPESPEIPEAXEDX用作累加器,它们是某些指令的隐式操作数(MULDIV),它们保存函数的返回值。 EBPESP保留用于堆栈和帧管理。 EIP是指令指针。因此,我们为EBXECXEDIESI留下了寄存器映射。根据生成的代码,可能需要这些寄存器中的一个或多个,因此可以减少用于映射变量的可用寄存器的数量。

答案 1 :(得分:0)

包含了C中的寄存器关键字,因为在创建C时,编译器并不总能很好地完成寄存器分配。寄存器分配是将程序变量映射到CPU寄存器的编译器的一部分。

如今,编译器用于寄存器分配的算法总体上非常出色。因此编译器经常忽略寄存器关键字,推断编译器比编程器更了解如何映射寄存器以最大化性能。

我不确定是什么编译器' mcleod_ideafix'是指他写的时候EAXEDX无法用于注册分配。 gcc 编译器在32位x86代码(EAXEBXECXEDXESI中使用6个整数寄存器,和EDI)。如果函数没有进行任何函数调用并且你给出了正确的编译器选项,它甚至会使用EBP。 64位模式通过R8增加了8个寄存器R15。如果您正在使用 gcc ,只需使用-S选项编译文件,然后查看生成的代码以查看使用的寄存器。

另一件需要考虑的事情是英特尔处理器使用名为register renaming的功能来降低没有足够寄存器的性能损失。