gpt4 book ai didi

c - 为什么我不能在内联汇编中使用两个以上的寄存器?

转载 作者:行者123 更新时间:2023-11-30 18:27:06 27 4
gpt4 key购买 nike

我正在尝试在代码的一部分中使用汇编,但我需要使用多个变量。为什么我不能使用两个以上的寄存器来存储 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
);

最佳答案

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

__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 ,以及新的结束线,但无需首先调整原始结束线(寄存器 a )。

无论您为什么这样做,结果都是 :"e"(sdist.y)返回C地,因此无效。

<小时/>

即使您解决了直接问题,您的代码中仍然存在许多其他错误,例如(可能不是一个详尽列表):

  • 多个输入操作数应以逗号分隔;
  • 1是绝对地址 1 - 你可能想写 $1对于立即值,或 %1对于操作数;
  • e x86 的约束是适合 32 位符号扩展的立即数,并且没有 eex注册;
  • 这会破坏只读输入操作数中的值,例如 edxecx ,违反约束。

关于c - 为什么我不能在内联汇编中使用两个以上的寄存器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59637079/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com