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的目的是什么?
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控制字的数学库默认值,但是如果没有其他上下文,则无法确定这一点.
| 归档时间: |
|
| 查看次数: |
1014 次 |
| 最近记录: |