首页 > 解决方案 > 为什么我不能在内联 asm 中使用两个以上的寄存器?

问题描述

我试图在我的代码的一部分中使用汇编,但我需要使用多个变量。为什么我不能为 C 变量使用两个以上的寄存器?

__asm(
"add %eex, %edx\n"
"add %eax, %ecx\n"
"mov 1 ,%0\n"
:"=r"(side)
:"a"(map.y));
:"e"(sdist.y)
:"d"(delta.y)
:"c"(step.y)
);

当我编译这个时,我得到了错误

a.c: In function ‘main’:
a.c:289:2: error: expected expression before ‘:’ token
  :"e"(sdist.y)
  ^
a.c:292:1: error: expected statement before ‘)’ token
  );

标签: cassemblycpu-registers

解决方案


对于那个特定的错误,);应该是你拥有它的地方(我在下面指出的地方)。

__asm(
"add %eex, %edx\n"
"add %eax, %ecx\n"
"mov 1 ,%0\n"
:"=r"(side)
:"a"(map.y));    <---
:"e"(sdist.y)
:"d"(delta.y)
:"c"(step.y)
);

它关闭了整个asm语句,这也是在你的最后一行完成的。猜测一下,我会说您只是添加了三个额外的寄存器e,dc,以及新的结束行,但没有先调整原始结束行 (register a)。

不管你为什么这样做,结果都是:"e"(sdist.y)回到C地,因此无效。


即使您已经解决了该直接问题,您的代码中仍有许多其他错误,例如(可能不是详尽的列表):

  • 多个输入操作数应以逗号分隔;
  • 1是绝对地址 1 - 您可能打算$1为立即值或%1操作数写入;
  • x86的e约束是适合 32 位符号扩展的立即数,并且没有eex寄存器;
  • 这会破坏只读输入操作数(如edxand )中的值ecx,从而违反约束。

推荐阅读