使用汇编器(NASM 32 位)输入和处理 IEEE 784 上的浮点数

2024-01-09

我正在大学学习计算机体系结构科目,我被分配编写一个工具,该工具将浮点数作为输入,我想将其存储在内存中并打印出 IEEE 784 标准中数字的二进制表示形式的十六进制形式。

现在我确定了 IEEE 784 纸上将任何十进制浮点数转换为其二进制形式的算法,但我很难想出汇编程序的解决方案(数字可以是 -157.4、0.5、-0.6 等)。 )。

我的猜测是,我需要使用 ASCII 代码和字符串操作从输入中提取符号、指数和尾数,并将 0 或 1 存储在内存中作为符号,将 .将符号转换为二进制形式,然后向右或向左移动位,直到得到一个数字,存储程序必须向右移动的次数(+127 将是指数,对吗?)。然后我应该以某种方式处理输入数字的剩余部分(在 . 之后)。我应该将其乘以二,就像在纸上一样,还是有解决此类问题的方法?最后,程序应该将每个 4 位转换为十六进制,但我不知道如何转换。

我不需要复制粘贴解决方案,我正在寻求学习汇编程序,了解内部流程,而不仅仅是完成作业。如果有人曾经处理过这样的问题,我应该先去哪里。我应该学习什么?我有近三个星期的时间来完成这项任务。

(最后一点 - emu8086 和 NASM 都应该能够汇编程序)。

谢谢你!


你在一问两个问题。

  1. 如何将字符串转换为 IEEE-754 浮点数?好吧,有趣的问题,而且比你想象的更复杂。即使是最后一位的正确舍入也需要大量的工作。

  2. 如何在 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 浏览器等。

