使用内联汇编在 C 中添加值

2023-11-27

我试图掌握 C 中内联汇编(ATT 汇编)的基础知识,所以我通过添加 2 个变量进行练习。

好的,这按预期工作;这src变量被复制到dst变量,然后是dst变量加 5。 的值src and dst分别为1和6。

int src = 1;
int dst = 0;

asm ("mov %[SRC], %[DEST]\n\t"
     "add $5, %0"
     : [DEST] "=r" (dst));
     : [SRC] "r" (src));

但是当我尝试这个时,值src and dst仍然是 1 和 6。我期待着src值为 1 且dst加上 5 后值为 5dst(由于 MOV 操作已被删除,因此其值为 0)应该具有输出 5。

int src = 1; int dst = 0;

 asm ("add $5, %[DEST]"
     : [DEST] "=r" (dst)
     : [SRC] "r" (src));

所以我然后尝试删除src使用以下代码作为输入操作数,但现在dst得到值 11。

int dst = 0;

     asm (
         "add $5, %[DEST]"
         : [DEST] "=r" (dst));

现在我有点困惑它是如何工作的。我有什么误解吗?


代码的第一部分按预期工作。那里

 mov %[SRC], %[DEST]        ; copies %[SRC] into %[DEST], which is now 1
 add $5, %0                 ; adds 5 to %0 (which is %[DEST]), so that's 6

第二部分不起作用,因为你从不使用%[SRC],并且因为%[DEST]不是输入操作数,因此其值不参与计算。您只需获取 gcc 决定使用的寄存器中的内容即可。第三部分也因同样的原因而失败。

为了使其工作,您需要指定dst作为输入和输出操作数,因为您既使用它的值又更改它。但是,这不起作用:

asm("add $5, %0"  // This does not work!
    : "=r" (dst)
    : "r" (dst));

因为现在你有一个输入操作数%1有价值dst和一个不同的输出操作数%0其值将被写入dst,而你从不使用%1。这个符号可以让你写

asm("mov %1, %0; add $5, %0"  // needlessly inefficient!
    : "=r" (dst)
    : "r" (dst));

但这当然是不必要的低效。为了使用单个寄存器来完成此操作,您需要使用匹配约束像这样:

asm("add $5, %0"
    : "=r" (dst)
    : "0" (dst));

这告诉海湾合作委员会%0作为输入操作数是允许的,并且它的值为dst. Here是 gcc 手册的相关部分。

最后,使用命名操作数,它看起来像这样:

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

使用内联汇编在 C 中添加值 的相关文章

