我在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;
}
}
}
我在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;
}
}
}
有一些工具可以自動生成可見的彙編代碼爲你(例如作爲使用-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對於可視化您的特定功能的翻譯非常有幫助。
希望這會有所幫助!
另請參閱http://stackoverflow.com/tags/x86/info for x86 asm指南/學習資源。 –
任何幫助傢伙請 – Bibo
試試這個工具= http://assembly.ynh.io/。順便說一句,我沒有在你的函數中看到任何返回值,修復它並更新你的問題(我想你應該返回「gcd」局部變量)。 –
有兩種方法可以解決Visual Studio中的問題:內聯彙編,並將彙編代碼移動到外部文件。第一個不需要堆棧,第二個爲了傳遞參數。你喜歡哪一個? –