gpt4 book ai didi

linux - 从 x86 函数(x87 的 flds/fstps)返回时,信号 NaN 被破坏

转载 作者:IT王子 更新时间:2023-10-29 01:04:46 27 4
gpt4 key购买 nike

我对 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("%x\n", *((int*)&f));
y = func();
printf("%x\n", *((int*)&y));
}

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

7fa00000
7fe00000

数据库:

(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 通常会引发 INVALID 异常,然后通过设置(23 位)尾数的 msb 将值转换为 qNaN。也就是说,与 0x00400000 进行“或”运算。

来自Intel® 64 and IA-32 Architectures Software Developer Manuals , Vol 1, 4.8.3.4 描述了 sNan/qNan 处理。第 8 章涉及 X87 FPU 编程。第 3 卷,22.18 还描述了 X87 FPU 如何处理 NaN。

我在 X87 控制字中没有看到任何位会产生您想要的 sNaN 传播行为。

关于linux - 从 x86 函数(x87 的 flds/fstps)返回时,信号 NaN 被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22816095/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com