在我们的应用中、我们将使用最新的 fs_div28.asm 文件(来自编译器工具 v20.2-1 LTS、看起来与 v22.6.0 LTS 相同)执行浮点除法、当测试指数溢出和除法0时、我们发现以下问题:
- 当使用会导致溢出的数字时、软件会给出错误的结果、例如:
F1 = 1.75e+34 (0x7858b717)、大正数
F2 = -1.96e-07 (bb452f117)、小负数
F1/F2 = 2.35e-38 (0x01000008)、小正数
在指数溢出的情况下、检查 fs_div28.asm 文件似乎是为了返回 max 有效的正负浮点数(0x7F7FFFFF 或0xFF7FFFFF),但无法使用。
下面这个问题看起来就像这样:代码通过在 AL 寄存器中加载生成的浮点指数、减去255并检查结果是否大于或等于0来检查溢出。 然后,“溢出”处理部分尝试使用 SAT 指令将 ACC 寄存器填充为0x7FFF FFFF,但由于 ACC 寄存器本身没有溢出,OVC 不会增加(保持为0),ACC 保持不变,因此 ACC 中的最终结果不正确。
此外,如果生成的浮点数为负,则 ACC 保存在 P 寄存器中,AH 被修改,但在分支到“返回值”部分之前,ACC 永远不会恢复。
2.计算除数时、结果为+3.38e+38 (0x7f7f0000)或–3.38e+38 (0xFF7F0000)、具体取决于被除数的符号。
因此、对于问题1、任何人能否确认这是否是 FS_DIV28.asm 中的问题、或者器件是否需要额外设置才能执行浮点决策。
关于问题2、使用这些数字的原因是什么、而不是+/-无穷大或最大值 有效的正负浮点数(0x7F7FFFFF 或0xFF7FFFFF)?

