汇编:32 位寄存器的 64 位乘法

2023-12-24

我有一个关于 x86 汇编中 64 位乘法的实现的问题。我已经发布了我能够理解的代码。我不知道其余的人在做什么(而且我可能在我已经做过的事情中犯了错误)。任何方向将不胜感激。

dest at %ebp+8
x    at %ebp+12
y    at %ebp+16

movl        16(%ebp), %esi      //Move y into %esi
movl        12(%ebp), %eax      //Move x into %eax
movl        %eax, %edx          //Move x into %edx
sarl        $31, %edx            //Shift x right 31 bits (only sign bit remains)
movl        20(%ebp), %ecx      //Move the low order bits of y into %ecx
imull       %eax, %ecx          //Multiply the contents of %ecx (low order bits of y) by x
movl        %edx, %ebx          //Copy sign bit of x to ebx
imull       %esi, %ebx          //Multiply sign bit of x in ebx by high order bits of y
addl        %ebx, %ecx          //Add the signed upper order bits of y to the lower order bits (What happens when this overflows?)
mull        %esi                //Multiply the contents of eax (x) by y
leal        (%ecx,%edx), %edx           
movl        8(%ebp), %ecx
movl        %eax, (%ecx)
movl        %edx, 4(%ecx)

下面是64位乘法的算法:

x, y: 64-bit integer
x_h/x_l: higher/lower 32 bits of x
y_h/y_l: higher/lower 32 bits of y

x*y  = ((x_h*2^32 + x_l)*(y_h*2^32 + y_l)) mod 2^64
     = (x_h*y_h*2^64 + x_l*y_l + x_h*y_l*2^32 + x_l*y_h*2^32) mod 2^64
     = x_l*y_l + (x_h*y_l + x_l*y_h)*2^32

Now from the equation you can see that only 3(not 4) multiplication needed.

 movl 16(%ebp), %esi    ; get y_l
 movl 12(%ebp), %eax    ; get x_l
 movl %eax, %edx
 sarl $31, %edx         ; get x_h, (x >>a 31), higher 32 bits of sign-extension of x
 movl 20(%ebp), %ecx    ; get y_h
 imull %eax, %ecx       ; compute s: x_l*y_h
 movl %edx, %ebx
 imull %esi, %ebx       ; compute t: x_h*y_l
 addl %ebx, %ecx        ; compute s + t
 mull %esi              ; compute u: x_l*y_l
 leal (%ecx,%edx), %edx ; u_h += (s + t), result is u
 movl 8(%ebp), %ecx
 movl %eax, (%ecx)
 movl %edx, 4(%ecx)

你也可以检查这个在32位机器上实现64位算术 https://stackoverflow.com/questions/11680720/implement-64-bit-arithmetic-on-a-32-bit-machine?rq=1

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