快速总结:

  1. 将十进制字符串解析为整数和小数部分。

  2. 将这些部分分别转换为二进制、扩展精度整数(使用 gmp 例程)。

  3. 如果整数部分有足够的有效位来填充尾数,则不必查看小数部分。否则,从小数部分获取位。

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(使用前将#替换为@)

使用汇编器(NASM 32 位)输入和处理 IEEE 784 上的浮点数 的相关文章

随机推荐

  • 测试用例在 deno 上泄漏异步操作

    我从 Drash 下载了示例应用程序 https github com drashland eno drash https github com drashland deno drash deno run allow run allow r
  • Pytest 装置相互干扰

    我正在将 Pytest 与 Django 一起使用 并出现了这种奇怪的行为 我有两个用户装置 一个是另一个的超集 一切都按预期工作 直到我在同一个测试用例中使用两个装置 赛程 pytest fixture def user without
  • BaseX 中的 XQuery - file:write() 之外的 let 语句

    我有以下代码 let fName C Users user Documents Sitemaps Updated Pages Books xml file write fName element titles for x in doc ht
  • 使用 Python API 运行 ansible-playbook

    如何在 python 脚本中运行剧本 在 python 中使用 ansible 模块相当于以下内容 ansible i hosts dbservers m setup ansible playbook i hosts vvvv k site
  • Three.js 将一个对象添加到组中,但保持全局位置/旋转/缩放不变

    我想将一个对象从一个组 或世界 场景 移动到另一个组 但保持其全局转换不变 基本上 我不想看到对象发生变化 基本上是这样的 store current world transformation var origWorldMatrix myO
  • SQL 查询选择表中除两列之外的所有列

    我在 ms access 中有一个表 列名称为 A 到 H TableA A B C D E F G H 我如何编写一个查询来选择除 B 和 F 列之外的所有列 查询结果应该是 A C D E G H 我们有这样的东西吗 select fr
  • 连续从流中读取?

    我有一个 Stream 对象 偶尔会获取一些数据 但间隔时间不可预测 Stream 上出现的消息是明确定义的 并提前声明其有效负载的大小 大小是包含在每个消息的前两个字节中的 16 位整数 我想要一个 StreamWatcher 类来检测
  • Flask:如何读取应用程序根目录中的文件?

    我的 Flask 应用程序结构如下 application top application static english words txt templates main html urls py views py runserver py
  • 仅增加选定边缘的宽度 (cytoscape.js)

    当我选择几个相连的节点或简单的边时 如何预定义使所选边的宽度变大 而不影响整个网络的其余边或节点的宽度 我在选择节点或边时预定义了这一点 cy cytoscape style cytoscape stylesheet selector se
  • 正则表达式匹配第一个和最后一个单词或任何单词

    我有一个巨大的文件 其中包含如下数据列表 fabulous 7 526 2301 2 excellent 7 247 2612 3 superb 7 199 1660 2 perfection 7 099 3004 4 terrific 6
  • 将 Tweepy Status 对象转换为 JSON

    我在用着Tweepy http www tweepy org下载推文 我有一个程序 然后编写实际的Status对象以文本形式存在于文件中 如何将其转换为 JSON 或将此对象导入回 Python 我尝试过使用 JSON 库进行编码 但 St
  • 使用 XCB 获取键盘布局和按键符号

    我正在为 Linux 创建一个集成在简单窗口管理器中的屏幕键盘 我目前正在使用 XCB 现在我想制作假击键 使用 xtest 扩展一切工作正常 除了我无法从我想要放置的键符中获取真实键码的细节之外 目前我正在使用 xcb key symbo
  • Django中如何防止多次登录

    我正在编写一个无法同时登录的用户系统 如果账户在某处处于登录状态 而有人在其他位置登录同一个账户 后一个将登录 前一个将注销 我正在使用一个模型 其中 oneToOneField 与用户模型关联 并保存该用户的会话 ID 代码如下 from
  • Angular 4:表单提交事件完成后关闭模式

    我正在使用 bootstrap 4 modal 当我按下关闭按钮时 modal 会正确关闭 但我想在提交表单中的创建按钮后关闭模式 我正在使用角度4 div class modal fade div class modal dialog d
  • 如何在 AfterMethod 中 TestNG 中测试失败?

    我想在每次测试后检查一些外部日志文件 看看执行过程中是否存在错误 抛出异常AfterMethod不起作用 因为 TestNG 的处理方式不同 它只会使配置方法失败 而不是前面的测试失败 我的方法是这样的 AfterMethod always
  • Perl 脚本无法运行;仅在浏览器中显示实际代码

    我是 Perl 新手 无法让我的脚本正常运行 我应该将实际的 Perl 脚本放在哪里才能正确运行 我正在笔记本电脑上测试所有内容 并尝试从 html 页面调用脚本 而我得到的只是 Web 浏览器中显示的实际脚本 代码 本身 而不是代码设计产
  • SQL Server 中的递归好吗?

    我在 SQL Server 中有一个表 它具有 Item ID Item ParentID 的正常树结构 假设我想迭代并获取特定 Item ID 的所有子项 在任何级别 递归似乎是这个问题的直观候选者 我可以编写一个 SQL Server
  • 如何在一个 SSRS 页面上拥有多个表来表示 SQL 中的一个值?

    我开发了一份一页报告 其中有 4 个表格 我对这个结果很满意 这是针对一个地区显示的 district 002 数据集仅选择了一个地区 我想在数据集中选择多个地区 一个 SQL 字段 并有多个页面代表每页一个地区 所以 换一种方式来说 大约
  • authClient.login 返回错误“未经授权的请求来源”

    这在过去几天里才开始发生 我的代码没有改变 我犯了一个错误 还是这是新的 这似乎意味着我应该在 firebase forge 中的安全规则中添加一条规则 以允许从我正在处理的域 在本例中为 localhost 进行访问 但我不知道在哪里可以
  • 使用汇编器(NASM 32 位)输入和处理 IEEE 784 上的浮点数

    我正在大学学习计算机体系结构科目 我被分配编写一个工具 该工具将浮点数作为输入 我想将其存储在内存中并打印出 IEEE 784 标准中数字的二进制表示形式的十六进制形式 现在我确定了 IEEE 784 纸上将任何十进制浮点数转换为其二进制形