内联汇编的“现实”用途有哪些? [复制]

2023-12-06

有什么是我们可以在汇编中做但在原始 C 中不能做的吗?或者有什么在组装中更容易做的事情吗?是否有任何现代代码实际上是使用内联汇编编写的,或者它只是作为遗留或教育功能实现?


内联汇编(以及相关说明,调用纯粹用汇编语言编写的外部函数)可能非常有用或绝对必要,原因包括编写设备驱动程序、直接访问语言中未定义的硬件或处理器功能、硬件支持的并行处理(相对于多线程)例如 CUDA、与 FPGA 的接口、性能等。

它也很重要,因为有些事情只有在标准(C++ 和 C)提供的抽象级别“之下”才可能实现。

标准认识到有些事情本质上是由实现定义的,并在整个标准中允许这一点。这些津贴之一(也许是最低级别)是承认asm。嗯,“有点”认可:

在 C (N1256) 中,可以在标准的“通用扩展”下找到它:

J.5.10 asm 关键字
1 asm 关键字可用于将汇编语言直接插入到翻译器输出中 (6.8)。最常见的实现是通过以下形式的语句:

asm(字符串文字);

在 C++ (N3337) 中,它有类似的警告:

§7.4/1
asm 声明的形式为

asm 定义:

asm ( 字符串文字 ) ;

asm 声明是有条件支持的;它的含义是由实现定义的。 [ 注意:通常它用于通过实现将信息传递给汇编器。 ——尾注]

应该指出的是,近年来的一个重要发展是,尝试通过使用内联汇编来提高性能通常会适得其反,除非您知道exactly你在做什么。编译器/优化器寄存器使用决策、管道意识和分支预测行为等对于大多数用途来说几乎总是足够的。

另一方面,近年来的处理器增加了对更高级别操作的CPU级别支持(例如Intel的AES扩展),可以将专门应用程序的性能提高几个数量级。

So:

遗留功能?一点也不。对于某些要求来说这是绝对必要的。

教育特色?在理想的世界中,只有伴随一系列讲座来解释为什么您可能永远不需要它,以及如果您确实需要它,如何尽可能地将其可见表面积限制在应用程序的其余部分。

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

内联汇编的“现实”用途有哪些? [复制] 的相关文章