汇编:32 位寄存器的 64 位乘法 的相关文章

  • 整数溢出问题

    我不断遇到整数溢出问题 我不知道如何解决它 有人可以帮忙吗 edx 包含 181 eax 包含 174 xor eax edx mov edx 2 div edx 假设你谈论的是x86 div edx这实际上没有意义 32位div将edx
  • 汇编器8086将32位数字除以16位数字

    我尝试将 32 位数字除以 16 位数字 例如 10000000h 除以 2000h 根据我尝试做的设计除以 右 4 位数字除以除数 然后左 4 位数字除以除数 这是我的代码 DATA num dd 10000000h divisor dw
  • 使用 Gas 生成与位置无关的代码 (-fPIC)

    我尝试在 x86 64 上创建共享库但失败 问题归结为以下代码 请不要介意 它没有多大意义 section data newline ascii n section text globl write newline type write n
  • 如何在 GCC C++ 中编写多行内联汇编代码?

    这看起来不太友好 asm command 1 command 2 command 3 我真的必须在每一行加上双引号吗 另外 由于多行字符串文字在 GCC 中不起作用 我也无法欺骗它 我总是在互联网上找到一些例子 该人手动插入制表符和换行符而
  • Core i3/5/7 CPU 是否提供测量 IPC 的机制?

    至少 过去十年中的所有英特尔 CPU 都包含一组对各种事件进行计数的性能监视器 最新的 Intel CPU Core i3 i5 和 i7 又名 Nehalem 是否提供了计算每时钟指令 IPC 的机制 如果有 它们是如何使用的 如果可能的
  • 调用可以是 cdecl 或 stdcall 的函数

    我需要编写调用外部函数的代码 该函数可以是 32 位 Windows 应用程序中的 stdcall 调用或 cdecl 我的代码 调用者 无法提前知道其中的哪一个 现在 如果我尝试从定义为 stdcall 的调用站点调用 cdecl 函数
  • IDA pro asm 指令更改

    我只是想知道我怎样才能 更改IDA视图A中的asm指令 如何编辑指令 对于 实例 jnz 到 jmp 如何插入新指令 call func1 调用 func2 插入到现有的 代码 我知道如何制作 diff 文件 我知道如何在我的 DLL 上应
  • 在 Intel x86 架构上使用非 AVX 指令移动 xmm 整数寄存器值

    我有以下问题 需要使用 AVX2 以外的任何工具来解决 我有 3 个值存储在 m128i 变量中 不需要第四个值 需要将这些值移动 4 3 5 我需要两个功能 一个用于按这些值进行右逻辑移位 另一个用于左逻辑移位 有谁知道使用 SSE AV
  • Polygot 包含 nasm/yasm 和 C 的文件

    我有一堆幻数 我想将它们包含在由 nasm 或 yasm 编译的 C 程序和汇编文件中 在纯 C 语言中 该文件看起来像是一系列定义 例如 define BLESS 55378008 define ANSWER 42 在 nasm 或 ya
  • long double(GCC 特定)和 __float128

    我正在寻找有关的详细信息long double and float128在 GCC x86 中 更多是出于好奇而不是因为实际问题 可能很少有人需要这些 我只是有史以来第一次 truly需要一个double 但我想知道你的工具箱里有什么以及它
  • 无法在 64 位 Linux 上从汇编 (yasm) 代码调用 C 标准库函数

    我有一个函数foo以汇编语言编写 并在 Linux Ubuntu 64 位上使用 yasm 和 GCC 编译 它只是使用以下命令将消息打印到标准输出puts 如下所示 bits 64 extern puts global foo secti
  • 从c调用汇编函数

    我试图从 c 调用汇编函数 但我不断收到错误 text globl integrate type integrate function integrate push ebp mov esp ebp mov 0 edi start loop
  • 是否有适用于双打 (__m128d) 的 Move (_mm_move_ss) 和 Set (_mm_set_ss) 内在函数?

    多年来 我有几次看到 in 中的内在函数float参数被转换为 m128使用以下代码 m128 b mm move ss m mm set ss a 例如 void MyFunction float y m128 a mm move ss
  • 64 位 Windows 汇编器

    我想对 64 位 Windows 程序集进行编程 最好使用 NASM 我在 google 上查了一下 但似乎找不到 64 位 Windows 编译器 有些网站提到了ml64 但它似乎不再包含在VC 中 我尝试过 32 位程序集 但显然它在我
  • 将 XMM 寄存器压入堆栈

    有没有办法将打包双字整数从 XMM 寄存器推送到堆栈 然后在需要时将其弹出 理想情况下 我正在寻找通用寄存器的 PUSH 或 POP 之类的东西 我已经检查了英特尔手册 但我要么错过了命令 要么没有 或者我是否必须将值解压到通用寄存器然后推
  • intfmt: db "%d", 10, 0 在汇编中的含义

    我最近在我的一个汇编文件的顶部看到了这个 并意识到我在打印整数的过程中花了很长时间使用它 而没有真正意识到它最初来自哪里 在我的基本汇编模板中使用 或 10 0 是什么结尾的意思是 section data intfmt db d 10 0
  • x86 asm 图形设置的分辨率高于 640x480?

    我刚刚开始使用汇编语言 感觉像学习新东西 并且遇到了一些问题 到目前为止 我一直在浏览的所有教程都没有回答 或者太旧而无法知道 1 我尝试了一些搜索 也许我只是不知道正确的关键字 但我找不到用于更改屏幕分辨率等的图形模式的更新列表 我发现的
  • 如何反汇编、修改然后重新组装 Linux 可执行文件?

    无论如何 这可以做到吗 我使用过 objdump 但它不会产生我所知道的任何汇编器都可以接受的汇编输出 我希望能够更改可执行文件中的指令 然后对其进行测试 我认为没有任何可靠的方法可以做到这一点 机器代码格式非常复杂 比汇编文件还要复杂 实
  • x86 程序集 Pushl/popl 不适用于“错误:后缀或操作数无效”

    我是汇编编程的新手 正在努力解决编程基础 http savannah nongnu org projects pgubook 在带有 GNU 汇编器 v2 20 1 的 Ubuntu x86 64 桌面上 我已经能够汇编 链接执行我的代码
  • movsbl指令的作用是什么? [复制]

    这个问题在这里已经有答案了 我在网上搜索过 但找不到明确的示例来理解该指令的作用 因此 如果有人可以举一个例子 这对我来说将会非常有帮助 用符号从字节扩展到长字移动 在Intel语法中 该指令的助记符是MOVSX 当变量类型为 C 时 C

