我正在跟踪这个编译后的代码(我不知道编译器,也没有源代码)。
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
进行 AND 运算精准控制PC
当前生效的内容是原封不动地传递,而舍入控制 RC
强制为0,对应IEEE-754舍入模式“舍入到最接近或偶数”。
无法确切地说出这个函数的目的是什么。它在堆栈上的 [esp+4]
处传递了一个 4 字节整数。它被调用者删除,建议使用 C 调用约定。传入的 4 字节整数大概是之前保存的 FPU 控制字值,存储为 FSTCW
零从两个字节扩展到四个字节。强制舍入控制和异常掩码的值表明该函数用于恢复 x87 控制字的某些编译器的数学库默认值,但如果没有额外的上下文,则无法确定这一点。
关于assembly - 以下带有 FLDCW 指令的 x86 汇编代码有何作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31895729/