assembly - 以下带有 FLDCW 指令的 x86 汇编代码有何作用?

标签 assembly x86 floating-point ieee-754 x87

我正在跟踪这个编译后的代码(我不知道编译器,也没有源代码)。

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/

相关文章:

c - 吃 bean 的搜索算法

gcc - `asm()`函数在C语言中是如何工作的?

linux - 没有 stdlib 的汇编器 x86

assembly - "Practical Reverse Engineering"中列出的代码是否包含错误,或者我是否误解了循环结构?

performance - vgetmantps 与 andpd 获取 float 尾数的说明

c - 程序接收信号SIGSEGV,ASM中使用SHRD的段错误

assembly - 哪些 x86 指令需要两个(或更多)内存操作数?

c - 使用回调函数报告堆栈回溯

c# - 为什么在 string 和 float 之间转换错误?

floating-point - 为什么 float 不正确?