【问题标题】:Intel x86 coprocessor assembly questionIntel x86 协处理器组装问题
【发布时间】:2010-01-20 04:47:20
【问题描述】:

我在理解如何检索使用英特尔 x86 协处理器完成的计算结果时遇到了一些麻烦。

请考虑以下数据段。

.data

res real4 ?
x real4 5.0
k real4 3.4

以及以下代码段,版本 1

.code

main:

fld x      ; 5.0
fadd k1    ; 5.0 + 3.4
fistp res  ; store as integer (it will round, in this case down)

mov eax, res ; eax = 00000008

end main

第 2 版

.code

main:

fld x     ; 5.0
fadd k    ; 5.0 + 3.4
fstp res  ; store as real

mov eax, res ; eax = 41066666

end main

我了解第 1 版,没问题。

这是第 2 版我不明白。我可以在调试器中看到它与版本 1 一样进行了一些精确的计算,但是当存储时间是“41066666”!?

这是什么原因?
用什么“编码”把8.4变成“41066666”?
有没有办法将其转换回 8.4,以便我可以在控制台中打印(例如,使用 StdOut masm32 库函数)?

谢谢。

【问题讨论】:

    标签: assembly x86 masm32


    【解决方案1】:

    Floating Pointt Calculator and Converter

    输入8.4可以看到数字的十六进制表示为:41066666

    【讨论】:

    • 谢谢。这就解释了。请花一些时间来回答问题的另一部分:有没有办法将它转换回 8.4 以便我可以在控制台中打印它?谢谢。
    • 嗯...我在 C 中的做法是调用 printf(%f, x)。你在用什么图书馆?里面可能有一个函数可以为你转换它。
    • 如帖子中所述,我使用的是 masm32。我不知道,但也许有一些 masm32 函数,比如 dwtoa,但是对于可以做到的浮点数。
    【解决方案2】:

    编码为IEEE-754浮点格式。看来您正在使用 32 位浮点数,也称为单精度。这种格式包含一个符号位,一个 8 位指数,偏移 127(可能是 128——我不记得了),以及 24 位尾数,其中存储 23,丢失的位是最重要的,通常具有值一,除了非规范值。有几种具有特殊含义的模式:零、NaN、无穷大和非正规。

    除了 CookieOfFortune 建议的外部工具外,您还可以通过执行各种算术运算来确定值,将浮点转换为 ASCII。有许多算法可以在空间上权衡速度。查看 ftoa 的任何运行时库源,或查看 printf() 的 %f 或 %g 转换。

    【讨论】:

      【解决方案3】:

      0x41066666 8.4(准确地说是 8.3999996185302734375)以 IEEE-754 单精度格式编码。您可以通过从编码中提取组件字段轻松地将其值显示为十六进制数字,这将为您提供0x8.66666,但将其转换为十进制则更难正确执行。如果你想要十进制输出,最简单的方法是链接你系统上的 C 库并使用 printf 函数。

      或者,正如 wallyk 所建议的,获取其中一个开源转换例程的源代码(或编写自己的实现,尽管要做好这是一项令人惊讶的具有挑战性的任务)。可能最好的易于访问的资源位于Netlib 上的文件gdtoa.tgz 中。该实现的复杂性应该让您对所涉及的问题有所了解,并且可能会让您回到使用库 =)

      【讨论】:

        猜你喜欢
        • 2015-11-20
        • 2011-07-24
        • 2020-07-08
        • 1970-01-01
        • 2010-10-17
        • 2014-04-15
        • 2010-12-11
        • 1970-01-01
        • 2015-06-26
        相关资源
        最近更新 更多