x86 中如何使用进位和溢出标志来计算乘法

2023-12-02

当两个数字相乘溢出寄存器时,如何使用两个标志来正确计算答案?

E.g. if al holds 0xff并乘以0x2,导致溢出到ax,这些标志对此有何帮助?


Multiplication on x86/x64 never overflows when using the one operand form.
This is because mul and its sibling imul produce an output twice as wide as their operands1.
In your example, multiplying by al produces an output in ax and no overflow is generated.

The CF and OF当结果无法适合操作数大小时设置。
这可用于执行饱和乘法,例如:

;Unsigned

mul ebx
sbb edx, edx      ;EDX = CF replicated along all the 32 bits
or eax, edx       ;EAX = 0ff..ffh if overflow, EAX*EBX otherwise

;Signed (perhaps not the most efficient way)

imul ebx
cmovc eax, 7fffffffh  ;Signed positive max if overflow.   (CMOV-immediate doesn't really exist, but imagine register sources)
cmovnc edx, 0         ; don't modify EAX for the non-overflow case.
sar   edx, 31         ; EDX = all-ones if overflow && negative
xor   eax, edx        ; if negative && overflow
                      ;    flip 7fffffff (INT_MIN) to 80000000 (INT_MIN)
                      ; else xor with 0 is a no-op

(当前的 Rust 编译器还实现a.saturating_mul(b)对于 i32 和 i64,使用 imul 中的标志,但设置不同:https://rust.godbolt.org/z/ab3jMjzbv)


However to implement a multi-precision multiplication, say 64x64-bit, those flags are not needed, in fact, denoting with 232 with k we have:

(a·k+b) × (c·k+d) = a·c·k2 + (a·d+b·c)·k + b·d

其中 32 位产品产生 64 位结果,添加如下

.----.----.
|   b·d   |
'----'----'
       +
     .----.----.
     | a·d+b·c |
     '----'----'
            +
          .----.----.
          |   a·c   |
          '----'----'

 =

.----.----.----.----.
|    128-bit result |
'----'----'----'----' 

1 And this suffices to prevent overflow.

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

x86 中如何使用进位和溢出标志来计算乘法 的相关文章

随机推荐

  • SSIS 包在调试时立即取消

    我有一个相当简单的 SSIS 包 我已经多次使用它来将制表符分隔的文件导入到数据库中的单个表中 我将新的源文件附加到包中并尝试运行该包 包开始了 cmd 提示符会短暂出现 然后消失 然后该进程在平面文件源组件上退出 输出显示如下 SSIS
  • 有没有办法告诉 crossfilter 将数组元素视为单独的记录,而不是将整个数组视为单个键?

    我有一个数据集 其中一些字段值是数组 我想使用 crossfilter 和 d3 js 或 dc js 来显示每个值在数据集中出现的次数的直方图 这是一个例子 var data key KEY 1 tags tag1 tag2 key KE
  • 如何在 LayoutAnchorable AvalonDock 2 中放置窗口实例

    我正在将 WPF C 应用程序 不是 MVVM 中的 AvalonDock 从 1 3 升级到 2 0 在 1 3 中 只要使用 DockableContent 我就可以放置自定义窗口 XAML
  • 如何使用 ctypes 将 Python 列表列表转换为 C 数组?

    正如这里所见如何使用 ctypes 将 Python 列表转换为 C 数组 此代码将获取一个 Python 数组并将其转换为 C 数组 import ctypes arr ctypes c int len pyarr pyarr 对于列表的
  • 使用 get_Keys() 方法进行集合是否正确

    与此问题相关 我可以将名为 keys 的键添加到哈希表而不覆盖 keys 成员吗 我实际上经常使用get Keys method作为推荐的PSBase property只会转移问题 换句话说 在解决方案如下的情况下 对于未知的目录键列表 此
  • Numpy 检查两个数组的元素近似相等

    我有两个带有浮点值的 numpy 数组 我试图找到数字大致相等的索引 浮点比较 所以像这样 x np random rand 3 y np random rand 3 x 2 y 2 Do the comparison and it sho
  • UITableView 单元格中的 UITextField 返回 null

    我已经在这件事上用头撞墙已经有一段时间了 非常感谢任何意见或指示 因此 目标是从表中的文本字段创建登录表单 该用户信息一旦收集 将被传递到单独视图控制器中的数组 以便可以存储在 收藏夹 列表中 因此 我创建了看起来很棒的表单 但是当我控制台
  • 如何配置 Zend_Form 使用数组表示法?

    我在配置 Zend Form 时遇到困难 我有一个 Zend Form 子类 该表格包含一些必需信息和一些附加信息 我希望可以通过数组访问附加信息 提交的数据将如下所示 formData required1 formData require
  • 在 C# 中创建接口实例

    我正在 C 中使用 MS Excel 互操作 但我不明白这行特定的代码是如何工作的 var excel new Microsoft Office Interop Excel Application 其中 Microsoft Office I
  • 模板类的复制构造函数

    我读到模板 copy con 永远不是默认的复制构造函数 并且模板赋值操作永远不是复制赋值运算符 我不明白为什么需要这个限制 并立即上网 ideone 并返回一个测试程序但在这里 复制构造函数永远不会在进一步谷歌搜索时被调用 我遇到了模板化
  • 如何使用 System.Text.Json 处理同一属性的单个项目和数组?

    我正在尝试反序列化一些 JSON 其中包含的值有时是数组 有时是单个项目 我怎样才能做到这一点System Text Json and JsonSerializer 这个问题的灵感来自这个问题对于 Json NET 通过罗伯特 麦克劳斯 我
  • 仅当满足条件时启动discord.py命令冷却

    我希望仅当满足函数中的条件时才开始其中一个命令的冷却 如下所示 bot command async def move ctx destination destinations d1 d2 d3 List of valid arguments
  • ViewBag、ViewData 和 TempData

    任何人都可以解释一下何时使用 TempData ViewBag ViewData 我有一个要求 我需要在控制器一中设置一个值 该控制器将重定向到控制器二 控制器二将渲染视图 我尝试使用 ViewBag 当我到达控制器二时 该值丢失了 我能知
  • Apache HTTP 服务器上的 SSL [关闭]

    Closed 这个问题是与编程或软件开发无关 目前不接受答案 我有 2 个用于 Apache 服务器的 crt 文件 1 root bundle crt 2 我的域名 com crt 和其他捆绑包 1 中级 crt 2 我的域名 com c
  • 尝试在 symfony 4 中安装 sonata admin 时出错

    我尝试在 symfony 4 项目中安装 sonata admin 用户包 composer create project symfony website skeleton my project composer require sonat
  • CloudBlob.OpenRead() 未读取所有数据

    使用 Windows Azure 存储客户端库 CloudBlob OpenRead 方法仅读取 4 mb 的数据 如何使用 OpenRead 方法读取完整流 CloudBlob blob container GetBlobReferenc
  • SetTimeOut 计时器内的 JQuery GetJSON

    任何人都可以发布示例代码 其中有一个正在运行的计时器 javascript settimeout 并进行数据检索 基本上我这个计时器的作用是显示新消息 myFunction param data retrieval operation us
  • 自动滚动到底部

    我正在开发带有聊天屏幕的应用程序 但与普通屏幕一样 它开始从上到下滚动 但应该是从下到上 该应用程序位于 Telerik Nativescript 平台中 View xml
  • 如何为 Autodesk Forge App 指定多个回调 URL?

    您可以注册多个回调 URL 回调 URL 工具提示中有说明 但没有关于如何输入多个 URL 的示例 正确的分隔符是什么 我试过 n 这是工具提示上的拼写错误 我们将修复它 今天您可以使用 2022 年 9 月更新 此功能现已推出
  • x86 中如何使用进位和溢出标志来计算乘法

    当两个数字相乘溢出寄存器时 如何使用两个标志来正确计算答案 E g if al holds 0xff并乘以0x2 导致溢出到ax 这些标志对此有何帮助 Multiplication on x86 x64 never overflows wh