我试图理解使用FPU进行64位整数运算。我写这个(ATT语法):
fildq A
fildq B
faddp
fistpq CC中的结果是A+ B +1。如果我以" finit“指令开头,它给出了正确的值A+B。我认为不想要的+ 1可能是因为它添加了进位,但使用gdb时,当我使用finit时,我发现FPU控制寄存器中一点也没有区别--在这两种情况下,控制寄存器以0x27F开头,标记寄存器为0xFFFF (=堆栈为空),而所有其他寄存器(包括状态寄存器,所有条件位所在的位置)为零。
在这里使用finit似乎有点钝,如果我不使用finit,我也想知道额外的+1是从哪里来的,因为在这两种情况下,所有FPU寄存器的值似乎是相同的。有人能帮我弄清楚这件事吗?
发布于 2022-01-20 20:24:44
…当我使用finit时,我发现FPU控制寄存器与不使用finit时没有任何区别--在这两种情况下,控制寄存器都以0x27F…开头。
您确定吗?finit应该加载0x37F,这是比0x27F多设置的一位。不同之处在于精确控制领域。默认值使用80位,而所观察到的值使用64位。
C中的结果是A+B+ 1.…在这里使用finit似乎有点钝,而且我也在想,如果我不使用它,额外的+1是从哪里来的,…
使用足够大的A和B,您可能会看到fadd在精度上的损失。解除对精确异常的掩蔽将证实这一点。我认为您正在使用您最喜欢的编译器的内联程序集功能。如果您不想为琐碎的任务操心,这当然很方便,但是显然您的编译器的运行时系统会在启动时加载0x27F,以考虑兼容性问题。详细研究它的手册(可能还有源代码)。
https://stackoverflow.com/questions/68982156
复制相似问题