随机推荐

  • 如何在SparkSQL中实现Like条件?

    如何编写 SQL 语句来达到目标 如下语句 SELECT FROM table t WHERE t a LIKE t b Thanks spark sql Column提供like方法 但目前 Spark 1 6 0 2 0 0 它仅适用于
  • 从文本文件中删除行?

    我有一个像这样的textfile txt First Line Second Line Third Line Fourth Line Fifth Line Sixth Line 如何去掉前三行和最后一行最舒服 with open textf
  • matplotlib 在 NaN 之后不继续行[重复]

    这个问题在这里已经有答案了 我有一个数组切片 array 1 0 2 0 3 0 None 4 0 None 5 0 None 6 0 None dtype object which when plotted looks like 如何让虚
  • 一种将 TD 置于 TR 中心的方法?

    我正在处理 HTML 电子邮件 并尝试将绿色 TD 放在白色 TR 中 以便在绿色框的左侧和右侧有 20 像素的白色边距 我尝试设置绿色部分的 TD 宽度并将边距设置为 0 auto 但绿色仅扩展到 TR 的宽度 尝试再放入 2 个 TD
  • 在 case 不起作用的情况下颤动多重

    是否可以根据多个文档 ID 获取价值 CollectionReference col1 Firestore instance collection service col1 where title isEqualTo Ac replacim
  • 支持向量机内核类型

    支持向量机中常用的核函数是线性 径向基函数和多项式 有人可以用简单的方式解释一下这个内核函数是什么吗 由于我是这个领域的新手 我不清楚这些内核类型的重要性是什么 让我们从头开始 支持向量机是一种线性模型 它总是寻找一个超平面来将一个类与另一
  • 如何使用SBT将一些文件复制到构建目标目录?

    如何复制一些源文件 例如 src main html html 到构建输出目录 例如 target scala 2 11 与 SBT 以便文件最终位于目标根并且不在classes子目录 如果我将源目录添加到 就会发生这种情况unmanage
  • 无法创建组件,因为它需要满足依赖关系

    我正在学习 DDD n Tier Repositories 等 有人向我推荐了 ASP NET Boilerplate 我决定使用它开始一个测试项目 我从未处理过依赖注入 所以这对我来说是全新的 但它使用 ius Castle Windso
  • Jquery next 找不到下一个 div?

    我有这个 HTML 结构 img width 25 height 25 src data apple logo jpg alt Chocolate
  • 在rails 4中重构大型routes.rb文件

    我正在将 Rails 3 应用程序升级到 Rails 4 0 1 在我的 Rails 3 应用程序中 我的目录中有以下代码application rb使用多个路由文件 config paths config routes Dir Rails
  • Mysql:将日期从“dd/mm/yyyy”转换为“yyyymmdd”

    我正在开发一个数据库 该数据库将日期存储在varchar 10 mysql 字段 太悲伤了 我无法更改数据库结构 我正在构建一个小插件 但我必须查询数据库 查找该数据字段在接下来的 10 天内的行 Example fid fdate 1 1
  • 基于应用程序变体的构建配置(BuildType + Flavor)

    我正在尝试设置signingConfig manifestPlaceholders buildConfigField对于应用程序变体 我可以为每个构建类型设置它们or ProductFlavor 独立 但我需要的是根据两个 ProductF
  • JS/jQuery 图像编辑器

    有没有人偶然发现用纯 JS 或 jQuery 完成的图像编辑器 就像 CKEditor 那样 我正在寻找一段代码 为图像添加句柄 以便您可以根据需要调整其大小 甚至拖动图像 谢谢 Edit 改写了 这是很棒的图像裁剪 调整大小 JQuery
  • 如何对Spark Structured Streaming进行单元测试?

    我想了解 Spark 结构化流的单元测试方面 我的场景是 我从 Kafka 获取数据 并使用 Spark 结构化流处理并在数据之上应用一些转换来使用它 我不确定如何使用 Scala 和 Spark 对此进行测试 有人可以告诉我如何使用 Sc
  • 如何将 Monad 实例定义为具有多个值的类型?

    我所说的多个值的意思是这样的 data Foo a Bar a Baz a a 我想不出一个明确的方法来定义 gt gt for Baz instance Monad Foo where Bar x gt gt f f x Great th
  • 如何在单击第 3 方按钮时设置断点?

    我正在尝试调试第 3 方小部件 1按钮准确地说 具体来说 我想在 Chrome 中设置一个断点 当单击小部件中的按钮时该断点会停止 我想打破处理的第 3 方代码click事件 是否有 Chrome 扩展 或其他我没有想到的东西 来帮助我在代
  • 为什么 System.Convert 有接受 DateTime 的 ToDateTime?

    Summary Returns the specified System DateTime object no actual conversion is performed Parameters value A date and time
  • Codeigniter 2.1 - 插入批次后返回 ids

    如何返回 insert bunch 之后的所有 ID 功能 public function insert slike id slike folder polje tabela slike explode slike i 1 data arr
  • Mathematica 中的错误:正则表达式应用于很长的字符串

    在下面的代码中 如果字符串 s 附加到大约 10 或 20 000 个字符 Mathematica 内核段错误 s This is the first line MAGIC STRING Everything after this line
  • 使用内联汇编在 C 中添加值

    我试图掌握 C 中内联汇编 ATT 汇编 的基础知识 所以我通过添加 2 个变量进行练习 好的 这按预期工作 这src变量被复制到dst变量 然后是dst变量加 5 的值src and dst分别为1和6 int src 1 int dst