当前位置: 首页 > 知识库问答 >
问题:

“不一致的操作数约束”与使用GCC的内联ASM

盖昊东
2023-03-14

尝试使用gcc:https://github.com/wolf9466/cpuminer-multi/blob/master/cryptonight_aesni.c编译此源文件时遇到此错误

“CRYPTONIGT_AESNI.c:162:4:错误:操作数约束不一致”

      uint64_t hi, lo;
 // hi,lo = 64bit x 64bit multiply of c[0] and b[0]

  __asm__("mulq %3\n\t"
      : "=d" (hi),
        "=a" (lo)
      : "%a" (c[0]),
        "rm" (b[0])
      : "cc" );

共有1个答案

袁元明
2023-03-14

该代码中的指令mulq是一条x86 64位指令。所有的参数都是64位的值,不能放入32位的寄存器中(当为32位x86平台编译时)-- ·迈克尔·佩奇

 类似资料:
  • 我在函数中有以下代码: 现在我不知道为什么这不起作用。Gcc说:“错误:'asm'操作数有不可能的约束”我一直在学习Gcc内联汇编教程,我认为这是将参数从c代码带到内联汇编块的正确方法。 我还使用了为32位x86构建的gcc交叉编译器。

  • 问题内容: 我正在尝试使用编写约束。我已经尝试过这样的事情: 虽然我知道这行不通。在以上语法中,如何添加要检查的集合/列表? 问题答案: seqs是集合。

  • 我有两个组件和。每个组件都是由<code>ConstraintLayout</code>创建的。现在,我从上面的组件创建<code>WelcomeScreen</code>。 用例1:使用静态< code>ConstraintLayout(在< code>ConstraintLayout内的< code>ConstraintLayout) 结果:布局预览不显示任何内容 用例2:<代码>Welcom

  • 这里是一个虚拟的*z++=*x++**y++指令。请注意,x、y和z指针寄存器必须指定为输入/输出,因为asm会修改它们。 在第一个示例中,在输入操作数中列出和有什么意义?同一份文件指出: 特别是,如果不将输入操作数指定为输出操作数,就无法指定输入操作数被修改。

  • 这段代码是正确的,但不是最优的。MULQ是可交换的,因此如果恰好已经在RAX中,那么将保留在其所在的位置并进行乘法是正确的。但是GCC不知道这一点,所以它会发出额外的指令将操作数移到它们预定义的位置。我想告诉GCC,它可以将任何一个输入放在任何一个位置,只要一个输入最终在RAX中,并且MULQ引用了另一个位置。GCC对此有一个语法,称为“多重替代约束”。请注意逗号(但是整个asm()是断开的;请参

  • 问题内容: 首先,我创建了一个表,例如 然后在该表中插入值 MySQL没有显示错误,它接受了值。 问题答案: 如果您使用MySQL 8.0.15或更早版本,则MySQL参考手册会说: 该CHECK子句已解析,但所有存储引擎均将其忽略。 尝试触发… 希望能有所帮助。