C 为什么可以';在内联asm中我是否使用了两个以上的寄存器?
我试图在代码的一部分中使用汇编,但我需要使用多个变量。为什么不能对C变量使用两个以上的寄存器C 为什么可以';在内联asm中我是否使用了两个以上的寄存器?,c,assembly,cpu-registers,C,Assembly,Cpu Registers,我试图在代码的一部分中使用汇编,但我需要使用多个变量。为什么不能对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 expres
__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
);
对于该特定错误,)代码>不应该在您拥有它的地方(我在下面指出的地方)
\u asm(
添加%eex,%edx\n
添加%eax,%ecx\n
mov 1,%0\n
:“=r”(侧面)
:“a”(地图y));可能是这一行后面的分号或额外的意合<代码>:“a”(map.y))代码>就是)
应该在那里,就在编译器标记错误的地方?请注意,没有EEX寄存器,“e”约束并不表示寄存器操作数。这在很多其他方面都是超级坏的,包括语法(多个输入操作数应该用逗号分隔),1
是绝对地址1
;也许您是指$1
立即数或%1
操作数?另外,x86的“e”
约束是一个适合32位符号扩展的立即数;没有eex
寄存器。您的其他输入约束都是特定寄存器。还有,这会破坏只读输入操作数(如EDX和ECX)中的值,从而违反约束。TL:DR:请参阅指南和教程的链接。在GNU C内联asm中,将代码扔到墙上直到粘在一起比通常更糟糕:很容易(如果您的约束条件有细微的错误)使代码恰好与周围的一组代码一起正常工作,但由于不同的优化选项或对其他代码的微小更改而中断。在签下一段内联asm之前,请确保您完全了解每件事的功能,以及为什么它是安全的。或者不要用它,它还是一样的error@Russell356:正如我在问题下所评论的,您的代码中塞满了其他主要错误,包括语法错误。@Peter,所有的要点都很好,我希望您不要介意我将它们作为附录纳入了答案中(因为它使它更加有用)。是的,这让我投了一票:)这个信息绝对属于答案。
__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)
);