随机推荐

  • 如何将 32 位图标的图像列表导出到单个 32 位位图文件中?

    我想编写一个小实用程序 它将帮助我从 EXE 资源加载单个 32 位位图 带 alpha ImageList1 DrawingStyle dsTransparent ImageList1 Handle ImageList LoadImage
  • pandas 自定义 idxmax() 函数,对相等性进行特殊处理

    我正在处理一个充满选举数据的 csv 文件 我的原始样本可以表示为 city party1 party2 party3 0 city1 50 107 114 1 city2 181 323 326 2 city3 26 28 75 3 ci
  • 使用Geopandas,如何通过采样方法在每个多边形中随机选择5个点

    我想根据随机采样方法在每个多边形中选择 5 个点 每个多边形中需要 5 个点坐标 纬度 经度 来识别种植的是哪种作物 使用 geopandas 有什么想法吗 非常感谢 我的建议包括对形状边界框内的随机 x 和 y 坐标进行采样 然后检查采样
  • Backbone 0.9.9:listenTo 和 on 之间的区别

    我正在尝试了解他们在 Backbone 0 9 9 中所做的新更改 目前我在理解之间的区别时遇到了问题listenTo and on listenTo var View Backbone View extend tagName div in
  • 删除切片中的小值

    How can I delete the small values in a slice plot In my plot there is basically too much blue and I cannot see the red p
  • 在graphviz中记录节点和rankdir

    当我将图表的rankdir从LR更改为TD时 我的记录节点也更改了它们的布局方向 因此它们不再看起来像 记录 我尝试对节点应用单独的rankdir 但这没有效果 如何使记录节点保持正确的布局 digraph sample graph ran
  • Windows Phone 8 模拟器错误 - 创建交换机时发生了一些情况

    我有一个类似的问题 就像这个问题中提到的 无法创建虚拟机 https stackoverflow com questions 13148828 windows phone 8 unable to create the virtual mac
  • 查看包含“很多”列的表格的最佳方式?

    冒着被降级的风险 我想问一下 使用 C 和lot列 我所说的很多 是指大约 1000 个 现在 在您感到高兴之前 或者抛出诸如 为什么您会有一个包含那么多列的表格 之类的回答之前 让我说这实际上是设计要求的一部分 我们正在尽可能快地从 10
  • Android应用程序许可证仅持续一段时间

    我们开发了一款 Android 应用程序 我们希望用户可以购买该应用程序 但只能购买一段时间 例如一年 一旦期限到期 他们应该在新的期限内再次购买该应用程序 我们查看了Google有关 应用程序许可 的信息 但已经有一段时间没有看到许可了
  • 基于 DataContext 属性的触发器

    假设我想根据 DataContext 中的属性值显示 隐藏元素 如何实现 In MainWindow xaml cs DataContext of MainWindow xaml public int Mode get set 在 XAML
  • 获取 vim 编辑器上分割窗口的位置

    我一直在尝试找出如何获取 vim 编辑器窗口内分割窗口的位置 坐标 但到目前为止还没有运气 比如说我有这个布局 0 0 2 0 Split A Split C 0 2 Split B Split D Split D would be 2 2
  • 尝试从 Eclipse 到 Android Studio 执行 Android 应用程序时出现异常

    我尝试将 Eclipse Android 项目迁移到 Android Studio 我尝试了两种方法 直接从 Android Studio 打开并先迁移到 Eclipse 中的 Gradle 然后在 Android Studio 中打开它
  • EPPlus 的通用 Excel 生成器函数

    如何为 LINQ 查询构建通用 EPPlus 电子表格函数 更新 该需求专门针对 ASP NET MVC 应用程序 我所做的只是创建一个接受列表的通用函数 我使用反射来获取属性列表 这将成为我们的列标题 最后 我只是让 EPPlus 完成所
  • 是否可以在 Google Apps 脚本中执行 ImportRange?

    我今天一直在玩 Google Apps 脚本 并尝试编写一些自定义电子表格函数 我已经进行了一些搜索 但找不到我的查询的答案 我知道在 Google 电子表格上 您可以在电子表格的单元格中使用 ImportRange 如下所示 Import
  • 使用 foreach 迭代 IQueryable 会导致内存不足异常

    我正在使用 foreach IQueryable 和 LINQ to SQL 迭代一个小型 10GB 表 看起来像这样 using var conn new DbEntities CommandTimeout 600 100 var dta
  • Kubernetes NGINX 入口重写目标注释破坏

    我正在 Windows 的 docker 桌面下运行 kubernetes v1 16 我已经使用 helm 安装了 nginx ingress 控制器 v1 7 9 我已更新我的主机文件以包含以下条目 127 0 0 1 applicat
  • 使用 @font-face 在 IE 中显示无样式内容的 Flash

    我正在开发一个网站 该网站使用 Open Sans 字体作为正文 并使用 Font Squirrel 生成的 EOT SVG WOFF 和 TTF 字体文件和样式表 我首先将字体 CSS 包含在页面标题中 但是 当我在 IE7 IE8 甚至
  • 我可以清除托管对象上下文吗?

    问题 我正在进行一次非常大的导入 其中解析了一个 XML 文件 对于每 10 个解析的托管对象 我想保存托管对象上下文并删除内存中的这 10 个对象 这样内存中的对象永远不会超过 10 个 保存后 如何清除上下文以便所有对象都从内存中消失
  • 获取 MD5 和 SHA-1

    我正在寻求一些帮助来在我的 iPhone 应用程序中获取 MD5 和 SHA 1 有人可以告诉我如何获得这些吗 include
  • 汇编:32 位寄存器的 64 位乘法

    我有一个关于 x86 汇编中 64 位乘法的实现的问题 我已经发布了我能够理解的代码 我不知道其余的人在做什么 而且我可能在我已经做过的事情中犯了错误 任何方向将不胜感激 dest at ebp 8 x at ebp 12 y at ebp