我正在遵循这个编译的代码(我不知道编译器也没有源代码)。
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上找到控制字的位布局。
控制字的低8位包含IEEE-754定义的异常的掩码。因此,ORing 0x7F
会屏蔽所有浮点异常,因为不使用位6和7。
控制字的高8位包含位8和9中的精度控制,以及位10和11中的舍入控制。通过与0x300
进行AND运算,当前有效的精度控制PC
不受影响,而舍入控制RC
是强制为0,这对应于IEEE-754舍入模式“舍入到最近或甚至”。
不可能说出这个功能究竟是什么目的。它在[esp+4]
的堆栈上传递一个4字节的整数,由调用者删除,表明C调用约定。传入的4字节整数可能是FPU控制字的保存先前值,与FSTCW
一起存储,零从2到4个字节扩展。强制用于舍入控制和异常掩码的值表明此函数用于恢复某些编译器的x87控制字的数学库默认值,但如果没有其他上下文,则无法确定这一点。