以下带有 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 控制字的某些编译器的数学库默认值,但如果没有额外的信息,则无法确定这一点上下文。
我正在关注这个编译后的代码(我不知道编译器也没有源代码)。
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 控制字的某些编译器的数学库默认值,但如果没有额外的信息,则无法确定这一点上下文。