加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 从x86函数返回时,信令NaN已损坏(x87的flds / fstps)

发布时间:2020-12-14 00:30:29 所属栏目:Linux 来源:网络整理
导读:我对x86(32位) linux gcc有奇怪的行为.我使用gcc的内置__builtin_nansf(“”)生成信令NaN,生成0x7fa00000.从函数float返回此值后,将其修改为0x7fe00000.有一个简短的例子: #include stdio.hfloat f = __builtin_nansf("");float y;float func (void){ retur
我对x86(32位) linux gcc有奇怪的行为.我使用gcc的内置__builtin_nansf(“”)生成信令NaN,生成0x7fa00000.从函数float返回此值后,将其修改为0x7fe00000.有一个简短的例子:

#include <stdio.h>
float f = __builtin_nansf("");
float y;

float func (void)
{
  return f;
}

int main (void)
{
  printf("%xn",*((int*)&f));
  y = func();
  printf("%xn",*((int*)&y));
}

用gcc-4.6.2 program.c编译的程序,其输出:

7fa00000
7fe00000

GDB:

(gdb) p/x f   
$2 = 0x7fa00000
...
(gdb) si
0x08048412 in func ()
1: x/i $pc
0x8048412 <func+14>:    flds   -0x4(%ebp)
(gdb) x/x $ebp-4
0xbfffeb34: 0x7fa00000
(gdb) si
(gdb) info all-regis
st0            nan(0xe000000000000000)  (raw 0x7fffe000000000000000)
... //after return from func
(gdb) si
0x0804843d in main ()
1: x/i $pc
0x804843d <main+38>:    fstps  0x804a024
(gdb) si
(gdb) x/x 0x804a024
0x804a024 <y>:  0x7fe00000

为什么我的信号NaN被修改了?我该如何防止这种修改?

解决方法

我不确定你能阻止这个.装上的x87的SNAN通常引发无效异常,然后将该值转换为QNAN,通过设定(23位)的尾数的MSB.也就是说,OR’ing为0x00400000.

从Intel? 64 and IA-32 Architectures Software Developer Manuals开始,第1卷,第4.8.3.4节描述了sNan / qNan处理.第8章介绍X87 FPU编程.第3卷,第22.18页还描述了X87 FPU如何处理NaN.

我没有看到X87控制字中的任何位会产生您希望进行sNaN传播的行为.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读