64位类型和操作是如何在32位架构的最低层实现的?

2023-12-23

像 int64_t 这样的类型如何在最低(即汇编级别)上实现?我使用的是 32 位机器,但仍然可以使用 int64_t 例如。我最初的假设是 64 位只是模拟的,因此在 32 位机器上与 32 位数据类型相比,这些类型的计算必须有相当多的开销。

预先感谢您并致以问候


你是对的,当你为 32 位架构编译代码时,你必须模拟 64 位操作数和使用 32 位操作数的操作。

8 字节变量 (uint64_t这只是一个 typedeflong long) 存储在 2 个 4 字节寄存器中。

对于加(和减),您必须首先添加低 4 个字节,然后执行第二次加带进位(或减去借用) 在高 4 个字节上。由于第二次加法还加上了第一次加法的进位,因此结果是正确的。加减法的开销并不大。

然而,对于乘法和除法来说,事情就没那么简单了。通常会调用一个例程来执行此类操作,并且开销要大得多。


让我们看一下这个简单的 C 代码:

int main() {
  long long a = 0x0102030405060708;
  long long b = 0xA1A2A3A4A5A6A7A8;
  long long c = 0xB1B2B3B4B5B6B7B8;

  c = a + b;
  c = a - b;
  c = a * b;
  c = a / b;

  return 0;
}

分析MSVC生成的程序集我们可以看到:


     2:   long long a = 0x0102030405060708;
012D13DE  mov         dword ptr [a],5060708h  
012D13E5  mov         dword ptr [ebp-8],1020304h  
     3:   long long b = 0xA1A2A3A4A5A6A7A8;
012D13EC  mov         dword ptr [b],0A5A6A7A8h  
012D13F3  mov         dword ptr [ebp-18h],0A1A2A3A4h  
     4:   long long c = 0xB1B2B3B4B5B6B7B8;
012D13FA  mov         dword ptr [c],0B5B6B7B8h  
012D1401  mov         dword ptr [ebp-28h],0B1B2B3B4h  

64 位变量分为 2 个 32 位位置。


     6:   c = a + b;
012D1408  mov         eax,dword ptr [a]  
012D140B  add         eax,dword ptr [b]  
012D140E  mov         ecx,dword ptr [ebp-8]  
012D1411  adc         ecx,dword ptr [ebp-18h]  
012D1414  mov         dword ptr [c],eax  
012D1417  mov         dword ptr [ebp-28h],ecx  
     7:   c = a - b;
012D141A  mov         eax,dword ptr [a]  
012D141D  sub         eax,dword ptr [b]  
012D1420  mov         ecx,dword ptr [ebp-8]  
012D1423  sbb         ecx,dword ptr [ebp-18h]  
012D1426  mov         dword ptr [c],eax  
012D1429  mov         dword ptr [ebp-28h],ecx  

求和是用add低 32 位指令,然后用adc(带进位相加)为高 32 位。减法类似:第二个运算是sbb(借位减法)。


     8:   c = a * b;
012D142C  mov         eax,dword ptr [ebp-18h]  
012D142F  push        eax  
012D1430  mov         ecx,dword ptr [b]  
012D1433  push        ecx  
012D1434  mov         edx,dword ptr [ebp-8]  
012D1437  push        edx  
012D1438  mov         eax,dword ptr [a]  
012D143B  push        eax  
012D143C  call        __allmul (012D105Ah)  
012D1441  mov         dword ptr [c],eax  
012D1444  mov         dword ptr [ebp-28h],edx  
     9:   c = a / b;
012D1447  mov         eax,dword ptr [ebp-18h]  
012D144A  push        eax  
012D144B  mov         ecx,dword ptr [b]  
012D144E  push        ecx  
012D144F  mov         edx,dword ptr [ebp-8]  
012D1452  push        edx  
012D1453  mov         eax,dword ptr [a]  
012D1456  push        eax  
012D1457  call        __alldiv (012D1078h)  
012D145C  mov         dword ptr [c],eax  
012D145F  mov         dword ptr [ebp-28h],edx  

乘法和除法是通过调用特殊例程来执行的。

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

