gcc 在 x86 上使用 divdi3 除法进行 long long

2023-12-20

When gcc看到硬件不支持的整数类型的乘法或除法,它会生成对特殊库函数的调用。

http://gcc.gnu.org/onlinedocs/gccint/Integer-library-routines.html#Integer-library-routines http://gcc.gnu.org/onlinedocs/gccint/Integer-library-routines.html#Integer-library-routines

根据上面的链接,long __divdi3 (long a, long b)用于长整除。然而,这里http://gcc.gnu.org/onlinedocs/gcc-3.3/gccint/Library-Calls.html http://gcc.gnu.org/onlinedocs/gcc-3.3/gccint/Library-Calls.htmldivdi 解释为“要求对一个带符号的双字进行除法”。当第一个源具有 di 后缀 -> 长参数的清晰映射时,第二个源表示 divdi 表示双字, udivdi 表示全字(单字,对吧?)

当我编译简单的例子时

int main(int argc, char *argv[]) {
    long long t1, t2, tr;

    t1 = 1;
    t2 = 1;
    tr = t1 / t2;

    return tr;
}

with gcc -Wall -O0 -m32 -march=i386(海湾合作委员会版本4.7.2) 拆解告诉我

    080483cc <main>:
     80483cc:       55                      push   %ebp
     80483cd:       89 e5                   mov    %esp,%ebp
     80483cf:       83 e4 f0                and    $0xfffffff0,%esp
     80483d2:       83 ec 30                sub    $0x30,%esp
     80483d5:       c7 44 24 28 01 00 00    movl   $0x1,0x28(%esp)
     80483dc:       00
     80483dd:       c7 44 24 2c 00 00 00    movl   $0x0,0x2c(%esp)
     80483e4:       00
     80483e5:       c7 44 24 20 01 00 00    movl   $0x1,0x20(%esp)
     80483ec:       00
     80483ed:       c7 44 24 24 00 00 00    movl   $0x0,0x24(%esp)
     80483f4:       00
     80483f5:       8b 44 24 20             mov    0x20(%esp),%eax
     80483f9:       8b 54 24 24             mov    0x24(%esp),%edx
     80483fd:       89 44 24 08             mov    %eax,0x8(%esp)
     8048401:       89 54 24 0c             mov    %edx,0xc(%esp)
     8048405:       8b 44 24 28             mov    0x28(%esp),%eax
     8048409:       8b 54 24 2c             mov    0x2c(%esp),%edx
     804840d:       89 04 24                mov    %eax,(%esp)
     8048410:       89 54 24 04             mov    %edx,0x4(%esp)
     8048414:       e8 17 00 00 00          call   8048430 <__divdi3>
     8048419:       89 44 24 18             mov    %eax,0x18(%esp)
     804841d:       89 54 24 1c             mov    %edx,0x1c(%esp)
     8048421:       8b 44 24 18             mov    0x18(%esp),%eax
     8048425:       c9                      leave
     8048426:       c3                      ret

Note 8048414: call 8048430 <__divdi3>.

我无法在我的项目中使用 gcc lib,而且它是多平台的。我希望不要全部写完__*适用于所有平台的功能(速度并不重要),但现在我有点困惑。

有人可以解释一下为什么会有__divdi3 (not __divti3) 生成的调用long long int(64位)除法?


在 x86 机器上,术语“字”通常意味着存在 16 位值。更普遍地说,在计算机科学领域,word可以表示几乎任意长度的值,10 或 12 位的字在嵌入式系统中并不罕见。

我相信您所使用的术语用于 Linux/Unix 系统只是为了操作系统级别上的统一,与您构建的目标平台无关。使用相同符号的示例可以在gdb,它使用w对于 32 位字和hw对于 16 位“半字”(在 x86 意义上)。

