96位长的双倍和太短的stX寄存器

时间:2016-04-12 18:19:08

标签: nasm

让我们考虑一下:

#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位数字。

请明确我的想法。 :)

0 个答案:

没有答案