随机推荐

  • 我无法获取 HTML 页面的完整源代码

    使用Python 我想抓取一个网页上的数据 该网页的来源非常大 它是某个用户的Facebook页面 假设该 URL 是我要抓取的 URL 我运行以下代码 import urllib2 usock urllib2 urlopen url da
  • UITableViewCell 自定义类 - 子视图高度约束更改后重新加载单元格高度

    我有一个自定义按钮UITableViewCell班级 它显示 隐藏视图 同一单元格的一部分 这样做时单元格的高度应该改变 这是按钮操作 在UITableViewCell自定义类 IBAction func showHideCartView
  • 如何在kivy Pong球游戏中从另一个类调用一个类的函数

    我正在使用教程中给出的 PongGame 代码练习 Kivy 我想知道如何从新创建的类 PongSample 中调用 PongGame 类中的函数 serve ball2 在下面的代码中 我创建了一个 PongSample 类 以便在第一个
  • 线程“main”中出现异常 java.lang.IllegalStateException:在 Ubuntu 上运行 Selenium Test 时驱动程序可执行文件不存在

    我在 eclipse 中尝试过这段代码 import org openqa selenium WebDriver import org openqa selenium firefox FirefoxDriver public class a
  • 安装 .NET Core RTM 后缺少 Microsoft.DotNet.Web.targets

    我们正在将您的项目迁移到 NET Core 我正在按照本页上提供的步骤升级您的构建服务器https www microsoft com net core windows 安装 VS 2015 update 3 和 DotNetCore 1
  • 如何自动化 hg bisect --extend 以遵循共同祖先?

    通常 在一个hg bisect c my command 我收到通知说我应该跑步hg bisect extend
  • 抓取Facebook生活事件

    我一直在寻找一种方法从图形 API 中提取朋友最近的生活事件 但我遇到了位置拦截器 我知道你可以向朋友查询他们的位置 但是是否有可能找到以前的位置历史记录 或者只是一般历史记录 如果某人在工作中获得晋升 因此他们改变了角色 请原谅缺少代码
  • 在 C++ 中使用回调会增加耦合吗? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 Q1 为什么使用回调函数 Q2 回调是邪恶的吗 对那些人来说很有趣 谁知道 对其他人来说是一场噩梦 Q3 除了回调还有其他选择吗 回调减少了耦合 被调用方被传递了一些指针 但它不
  • Rails 在多个实例/服务器上重新加载动态路由

    我们如何强制 Rails 在多个服务器 实例上重新加载路由 我们在 Google App Engine 中拥有一个在 5 个以上实例上运行的多租户平台 我们希望所有站点都能从后端定义自己的一组路由 每当我们有一个新站点时 我们目前都必须重新
  • Android canvas - 画一个洞

    在Android中用canvas可以实现如下图吗 我想要一个洞 而不仅仅是在黄色的红色层上有一个圆圈 我用我的以下代码尝试了这个 但失败了 onDraw Method canvas drawBitmap yellow 0 0 paint c
  • 为什么EF Core没有设置自定义注解?

    在 DbContext 中我声明模型如下 modelBuilder Entity
  • SQL Server XACT_ABORT 排除

    我有一个更大的存储过程 它利用多个 TRY CATCH 块来捕获并记录各个错误 我还在过程的整个内容周围封装了一个事务 以便能够在沿途某个地方发生错误时回滚整个过程 以防止大量混乱的清理 XACT ABORT 已启用 否则它不会回滚整个事务
  • 将字符串分割成一定大小的块

    假设我有一个字符串 string str 1111222233334444 我怎样才能把这个字符串分成一定大小的块 例如 将其分解为 4 的大小将返回字符串 1111 2222 3333 4444 static IEnumerable
  • React-Table 的导入问题

    我正在使用react table库在react中创建一个表 几天前 我使用同一个库创建了一个表 没有遇到任何问题 但今天我收到以下错误 尝试导入错误 react table 不包含默认导出 导入为 ReactTable 进口声明 从 反应表
  • C# 中带有布尔条件的三元

    如果我要编写这段代码 它可以与正常的 if else 布局一起正常工作 if isOn i 10 else i 20 虽然我不确定如何使用三元运算符进行转换 isOn true i 1 i 0 错误 无法确定条件表达式的类型 因为 void
  • 如何覆盖默认的 Liferay 登录身份验证?

    我正在使用 Liferay 6 1 我想覆盖默认的 Liferay 登录身份验证并希望设置我的自定义身份验证 到目前为止 我所做的是 我创建了一个钩子插件 并在 Portal properties 文件中设置了以下属性 auth pipel
  • 将 MSBuild PublishProfile 与 Visual Studio 2012 结合使用时,MSDeploy 跳过规则

    我正在尝试使用 WebDeploy 通过自定义 MSDeploy 跳过规则和 Visual Studio 2012 中保存的发布配置文件来发布网站 我可以从命令行使用发布配置文件 但跳过删除文件夹的跳过规则不起作用 我有一个ErrorLog
  • 具有相同密钥的多个条目:24.0.0 rc4=24.0.0 rc4

    将 Android Studio 升级到 2 2 3 后 显示错误 IllegalArgumentException 具有相同密钥的多个条目 24 0 0 rc4 24 0 0 rc4 和 24 0 0 rc4 24 0 0 rc4 最近更
  • 从 VS Code 在终端中运行文件

    是否有任何 VS Code 快捷方式可以让您在 Windows 终端中运行文件 而无需将文件的路径直接写入终端 提前致谢 Try key ctrl shift t command workbench action terminal send
  • 内联汇编的“现实”用途有哪些? [复制]

    这个问题在这里已经有答案了 有什么是我们可以在汇编中做但在原始 C 中不能做的吗 或者有什么在组装中更容易做的事情吗 是否有任何现代代码实际上是使用内联汇编编写的 或者它只是作为遗留或教育功能实现 内联汇编 以及相关说明 调用纯粹用汇编语言