2017-08-31 188 views
0

我试图交换使用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的内存引用太多。

我该如何解决这个问题?

+2

可能重复[asm in C“太多内存引用为'mov'”](https://stackoverflow.com/questions/15035379/asm-in-c-too-many -memory-references-for-mov) –

+0

您可以在x86上使用'XCHG'指令进行交换。 –

+1

似乎有人在这个SO问题上有相同的任务。 https://stackoverflow.com/q/45910530/3857942。你不能以你可靠(或者完全可以)的方式使用变量名。您必须使用扩展内联通过约束传递参数。对于其他SO问题的答案应该让你知道为什么你应该避免GNU内联汇编,除非你知道你在做什么。如果使用AT&T语法,则与英特尔语法相比,操作数相反。 –

回答

0

不知道它是否重要。但在我的记忆中,您需要在登记电话前加%,以便让翻译人员了解您所说的登记。 Like mov %esp, %ebp

试试吧,但不是100%肯定会解决它。 asm in C "too many memory references for `mov'"指的是这个职位

+0

我已经尝试过,但它给出了错误:/ usr/bin/ld:跳过不兼容的/ usr/lib/gcc/x86_64-linux-gnu/5/libgcc.a当搜索-lgcc时 /usr/bin/ld:找不到-lgcc –

+0

@WendiZhang那是正确的更正,那现在是另一个问题。 –

+0

@WendiZhang:如果您在没有gcc-multilib软件包的64位linux上进行编译,您会得到该错误。如果你在Ubuntu上(或者基于ubuntu的发行版),你可以试试'sudo apt install gcc-multilib'或在Debian上安装gcc-multilib'。然后使用'gcc'和'-m32'选项进行编译。 –