【发布时间】:2017-08-31 04:15:48
【问题描述】:
(编者注:这是一个调试问题,关于这个尝试的实现有什么问题(几乎所有内容),因此不是 How to write a short block of inline gnu extended assembly to swap the values of two integer variables? 的重复,但是如果你想要一个工作示例,请参阅 Q&A 和 https://stackoverflow.com/tags/inline-assembly/info。)
我正在尝试使用 gnu 扩展程序集交换两个整数变量,这就是我现在所拥有的:
int main()
{
int a = 2;
int b = 1;
printf("a is %d, b is %d\n", a, b);
// TODO (student): swap a and b using inline assembly
printf("a is %d, b is %d\n", a, b);
asm ("mov ebx, b;"
"mov ecx, b;"
"mov c, ecx;"
"mov d, ebx;"
);
我收到错误消息:asmPractice.c:17: Error: too many memory references for mov。
我该如何解决这个问题?
【问题讨论】:
-
您可以在 x86 上使用
XCHG指令进行交换。 -
似乎有人在这个 SO 问题上做了同样的任务。 stackoverflow.com/q/45910530/3857942 。您不能以可靠(或根本)的方式使用变量名。您必须使用扩展内联通过约束传递参数。另一个 SO 问题的答案应该让您知道为什么应该避免使用 GNU 内联汇编,除非您知道自己在做什么。如果使用 AT&T 语法,则操作数与 Intel 语法相反。
-
@AnttiHaapala :它被标记为 GNU 和 C(以及 GNU 程序集),因此至少可以假设 GCC。组装说明建议的平台似乎是 x86。
-
@MichaelPetch 啊,这是真的。
标签: c gcc gnu inline-assembly