使用内联汇编来交换两个整数变量

时间:2017-08-31 04:15:48

标签: c gcc gnu inline-assembly

(编者注:这是一个关于这次尝试实施的错误(几乎所有内容)的调试问题,因此不是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:错误:mov的内存引用太多。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

使用扩展的内联汇编语法,这是一种单行代码:

volatile int a = 1;
volatile int b = 2;

asm("" : "=r" (a), "=r" (b) : "0" (b), "1" (a) : );
//      ^^^^^^^^^^^^^^^^^^   ^^^^^^^^^^^^^^^^^
//           input               output

printf("a is %d, b is %d\n", a, b);

答案 1 :(得分:0)

不知道是否重要。但是在我记忆中,你需要在注册之前放置%,以便让翻译了解你所说的注册。 与mov %esp, %ebp

一样

尝试但不是100%肯定会解决它。 asm in C "too many memory references for `mov'"参考此帖

答案 2 :(得分:0)

尝试在注册前输入双精度%。