Nasm: 如何从内存中将 long double 加载到 FPU

Nasm: how to load a long double into the FPU from memory

我正在 nasm 中编写一个函数,它将被 32 位 ansi C 调用。

C 中的函数原型如下所示: long double scalar(int n, long double *x) 其中 x 是指向 long doubles.

数组的指针

当我尝试加载单个 long double 到 FPU 时出现问题:

    mov ecx, [esp+8] ; n
    mov eax, [esp+12] ; *x
    fld [eax] ; ERROR: operation size not specified

我应该如何指定尺寸?我的 C 编译器对 long double 使用 12 个字节,如何将它放入 80 位?

要明确指定大小,请在 NASM 中使用以下形式:

fld TWORD [eax] ; load 10 bytes from [eax]

正如您所指出的,FPU 堆栈寄存器是 80 位宽。 C编译器选择12字节,是因为栈帧的数据对齐要求。