如何定义80位大小的变量

时间:2015-04-19 13:41:44

标签: c gcc assembly nasm

我需要在gcc编译的C程序中声明一个80位大小的变量(我需要它将数据传递给工作于fpu的asm程序,这个程序用C语言编写) 我的架构是AMD x64
我尝试了long double__float80,但对于他们sizeof则返回12而不是10。 那么如何声明这样的变量?

1 个答案:

答案 0 :(得分:4)

大小包括用于对齐的填充,但它仍然是80位值。 manual说:

  

-m96bit - 长 - 双

     

-m128bit - 长 - 双

     

这些开关控制long double类型的大小。 x86-32应用程序二进制接口指定大小为96位,所以   -m96bit-long-double是32位模式的默认值。

     

现代架构(Pentium和更新版本)更喜欢使用long double来对齐8或16字节边界。在符合ABI的阵列或结构中,这是不可能的。因此,指定-m128bit-long-double将long double与16字节边界对齐,方法是将long double填充为额外的32位零。

     

在x86-64编译器中,-m128bit-long-double是默认选择,因为它的ABI指定long double在16字节边界上对齐。

     

请注意,对于长双精度而言,这两个选项都不会为80位的x87标准提供任何额外的精度。

     

警告:如果覆盖目标ABI的默认值,则会更改包含long double变量的结构和数组的大小,以及修改long double函数的函数调用约定。因此,它们与没有该开关编译的代码不是二进制兼容的。

     

-mlong双-64

     

-mlong双-80

     

-mlong双-128

     

这些开关控制long double类型的大小。 64位的大小使得long double类型等同于double类型。这是32位Bionic C库的默认值。 128位的大小使得long double类型等同于__float128类型。这是64位Bionic C库的默认设置。

     

警告:如果覆盖目标ABI的默认值,则会更改包含long double变量的结构和数组的大小,以及修改long double函数的函数调用约定。因此,它们与没有该开关编译的代码不是二进制兼容的。