关于IA64平台上的另一个误用

蝎子

在之前的文章中,我说过IA64架构是一个十分热门的处理器架构(本文写于2004年)。那,今天我们就再来讲讲在IA64上容易出现的另一个误用。这个误用会生动地讲述:如果你欺骗了编译器,它会回过头来狠狠地咬上你一口。

在IA64处理器上,没有一个所谓的”绝对寻址”模式,而是通过r1寄存器来访问全局变量,这个寄存器还有另外一个别名”gp”(global pointer)。它始终指向程序中的全局变量,举个例子:如果你定义了三个全局变量,则第一个可以通过[gp + 0]来访问,第二个则是[gp + 8],以此类推,第三个是[gp + 16]。(我相信,Win32 MIPS上的调用约定也是使用这个技术)

在IA64架构上,”addl”指令有一个使用限制,也即:你只能使用最多22位,换句话说,就是4MB。所以你只能拥有4MB的全局变量。

和你所想的一样,有些开发者希望能使用多于4MB的全局变量。幸运的是,这些人没有定义100万个DWORD变量,而是使用了一些特别大型的全局数组。

IA64处理器通过将全局变量分为两类来解决这个问题,将它们分为”small”和”large”这两类。(small和large之间使用一个编译器标志来进行区分。我相信编译器默认将大于8个字节的变量视作large)

下面的代码演示了如何访问一个”small”变量:

 

在上面的代码中,gp寄存器实际上是指向了变量地址的中间,所以可以同时使用正向和负向偏移来访问。在这个例子中&#x

你可能感兴趣的:(OldNewThing)