以下汇编代码有什么作用?

bar*_*rej 3 floating-point x86 assembly disassembly ieee-754

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

Sub1:
mov edx,[esp+04h]
and edx,00000300h
or  edx,0000007Fh
mov [esp+06h],dx
fldcw   word ptr [esp+06h]
retn
Run Code Online (Sandbox Code Playgroud)

我的理解:

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

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

结果存储在param1的高2字节中.我对吗?

这个subroutin的目的是什么?

nju*_*ffa 7

FLDCW是一个加载x87 FPU的16位控制字的指令.例如,可以在此英特尔网页上找到控制字的位布局.

控制字的低8位包含IEEE-754定义的异常的掩码.0x7F因此,ORing会屏蔽所有浮点异常,因为不使用位6和7.

控制字的高8位包含位8和9中的精度控制,以及位10和11中的舍入控制.通过ANDing与当前有效0x300的精度控制PC通过未触发,而舍入控制RC被强制为0 ,这对应于IEEE-754舍入模式"舍入到最近或甚至".

不可能说出这个功能究竟是什么目的.它在堆栈上传递一个4字节的整数,[esp+4]调用者将其移除,这表明C调用约定.传入的4字节整数可能是FPU控制字的保存的先前值,存储为FSTCW0到4个字节的零.强制用于舍入控制和异常掩码的值表明此函数用于恢复某些编译器的x87控制字的数学库默认值,但是如果没有其他上下文,则无法确定这一点.

  • 此代码仅以某种方式设置x87 FPU.出于何种目的设置这种方式是不可能的,但写入控制字的值表明该函数应该恢复数学库的默认设置.此代码仅设置FPU运行的模式,它不作用于浮点寄存器中的任何值. (3认同)