2015-06-09 157 views
0

我在C++ Visual Studio中的GCD的功能,我想將其轉換成彙編language.Here的功能:C++代碼轉換成彙編

int GCD(int a, int b) 
{ 
    int gcd; 
    for(int i=1;i<=a&&i<=b;i++) 
    { 
     if(a%i==0 && b%i == 0) 
     { 
      gcd=i; 
     } 
    } 
} 
+0

任何幫助傢伙請 – Bibo

+1

試試這個工具= http://assembly.ynh.io/。順便說一句,我沒有在你的函數中看到任何返回值,修復它並更新你的問題(我想你應該返回「gcd」局部變量)。 –

+0

有兩種方法可以解決Visual Studio中的問題:內聯彙編,並將彙編代碼移動到外部文件。第一個不需要堆棧,第二個爲了傳遞參數。你喜歡哪一個? –

回答

2

有一些工具可以自動生成可見的彙編代碼爲你(例如作爲使用-S-masm=intel標誌與gcc/g++編譯器),但如果你想你的代碼手動轉換到集會的學習鍛鍊,這裏是什麼讓你開始:

瞭解調用堆棧

在調用GCD函數之前,調用堆棧看起來像this。 ESP是堆棧指針。它跟蹤調用堆棧的頂部,並在堆棧中推送和彈出元素時更改位置。 EBP是基指針。它被用作一個相對引用,用於以一定的偏移量引用堆棧上方或下方存儲的變量。

作爲程序員,您有責任遵循其他程序員建立的調用約定。這個調用約定要求你在函數的開始部分設置調用堆棧,這樣你就不會弄亂它周圍的任何東西。這是用匯編代碼的以下各行完成:

GCD: 
; make new call frame 
    push ebp 
    mov  ebp, esp 
     ... 

第一行通過將其推到堆棧的頂部和所述第二線保存先前的EBP值更新EBP指向堆棧的頂部它剛剛救了。您在GCD函數中聲明的任何局部變量都將放置在這個新堆棧的頂部。假設您返回gcd變量作爲結果,它將被放置在上一個EBP之上的堆棧頂部。

調用約定的其餘部分要求您清理已修改的堆棧幀。這是在你的函數結束與下面的代碼行完成(相當於leave指令):

 ... 
; cleanup call frame 
    mov  esp, ebp 
    pop  ebp 

轉換函數體

一旦你有你的電話堆棧設置正確,你可以開始翻譯功能體。這通常需要一些技巧,並且需要一段時間才能完成像您這樣的小功能,因此我只需發佈之前完成的solution for a similar exercise。您可以繪製比較來幫助您翻譯,而且上面註釋中鏈接的assembly.ynh.io對於可視化您的特定功能的翻譯非常有幫助。

希望這會有所幫助!

+0

另請參閱http://stackoverflow.com/tags/x86/info for x86 asm指南/學習資源。 –