64位类型和操作是如何在32位架构的最低层实现的? 的相关文章

  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 按成员序列化

    我已经实现了template
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 是否可以在 .NET Core 中将 gRPC 与 HTTP/1.1 结合使用?

    我有两个网络服务 gRPC 客户端和 gRPC 服务器 服务器是用 NET Core编写的 然而 客户端是托管在 IIS 8 5 上的 NET Framework 4 7 2 Web 应用程序 所以它只支持HTTP 1 1 https le
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 使用Vue按秒计数

    我正在创建一个小型计时器 Vue 组件 用户需要能够启动和停止该计时器 到目前为止 这是我的组件
  • Webpack 加载器别名?

    我有一个相当复杂的样式表加载程序设置 test scss loader ExtractTextPlugin extract style css sourceMap localIdentName path name local hash ba
  • 从字符串中提取单个单词C++

    我正在尝试制作一个 C 程序来接收用户输入 并提取字符串中的各个单词 例如 Hello to Bob 将得到 Hello to Bob 最终 我会将它们推入字符串向量中 这是我在设计代码时尝试使用的格式 string libraries a
  • DockerFile来运行java程序

    您好 我是 Docker 新手 正在尝试从头开始编写新镜像 我正在编写这个 dockerFile 来编译并运行同一目录中可用的简单 java 程序 这是 dockerfile FROM scratch CMD javac HelloWorl
  • 在 iOS 上,为什么设置图层的 sublayerTransform 会使其自身表现得像 CATransformLayer 一样?

    据了解 zPosition层数仅决定哪一层覆盖哪一层 无论是一个zPosition10 或 1000 不会影响其位置 也就是说 除非我们use CATransformLayer包含这些层 https developer apple com
  • 移动网站的 Javascript 输入按键事件替代方案

    我的网站中有一个快速反馈小部件 它只有一个文本框 当用户按下 Enter 键时 将使用 ajax 自动发送反馈 但这在android j2me等移动设备上不起作用 有没有可以在桌面和移动设备上同时使用的替代方案 添加提交按钮对我来说是不可接
  • 如何在 SWT 中使用鼠标滚轮滚动滚动复合材料

    我想知道是否可以滚动ScrolledComposite使用鼠标滚轮 默认情况下它不工作 显然 有必要为您的组合创建鼠标滚轮侦听器 您可以使用这样的东西作为基础 scrolledComposite new ScrolledComposite
  • 在循环中迭代数据帧行[重复]

    这个问题在这里已经有答案了 我的数据框中包含多行链接 df pd DataFrame 我需要一次迭代数据帧中的链接行 以便我可以分别对每个链接执行 selenium 任务 它应该循环遍历这些行 直到数据帧中不再有行 links 0 http
  • 是否有一个 .Net 类可以执行 ManualResetEvent.PulseAll() 会执行的操作(如果存在)?

    是否有 Net 类可以做什么ManualResetEvent PulseAll 会做 如果存在的话 我需要自动释放一组正在等待同一信号的线程 对于我的预期用途 我并不担心 线程踩踏 您不能使用ManualResetEvent去做这个 例如
  • 如何为 Ironpython27 安装 numpy 和 scipy?

    我认为这是以前最流行的方法 https pytools codeplex com wikipage title NumPy 20and 20SciPy 20for 20 Net https pytools codeplex com wiki
  • echoscu 中调用 AE 标题无法识别错误

    我试图测试 dcmqrscp 的连接性 我使用以下命令来启动 dcmqrscp dcmqrscp config C Dicom config dcmqrscp cfg 请找到我使用的以下配置文件 NetworkTCPPort 11113 M
  • IE11 中的 Angular 4 错误

    我的 Angular 4 项目可以在 Chrome 上成功运行 但是它不会在 IE11 上加载 并在 polyfills bundle js 中出现以下错误 我使用命令 ng build env prod 来构建网站 var exports
  • 如何使用 jQuery 选择空输入 (value="")

    如何检查 required 在一个部分中输入字段 然后使用 jQuery 在事件中向它们添加一个类 到目前为止 我已经尝试过 jQuery sender container input required val addClass error
  • 了解 Scrapy 中的回调

    我是 Python 和 Scrapy 的新手 我以前没有使用过回调函数 但是 我现在执行以下代码 第一个请求将被执行 其响应将被发送到定义为第二个参数的回调函数 def parse page1 self response item MyIt
  • 无限递归别名“cd”

    我想记录一下我最近的状态cd跨越我的任何一台终端 我认为一个好方法是编写一个简单的 bash 脚本包装cd bin bash cd 1 echo pwd gt tmp cwd 既然我想要cd要发生在我的终端进程中 我需要运行脚本 bette
  • 使用 SendMessage 拖放

    这听起来很有趣 只是一个小实验 我想使用发送消息模拟文件在应用程序 窗口上的拖放 是否可以 我没有该应用程序的代码 但有可执行文件的代码 该应用程序是IP 信使 http www ipmsg org index html en 我想做的是使
  • 如何快速修复导航栏的透明度?

    我有透明的导航栏 带有用于视图控制器的背景图像 但是当我向导航栏添加栏按钮项目时 它变得像第二张图片中那样 如何让栏按钮项目也完全透明的导航栏 我使用下面的这些代码使导航栏透明 extension UINavigationControlle
  • IntelliJ 的选择字体对话框中没有出现字体

    我用这个安装了 Monaco 字体code https gist github com rogerleite 99819 然而 它并没有出现在Setting gt Editor gt Color and fonts gt Font 我应该怎
  • 如何在Windows Azure中使用子域?

    我目前已将 domain com 分配给我的 azure 网站 但我想知道使用子域需要什么 我想我需要在 godaddy 创建一个 CNAME 但我要指出什么呢 每个子域如何指向我的解决方案中的每个文件夹 为此我需要网络角色吗 我不知道如何
  • 64位类型和操作是如何在32位架构的最低层实现的?

    像 int64 t 这样的类型如何在最低 即汇编级别 上实现 我使用的是 32 位机器 但仍然可以使用 int64 t 例如 我最初的假设是 64 位只是模拟的 因此在 32 位机器上与 32 位数据类型相比 这些类型的计算必须有相当多的开