以下x86汇编代码与FLDCW指令有什么关系?

问题描述 投票:3回答:1

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

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字节中。我对吗?

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

assembly floating-point x86 ieee-754 disassembly
1个回答
7
投票

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控制字的数学库默认值,但如果没有其他上下文,则无法确定这一点。

© www.soinside.com 2019 - 2024. All rights reserved.