此外,该约定还可以轻松扩展到标准 IEEE-754 浮点数,并总结为以下几个要点

  • s- single(精度,字)用于四字节整数(int) / 浮动 (float)
  • d- 八字节整数的双精度(精度)(long or long long) / 浮动 (double)
  • t- 十个字节的整数(long long) / 浮动 (long double)

此命名约定用于所有算术内置函数,例如__divsi3, __divdi3, __divti3 or __mulsi3, __muldi3, __multi3... (和所有u- 未签名 - 变体)。可以找到完整的列表here http://www.mirbsd.org/htman/i386/manINFO/gccint.html#Libgcc.

在 32 位机器上对 64 位数字进行除法使用高级(且有点困难)算法。但是,您仍然可以使用在学校学到的算法原理。这是它的简单伪代码(看看这个答案 https://stackoverflow.com/a/18202791/948909关于大整数):

result = 0;
count = 0;
remainder = numerator;

while(highest_bit_of_divisor_not_set) {
    divisor = divisor << 1;
    count++;
}
while(remainder != 0) {
    if(remainder >= divisor) {
        remainder = remainder - divisor;
        result = result | (1 << count);
    }
    if(count == 0) {
        break;
    }
    divisor = divisor >> 1;
    count--;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gcc 在 x86 上使用 divdi3 除法进行 long long 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • gcc,我可以将 offsetof() 与指向成员的模板化指针一起使用吗?

    下面的代码在这里 https ideone com XnxAyw https ideone com XnxAyw 我得到的编译器错误是 prog cpp In member function size t list base
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • 使用 sprintf 而不是粘贴来折叠字符向量

    我大部分都用过paste or paste0对于我过去的粘贴任务 但我对它的速度非常着迷sprintf 但我觉得我缺乏一些基础知识 只是想知道是否还有一种方法可以将多元素字符向量折叠为长度为 1 的一个 paste使用它时会做collaps
  • Scala 和 :: 对象

    我一直在深入研究 Scala 到目前为止我非常喜欢它 我正在研究模式匹配和案例类 下面的内容让我有些困惑 我知道它的作用 但我想确切地了解发生了什么 var list List 2 3 4 1 list 如果到目前为止我的理解是正确的 那么
  • 什么会触发 viewDidLayoutSubviews 并寻找一个好的模式来初始化子视图框架

    我有一个与 Storyboard 中的自动布局相结合的应用程序 一些旧的纯代码视图没有自动布局 在我的 MainViewController 中 我尝试初始化子视图 例如 viewDidLayoutSubviews 和 viewWillAp
  • 在 Powershell 中使用 Soap 复杂类型来保持 Soap 服务热

    我正在编写一个 powershell 脚本 该脚本将每 10 分钟 ping 一次肥皂网络服务 以保持其热度和活力 从而提高性能 我们在 IIS 中尝试了多种技术 包括应用程序池空闲超时以及仅为 wsdl 生成 http 请求 但似乎我们必
  • 在 Linux 上,为什么析构函数在 C++ 中的全局变量的共享实例上运行两次?

    在 Linux 上 我有一些从定义全局变量的静态库生成的 C 代码 此全局变量的单个实例在引用其符号的两个共享库之间共享 当进程关闭并运行静态终止阶段时 我看到此共享实例上的析构函数运行了两次 大概每个库卸载一次 这个问题与我最近在这里看到
  • “:CFBundleIdentifier”,不存在:Macos 上的 React Native 0.58

    我正在关注 0 58 的 ReactNative 教程 我做了它所说的一切 但跑步后我崩溃了react native run ios 我见过这个极其相似所以问题 https stackoverflow com questions 37461
  • 如何为 imx6 交叉编译 QT 应用程序?

    如何为 Freescale Hummingboard imx6 arm 交叉编译 QT 应用程序 周围有一些指南 但我无法成功完成一个 以下 以及更多 指南在 configure 上给我一个编译错误http forum solid run
  • Julia 的 numpy.einsum 吗?

    我想知道如何在 Julia 中获得类似于 numpy einsum 的功能 具体来说 我有一个三阶张量 我希望将其乘以第二张量 矩阵 收缩两个维度以产生一阶张量 向量 目前 我正在使用 PyCall 以便可以使用 numpy einsum
  • Pandas DataFrame 的组合与子类

    我正在尝试在 Python 类中创建一个名为 tilt 的方法 该方法使用 Pandas 将 DataFrame 颠倒过来 但每当我在此类创建的实例上使用此 倾斜 方法时 我都会收到此错误 该对象没有属性 iloc import numpy
  • HTML5:使用控件在视频上放置画布

    我想在 HTML5 视频上画东西 为此 我尝试在 HTML5 视频元素上放置画布 但是 当我将画布放在视频元素上时 视频控件不起作用 由于画布获取所有鼠标悬停和单击事件 有没有办法将事件委托给视频控件或在其他地方显示控件 任何帮助 想法都会
  • Chromium 嵌入式框架 MP3 支持

    我已经下载了适用于 Windows 的 Chromium Embedded Framework r306 并构建了它 不幸的是 它显示它不支持 mp3 输出为空 当我尝试打开 mp3 文件时 无法播放该文件 ogg 可以播放 与此同时 谷歌
  • 从广播接收器 android 调用 AsyncTask

    所以目前我有一个 AsyncTask 类 当我单击按钮时 它会运行并将数据 POST 到我的服务器 效果很好 我现在想做的是处理用户未连接到互联网时发生的情况 所以我设置了这些类来在互联网连接时通知应用程序 以便数据可以自动发送到服务器 A
  • 使 C++ 应用程序可编写脚本

    我的程序中有几个如下所示的函数 void foo int x int y 现在我希望我的程序采用如下所示的字符串 foo 3 5 并执行相应的函数 实现这个最直接的方法是什么 当我说简单时 我的意思是合理的可扩展性和优雅性 但编写代码不应该
  • 如何在 WooCommerce 中获取最畅销的产品类别 ID?

    我正在寻找显示 6 个最畅销产品类别的方法 这就是我现在得到的 termsprent get terms array taxonomy gt product cat hide empty gt true numberposts gt 4 m
  • 有没有办法在编辑 UITableView 时隐藏“-”(删除)按钮

    在我的 iPhone 应用程序上 我有一个处于编辑模式的 UITableView 其中仅允许用户对行重新排序 不授予删除权限 那么有什么方法可以从 TableView 中隐藏 红色按钮 请告诉我 Thanks 这是我的完整解决方案 没有单元
  • Android 开发:计算 textChanged 上的 EditText 行数?

    如何计算 EditText 中的行数 基本上在我的应用程序中 我有行号 我想让它们在 textchange 上更新 我已经设置了 textchangelistener 这可能吗 谢谢 亚历克斯 线路可以不同 可见行 换行文本算作新行 列表项
  • 如何使用现代 NodeJS 动态选择模块?

    我在用node experimental modules test mjs NodeJs v11 9 0 实现同一个类有很多选项 我需要通过终端进行切换 switch process argv 2 case a import MyClass
  • CSS:多列、多页布局,就像一本打开的书

    是否可以使用 HTML 和 CSS 创建一个两列 多页面布局 如该模型所示 其中内容自动从 1 2 3 4 流动 我正在构建一个电子书阅读器 编写器 本质上 布局类似于 Word 或 Pages 等桌面文字处理应用程序的布局 彼此相邻的两页
  • 你可以组合两个 tkinter tk 小部件吗?

    我正在创建一个应用程序 它将有两个 Tk 小部件 是否可以将它们并排组合成一个更大的小部件 以使应用程序更易于使用 from tkinter import tk Tk canvas Canvas tk width 400 height 15
  • gcc 在 x86 上使用 divdi3 除法进行 long long

    When gcc看到硬件不支持的整数类型的乘法或除法 它会生成对特殊库函数的调用 http gcc gnu org onlinedocs gccint Integer library routines html Integer librar