如何在 x86 汇编中移动两个浮点相乘的结果?

2023-12-02

我目前正在尝试将两个浮点数相乘,其中一个来自浮点向量(存储在 ebx 中的地址),并与我存储在 ecx 中的值相乘。

我已经确认输入值是正确的,但是,例如,如果我将 32 乘以 1,则 EAX 中的值将更改为 00000000,而 EDX 中的值将更改为 105F0000。根据我对 MUL 的理解,发生这种情况是因为它将结果的高位存储在 EDX 中,将低位存储在 EDX 中。问题是,如何将结果移动到输出变量(returnValue)中?这是有问题的代码片段:

AddColumnsIteration:
    cmp esi, 4 // If we finished storing the data
    jge NextColumn  // Move to the next column
    mov eax, [ebx][esi * SIZEOF_INT] // Get the current column
    mul ecx // Multiply it by tx
    add [returnValue][esi * SIZEOF_INT], eax // Add the data pointed at by eax to the running total
    inc esi // Element x, y, z, or w of a Vec4
    jmp AddColumnsIteration // Go back to check our loop condition  

我知道如果我使用 x87 命令或 SSE 指令,这会容易几个数量级,但问题的限制需要纯 x86 汇编代码。抱歉,如果这看起来有点基础,但我仍在学习汇编的特性。

预先感谢您的帮助,祝您有愉快的一天


您将浮点数的表示形式相乘为整数,而不是浮点数本身:

 1.0 = 0x3f800000
32.0 = 0x42000000

       0x3f800000 * 0x42000000 = 0x105f000000000000

要实际进行浮点运算,您需要执行以下操作之一:

  • Use x87.
  • Use SSE.
  • 编写您自己的软件乘法,将编码分为符号位、指数和有效数,对符号位进行异或以获得乘积的符号位,添加指数并调整偏差以获得乘积的指数,将有效数相乘并舍入获取乘积的有效数,然后将它们组合起来产生结果。

显然,前两个选项要简单得多,但听起来由于某种原因它们不是一个选项(尽管我真的无法想象为什么不可以;x87 和 SSEare“纯 x86 汇编代码”,因为它们长期以来一直是 ISA 的一部分)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 x86 汇编中移动两个浮点相乘的结果? 的相关文章

