如何使用GCC在C中编写以下内联汇编代码

Cod*_*per 2 c x86 assembly gcc inline-assembly

我正在阅读这里的一些答案和问题,并不断提出这个建议,但我注意到没有人真正解释过你需要做什么,在Windows上使用英特尔和GCC编译器.下面评论正是我想要做的.

#include <stdio.h>

int main()
{
    int x = 1;
    int y = 2;
    //assembly code begin
    /*
      push x into stack; < Need Help
      x=y;               < With This
      pop stack into y;  < Please
    */
    //assembly code end
    printf("x=%d,y=%d",x,y);
    getchar();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Bre*_*ale 6

让编译器选择寄存器,使用k前缀表示该int类型的32位寄存器(因此它在x86-64上按预期工作):

__asm__ ("pushl %k0\n\t"
         "movl %k1, %k0\n\t"
         "popl %k1"
         : "+r" (x), "+r" (y));
Run Code Online (Sandbox Code Playgroud)

在这种情况下,指定任何被破坏的操作数都没有必要(实际上是错误的).


显而易见的是x,y这里是可交换的,即交换操作数应该仍然产生相同的结果:: "+%r" (x), "+r" (y)where %表示该操作数和下一个操作数可以通勤.

  • 这是不正确的,允许编译器使用堆栈指针相对于y的内存位置,该位置通过推送更改堆栈指针而中断. (2认同)