2012-05-25 89 views
2

我試圖將在Linux下編寫的C代碼(fedora 9)轉換爲程序集x86代碼,但是,我在Math.h函數中遇到了問題。該庫中的函數,如ceil,floor,log,log10,pow在程序集x86中未定義。你能幫我解決這個問題嗎?彙編x86中的Math.h庫函數?

謝謝。

+0

我解決了這個問題,通過在編譯代碼時向gcc添加-lm:gcc -lm -o executable_name file_name.s – hamb

回答

2

找出這些函數做什麼的最好方法是看看它們在glibc源代碼中的實現。它應該給你足夠清晰的見解。另一種方法是查看在/usr/lib/中發現的lm.so的反彙編。

+0

我對這個問題並不熟悉。你能解釋一下你的解決方案嗎? – hamb

+0

要了解math.h中的這些函數的作用,您需要查看庫(glibc)的源代碼,然後拆卸庫二進制文件(/usr/lib/libm.so)本身,然後讀取組裝來找出功能的確切行爲,以便您可以看到它們的工作方式。你可以使用帶'-d'標誌的objdump來反彙編文件。 – zxcdw

3

大多數庫函數都不會用匯編語言來定義,至少不是直接映射到ADD指令的加法運算符。如果你想在彙編中重新編寫庫,你必須使用處理器可用的任何功能來實現該功能。大多數庫函數都需要一個單獨的彙編語言子程序,而不僅僅是一個單獨的操作。解決這個問題的最簡單方法是讓單獨的庫子例程獨立工作,然後將它們合併到更大的程序中。

您可以編譯C代碼並檢查反彙編的輸出,但要注意編譯器優化,這可以使輸出難以讓人遵循。

請問這個任務背後的目的是什麼?由於編譯器本質上是一個C語言到彙編語言的翻譯器,因此很少需要手動完成此操作。這是功課嗎?

+0

請注意,檢查已編譯代碼的反彙編輸出可能會有問題,因爲通過調用庫中的特定函數來完成該任務可以實現功能,因此在編譯二進制本身內部不會找到它,而是從提供功能的庫。 – zxcdw

+0

我正在使用匯編(x86)語言處理需要這些功能的項目。 – hamb

+1

@ hamb-編譯器*的輸出是*程序集。如果你不想從頭開始編寫這些函數,你可以用C編寫它們,編譯它們,並從編譯器輸出中獲取彙編代碼。然而,math.h中的函數很簡單,只需手動編寫程序集就可以更容易。 – bta