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)
让编译器选择寄存器,使用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 %表示该操作数和下一个操作数可以通勤.