让我们考虑一下:
#include <iostream>
int main(){
long double a=1.20, b=12.0;
std::cout << sizeof(long double);
add(a,b);
return 0;
}
g++ -m32 -o main main.cpp
执行后发现long double的大小为12个字节。
所以,现在,我想在32位nasm中实现add
函数。
我该如何处理加法浮点数?这不是问题,只需使用FPU和你可以说的fadd。但是,我有12个字节的数字(96位)。我们的FPU寄存器是80位。所以这是一个问题。
另一个问题是,我查看了gcc
生成的代码:
objdump -d main&gt; main.s -M intel
(我知道-S标志,但我习惯了objdump
)并且为了增加长双打,生成的代码如下:
80486e1: db 6d c8 fld TBYTE PTR [ebp-0x38]
80486e4: db 6d d8 fld TBYTE PTR [ebp-0x28]
80486e7: de c1 faddp st(1),st
怎么可能?毕竟,我们有80位寄存器,编译器尝试加载96位数字。
请明确我的想法。 :)