2011-07-08 110 views
64

還值得學習ASM學習彙編語言是否值得?

我對它有一點了解,但是我沒有真正使用過它,或者沒有正確地學習它,因爲我在彙編程序中學習的所有東西都可以在1/10時間內用C或C++等語言完成。那麼,我真的應該學習和使用ASM嗎?它會對我有什麼好的專業嗎?它會增加我的機智嗎?總之,它會讓我成爲更好的程序員嗎?

注意:我說的是低級彙編樣FASMNASM而不是像HLA(高級彙編程序)。

+1

請注意,彙編語言綁定到處理器/控制器。 – rmflow

+1

你的意思是它不是跨平臺的? – ApprenticeHacker

+0

編號例如:http://www.worldofspectrum.org/Z80instructions.html – rmflow

回答

78

我從Kip Irvine's得知書。如果你忽視他(不相關的)圖書館的(公正的)批評,我可以推薦它作爲語言本身的一個很好的介紹 - 儘管對於有趣的東西你必須在網上搜尋迷戀。

我認爲理解底層會發生什麼很有用。在研究彙編程序時,您將學習CPU流水線,分支預測,高速緩存對齊,SIMD,指令重新排序等。這些知識將幫助您編寫更好的高級代碼。此外,傳統的觀點是大多數時候不嘗試手動優化程序集,但讓編譯器擔心它。當你看到編譯器產生的扭曲事件的一些例子時,你會更好地理解爲什麼傳統智慧會成立。

示例:LFSR通過rotate-with-carry指令快速運行,對於像這樣的特定情況,編寫彙編程序版本與發現編譯器是否足夠聰明以找出它一樣容易。有時編譯器不會編譯you just know something

這也增加了你的安全性問題的認識 - 寫 - 或 - 執行,堆棧溢出等

當你知道什麼是在每個指令級發生的一些concurrency問題才變得明顯。

如果您沒有完整的源代碼,調試有時可能會有用。

有趣的價值。虛擬功能是如何實現的?曾經嘗試在彙編器中編寫DirectX或COM程序?大型結構如何返回,調用函數是否爲它們提供空間,反之亦然?

然後,圖形硬件有特殊的彙編語言,雖然着色器語言在幾年前變得高級,但任何能讓您以不同方式思考問題的東西都是很好的。

+3

寫得很好的答案+1。學習和使用是兩回事,學習這是一個好主意,何時/如果使用它,它帶有經驗。 –

20

是的 - 學習C和C++開發人員彙編的主要原因是它幫助理解C和C++代碼背後發生的事情。這並不是說你實際上會在程序集中編寫代碼,但是你可以查看代碼反彙編代碼to assess its efficiency,你將會明白不同的C和C++特性如何更好地工作。

2

你有什麼使用在你打算做什麼?它會以任何方式幫助你在你目前做什麼或計劃做什麼?這些是你應該問自己的兩個問題,答案就是你的問題的答案。

從一般意義上說,是的,在我看來,我認爲非常值得學習asm(類似於x86或arm),它對您的服務取決於您編程的方式以及調試方式。

3

瞭解ASM在調試時也很有用,因爲有時您所擁有的只是「ASM轉儲錯誤」。

14

從許多不同的範例中學習許多不同的語言是值得的。學習Java,C++,C#和Python不算數,因爲它們都是相同範例的實例。

由於程序集是所有語言的根源(很好,接近根源),所以我認爲學習程序集是值得的。

然後,值得學習功能性編程語言,邏輯編程,腳本語言,基於數學的語言。你只有很多時間,所以你必須挑選。

33

我覺得有趣的是,有那麼多人跳起來說是的,你需要/應該學會大會。對我來說,問題是你需要知道多少組件?我不認爲你必須像編程語言那樣知道程序集,也就是說我不相信每個人都應該能夠在程序集中編寫程序,但另一方面,能夠閱讀它並理解它是什麼實際上意味着(可能需要比彙編更多的架構知識)就足夠了。

我肯定不能組件(即寫任何不平凡的一段彙編代碼),但我可以讀它,這與實際的硬件架構的知識,以及正在使用的調用約定一起足以分析性能,並確定哪些C++代碼是該程序集的來源。

+2

你的意思是我應該學習基本的** push,pop,mov和invoke **命令? – ApprenticeHacker

+6

我同意,對組裝的需求很大程度上取決於您正在使用的編程分支。網絡/桌面/數據庫?忘了彙編。電腦遊戲和圖形?這可能有點方便。 OS開發還是實時嵌入式系統?這是必須的。等等。 – Lundin

+1

你歪曲其他答案 - 沒有人說你**需要/應該**學習程序集;只是根據這個問題它是有用的或有價值的。你的答案仍然相關。 –

2

取決於您希望達到的編程級別。 如果你需要使用調試器然後YES。 如果你需要知道編譯器如何工作,那麼是的。 任何彙編程序/調試程序都依賴於CPU,所以有很多工作,只需檢查x86系列的年代。

+0

可能是你的意思是CPU系列? – Romeno