Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么可以';在内联asm中我是否使用了两个以上的寄存器?_C_Assembly_Cpu Registers - Fatal编程技术网

C 为什么可以';在内联asm中我是否使用了两个以上的寄存器?

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

我试图在代码的一部分中使用汇编,但我需要使用多个变量。为什么不能对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
  );
对于该特定错误,
不应该在您拥有它的地方(我在下面指出的地方)

\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)
);