我正在大学学习计算机体系结构科目,我被分配编写一个工具,该工具将浮点数作为输入,我想将其存储在内存中并打印出 IEEE 784 标准中数字的二进制表示形式的十六进制形式。
现在我确定了 IEEE 784 纸上将任何十进制浮点数转换为其二进制形式的算法,但我很难想出汇编程序的解决方案(数字可以是 -157.4、0.5、-0.6 等)。 )。
我的猜测是,我需要使用 ASCII 代码和字符串操作从输入中提取符号、指数和尾数,并将 0 或 1 存储在内存中作为符号,将 .将符号转换为二进制形式,然后向右或向左移动位,直到得到一个数字,存储程序必须向右移动的次数(+127 将是指数,对吗?)。然后我应该以某种方式处理输入数字的剩余部分(在 . 之后)。我应该将其乘以二,就像在纸上一样,还是有解决此类问题的方法?最后,程序应该将每个 4 位转换为十六进制,但我不知道如何转换。
我不需要复制粘贴解决方案,我正在寻求学习汇编程序,了解内部流程,而不仅仅是完成作业。如果有人曾经处理过这样的问题,我应该先去哪里。我应该学习什么?我有近三个星期的时间来完成这项任务。
(最后一点 - emu8086 和 NASM 都应该能够汇编程序)。
谢谢你!
你在一问两个问题。
如何将字符串转换为 IEEE-754 浮点数?好吧,有趣的问题,而且比你想象的更复杂。即使是最后一位的正确舍入也需要大量的工作。
如何在 x86 asm 中执行此操作?愚蠢的问题;与在 asm 中编写任何算法的方式相同。最简单的答案是用 C 语言编写它,然后查看编译器输出。过时的 x87 FPU 有一些指令可以对 FP 值执行按位操作,但像 SSE 这样的普通 FPU 没有这些指令。 SSE 仅具有与整数的转换以及普通的数学运算。 (当然,您可以在同一寄存器上使用向量整数运算)。反正,“我如何在 asm 中写这个”不是一个有趣的问题如果您还没有正确的算法并尝试实现它。
An 在线 IEEE-754 计算器 http://www.h-schmidt.net/FloatConverter/IEEE754.html建议查看 libc 源代码以将字符串转换为浮点数,反之亦然。
I found 一篇很好的文章和分析 http://www.exploringbinary.com/how-glibc-strtod-works/GNU libc 的strtof/strtod
函数,这也将其与大卫·格雷的实施 http://www.exploringbinary.com/how-strtod-works-and-sometimes-doesnt/它用于 Python、PHP、Java 和多种 Web 浏览器等。
快速总结:
将十进制字符串解析为整数和小数部分。
将这些部分分别转换为二进制、扩展精度整数(使用 gmp 例程)。
如果整数部分有足够的有效位来填充尾数,则不必查看小数部分。否则,从小数部分获取位。
The fractional part is tricky: it can have leading zeros, so it's represented as a fraction. e.g. .00123 = 123/105. Getting the required number of bits for the mantissa out of this fraction is done with extended-precision integer division, typically only using a couple div
instructions rather than computing and throwing away most of the full extended-precision division result.
一旦获得 32 位浮点值,您就可以将其打印为十六进制字符串,就像打印任何 32 位整数一样。 Base16 非常方便,因为每 8 位映射到两个十六进制数字。以 10 为基数打印整数通常需要重复除以 10,直到数字
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)