2017-08-31 168 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'選項進行編譯。 –