以下带有 FLDCW 指令的 x86 汇编代码有什么作用?

What does the following x86 assembly code with the FLDCW instruction do?

我正在关注这个编译后的代码(我不知道编译器也没有源代码)。

Sub1:
mov edx,[esp+04h]
and edx,00000300h
or  edx,0000007Fh
mov [esp+06h],dx
fldcw   word ptr [esp+06h]
retn

我的理解:

Sub1(4byte param1)
edx=param1&0x00000300|0x0000007F
higher 2 bytes of param1 = lower 2 bytes of edx
fldcw ???????

fldcw 加载控制字。但是浮点数的控制字是什么?

结果存入param1的高2字节。我说得对吗?

这个子程序的目的是什么?

FLDCW 是为 x87 FPU 加载 16 位控制字的指令。例如,可以在 this Intel web page 上找到控制字的位布局。

控制字的低八位包含 IEEE-754 定义的异常的掩码。 ORing 0x7F 因此屏蔽了所有浮点异常,因为未使用第 6 位和第 7 位。

控制字的高八位包含第8位和第9位的精度控制,第10位和第11位的舍入控制。通过与0x300进行与运算,当前精度控制PC in force 原封不动地通过,而舍入控制 RC 被强制为 0,这对应于 IEEE-754 舍入模式“舍入到最近或偶数”。

这个函数的具体用途是什么,现在还说不清楚。它在 [esp+4] 处的堆栈上传递一个 4 字节整数,调用者将其删除,这表明 C 调用约定。传入的 4 字节整数大概是 FPU 控制字保存的前一个值,用 FSTCW 存储,零从两个字节扩展到四个字节。强制舍入控制和异常掩码的值 建议 此函数用于恢复 x87 控制字的某些编译器的数学库默认值,但如果没有额外的信息,则无法确定这一点上下文。