【问题标题】:Inline-Assembly : bad register name内联汇编:错误的寄存器名称
【发布时间】:2014-05-30 11:06:06
【问题描述】:

编译时出现“错误:错误的寄存器名称 '%%ecx'”

#include <stdio.h>

int main(void){
    asm("mov 3, %%ecx\n\t");
    // ...
    return 0;
}

【问题讨论】:

  • 为什么使用两个百分号?另外,\n\t 有什么原因吗?这不是 printf 格式;这些不应该是必需的。
  • 什么编译器?内联汇编语法取决于编译器。
  • @Jongware 我在 Windows 64 位上使用 gcc
  • @キューゾリファイ 你绝对错了(大约%),你花的时间去尝试和观察会比你争论它花的时间少!关于\n\t,当您没有多条指令时,这是一种无害但没有帮助的情况。

标签: c gcc inline-assembly


【解决方案1】:

当您想使用 gcc 的“扩展内联汇编”时使用寄存器的双百分号,包括输入、输出和破坏列表。这是因为单百分号由内联汇编程序保留,用于根据这些列表和% 后面的数字替换实际操作数名称。

如果您不想使用“扩展”内联汇编,只需使用普通的 AT&T 语法即可。做这样的事情:

int main(void)
{
    asm("mov 3, %ecx\n\t");
    return 0;
}

与 gcc 4.6.3 完美配合。我还假设您知道mov 3, %ecxmov $3, %ecx 之间的区别。

【讨论】:

  • 其实我想创建一个循环int src = 1; int dst = 0; asm("mov $0x03, %ecx\n\trpt:\n\t\tnop\n\tloop rpt" : "=r" (dst) : "r" (src));,现在我得到operand number missing after %-letter
  • @キューゾリファイ 当您使用扩展格式asm()(和扩展格式)时,您必须在寄存器上使用%%,并且操作数上只有一个 %。阅读您之前评论过的链接!
  • 谢谢。对不起,我昨天晚上才开始。
猜你喜欢
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 1970-01-01
相关资源
最近更新 更多