随机推荐

  • 在 Yii 框架中设置会话

    我正在用 Yii 开发一个网站 我的页面中有一个按钮 我需要在用户单击它时设置一个会话变量 并在用户单击另一个按钮时获取会话值 我怎样才能做到这一点 Use CWebUser状态方法 set session variable Yii app
  • 对 stackexchange api 的 Http 请求返回不可读的 json

    我正在尝试从 stackexchange api 获取一些 json 数据 接收 OAuth 代码和访问令牌工作正常 但是当调用实际的数据获取端点时 响应看起来确实很奇怪 可能是编码或类似的 该请求如下所示 var client reque
  • 如果网络中断,socket 会发生什么情况

    假设一个简单的网络模型 A 已成功创建到 B 的 TCP 连接 并且它们正在这样相互通信 A lt gt B 我知道如果A上的程序死掉 例如核心转储 这将导致向B发送RST数据包 因此B的任何读取尝试都会导致EOF 而B的任何写入尝试都会导
  • 从城市名称获取纬度和经度

    在我当前的 Android 应用程序中 我想根据输入的城市名称 街道名称或邮政编码获取坐标 我怎样才能做到这一点 此致 通过网络获取地理坐标 private static JSONObject getLocationInfo String
  • 如何根据另一个向量中的条件从向量中删除元素?

    我有两个等长的向量 我想根据其中一个向量中的条件从中删除元素 应对两者应用相同的删除操作 以便索引匹配 我想出了一个解决方案std erase 但速度非常慢 vector
  • 带问号的 nvarchar 列结果

    我正在尝试更新队列项目并检索其列文本内容 问题是诸如希伯来字符之类的特殊符号会导致问号 通过直接制作 我可以完美地看到文本SELECT条款 在sql management studio Message s column hey 当我尝试检索
  • 导入模块中全局变量的可见性

    我在 Python 脚本中导入模块时遇到了一些困难 我将尽力描述该错误 为什么会遇到它 以及为什么我要使用这种特定的方法来解决我的问题 我将在稍后描述 假设我有一个模块 在其中定义了一些实用函数 类 它们引用在将导入该辅助模块的命名空间中定
  • @font-face src: local - 如果用户已经拥有本地字体,如何使用它?

    正确的使用方法是什么 font face这样如果用户已经拥有该字体 浏览器就不会下载该字体 我正在使用 font face 来定义 DejaVu 它已经安装在我的系统 linux 上 Firefox 不下载字体 但 Chromium 每次都
  • 使用 NodeJS 中的服务主体连接到 Azure SQL,但令牌被拒绝

    我在使用服务主体让 NodeJS 应用程序连接到 Azure SQL 数据库时遇到问题 但是 当我尝试使用 C 代码片段执行相同的操作时 效果很好 我注意到两种语言的身份验证返回的令牌有点不同 如果我从 C 获取正确的令牌并将其硬编码到 N
  • 如何获取 Alexa 技能的用户日期/时间或时区信息?

    我正在使用 Lambda Python 来开发一项技能 并且我有兴趣为用户提供一些与时间相关的信息 上request对象有一个timestamp但那是没有偏移的 UTC 有没有一种方法可以找到用户的日期 时间或时区 而不必询问位置信息 如果
  • 类型错误:observable.of 不是函数 - [电子邮件受保护] - [电子邮件受保护] - angular5

    升级到后 电子邮件受保护 并将所有 RxJS 导入 方法和运算符转换为新的 gt 5 5 形式 我在运行时收到类型错误 Observable of不是一个函数 定义为扩展的成员的所有方法都会发生相同的错误Observable 例如 Obse
  • Java寻找具有特定注释的方法及其注释元素

    假设我有这个注释类 Retention RetentionPolicy RUNTIME Target ElementType METHOD public interface MethodXY public int x public int
  • 读取单个文件的Java多线程应用程序

    我目前编写的程序使用 32 个线程 每个线程读取 1 个文件 即 32 个 txt 文件 多线程与 CPU 速度无关 但每秒对 BING 的 api 进行 32 次调用比调用 1 次要快得多 每个 txt 文件都包含搜索查询列表 我创建一个
  • JButton 列之间的间距

    我正在开发一个简单的 GUI 其中 JButton 的前两列和后两列之间有一个岛 代码如下 JPanel panel new JPanel new GridLayout 50 4 JScrollPane scrollable new JSc
  • 将自定义文本添加到 Woocommerce 中的变化价格

    我以为这很容易 但我被困住了 我想做的就是在产品页面上的变体价格后面添加 each 一词 我找到的解决方案将其添加到类别页面和产品页面的两个位置 代码是 Adds a text Each after price function chang
  • .split() 在 IE8 中无法按预期工作

    我使用以下方法从变量中包含的 URL 中提取变量 它在现代浏览器中工作正常 但在 IE8 中 它在第一个变量上失败 但在第二个变量上成功 var p http sagensundesign com height 400 width 300
  • R:“乘以”数据框的字符串列

    不知道这个操作叫什么 谷歌也没有帮助 假设我有两个像这样的简单数据框 df1 lt data frame factor1 c a b c df2 lt data frame factor2 c x y z gt df1 factor1 1
  • 使用 javax.faces.STATE_SAVING_METHOD 在客户端保存会话的含义

    我的第一个 JSF 页面抛出异常javax faces application ViewExpiredException 当我搜索时 我得到了解决我的问题的解决方案
  • R 将上个月的值添加为列

    我有一个数据表 其中包含按月列出的日期和价格 set seed 128 dat lt data table DATE c 2014 01 01 2014 02 01 2014 03 01 2014 04 01 2014 05 01 2014
  • 如何在 x86 汇编中移动两个浮点相乘的结果?

    我目前正在尝试将两个浮点数相乘 其中一个来自浮点向量 存储在 ebx 中的地址 并与我存储在 ecx 中的值相乘 我已经确认输入值是正确的 但是 例如 如果我将 32 乘以 1 则 EAX 中的值将更改为 00000000 而 EDX 中的