學習彙編對編程有什麼幫助?如何學習

1240

-- 作者 謝恩銘 轉載請註明出處


目錄

  1. 什麼是彙編語言
  2. 語言層級的區分
  3. 彙編語言的特性
  4. 學習彙編真的必要嗎
  5. 彙編怎麼學

常有人問:現在基本都使用高級語言了,彙編語言還需要學嗎?學習彙編語言有什麼好處呢?彙編語言看着這麼頭大,如何學習?

作爲自學過彙編語言的人,我來談談心得。不才,有說得不正確之處,還望指正。

我是2011年學習彙編語言的,那時候編程剛入門不久。

因爲專業是嵌入式軟件和移動信息,入門了C語言這個嵌入式領域的關鍵語言之後,我看到很多論壇說學習彙編對理解計算機的原理和內存很有幫助,就自學了一段時間。


什麼是彙編語言

彙編語言(英語:assembly language)是一種用於電子計算機、微處理器、微控制器,或其他可編程器件的低級語言。

在不同的設備中,彙編語言對應着不同的機器語言指令集。

一種彙編語言專用於某種計算機系統結構,而不像許多高級語言,可以在不同系統平臺之間移植。

使用彙編語言編寫的源代碼,然後通過相應的彙編程序將它們轉換成可執行的機器代碼。這一過程被稱爲彙編過程。

現在彙編語言已不像其他大多數的程序設計語言一樣被廣泛用於程序設計,在今天的實際應用中,它通常被應用在底層硬件操作和高要求的程序優化的場合。

驅動程序、嵌入式操作系統和實時運行程序都會需要彙編語言。

彙編語言類似這樣:

MOV    AX,DATA
MOV    DS,AX
MOV    AX,STACK
MOV    SS,AX
LEA    DX,MSG0
CALL    PRINTS
CALL    ENTER

語言層級的區分

習慣了編程Java或C++等語言的朋友看到上面這段代碼是不是有點暈的感覺。

一般來說,編程語言的層級可以分爲高級和低級。

低級語言(英語:Low-level programming language),在計算機科學之中,是電腦編程語言的一類。該類編程語言之所以被稱爲低級,是因爲該類語言在運作時無法進行進一步的抽象化,而與中央處理器的機器語言或指令直接對應,因此一般亦被指是原始的編程語言。

彙編語言就屬於低級語言。

高級語言(High-level programming language)是高度封裝了的編程語言,與低級語言相對。它是以人類的日常語言爲基礎的一種編程語言,使用一般人易於接受的文字來表示,使程序編寫員編寫更容易,亦有較高的可讀性,以方便對電腦認知較淺的人亦可以大概明白其內容。

現在一般我們用的編程語言,如C語言,C++,Java,Python,PHP,C#等都可以歸類爲高級語言。

不過,低級與高級其實只是相對的概念,Java對比C語言可以被認爲是一種相對高級的編程語言。


彙編語言的特性

說到彙編語言的特性,除了運行高效,編寫繁瑣之外,暫時也想不到其他了。

一個簡單的加法小程序,用彙編語言寫,就要好多行。

至於用彙編語言寫貪吃蛇等小遊戲,真的很需要耐心。

其實,我們小時候玩的那種《超級瑪麗》,《魂鬥羅》等遊戲,都是彙編語言寫成的。

當時一個超級瑪麗遊戲才128KB大小,想想我們現在動輒好幾個GB的大型單機遊戲,一張圖片可能就超過128KB了,不得不感嘆彙編語言的強大和當時的程序員之牛叉。

如想了解更多,可以參看知乎上的這個話題:

《超級馬里奧3》使用了什麼樣的技術可以在128KB中寫進這麼多東西?


學習彙編真的必要嗎

我個人認爲是必要的,而且以我的體會來看,相當值得!

當然了,不學也沒什麼不行的。不過就我個人的體會和各大論壇的評論來說,彙編語言的學習幾乎是有百利而無害。

因爲彙編語言可以讓你接觸到計算機很多底層的技術和知識,例如寄存器,內存,操作系統架構,等等。

這樣,能促使你去閱讀更多的有關計算機原理和編譯原理的書,做到知其所以然,對我們經常使用的電腦兄有一個深入的理解。

總之:彙編語言的學習可以夯實我們的基礎。而且,我們並不需要學到多深入,只要能入門即可。

而且:

無論是對於反病毒工程師還是逆向分析愛好者來說,彙編都是他們必學的知識,可以說彙編是一切逆向研究的根本。不管是使用OllyDbg還是IDA Pro,又或者是其它的一些反彙編工具,我們進行逆向分析的時候,是隻能查看目標程序的彙編代碼的,通過分析其彙編代碼,來推測程序的運行機理。因此從這個角度來說,想研究逆向,就一定要精通匯編。


彙編怎麼學

可以說任何語言的學習都逃不過看書+實作。那麼,“讓人生畏”的彙編語言該從什麼書入門呢?

要看書,自然必須看好書。

入門

我覺得,入門可以看清華大學王爽老師的《彙編語言》,目前好像是第三版了吧。我當初2011年學習時還是第二版。

時間荏苒啊,一晃眼5年過去了。我很感謝彙編語言,是它讓我打好了編程的基礎,也幫助我更深入理解了C語言(特別是C語言的難點:指針)。

當時,王爽老師的《彙編語言》這本書的習題我全部做了,而且專門去這本書的官方論壇,一題題對答案,全對。

PS:我試了一下,這個官方論壇目前進不去了... 不知哪天能恢復呢?

不過大家也可以去這個論壇學習。

此外,CSDN的彙編語言論壇也是很不錯的。

當然了,學習彙編語言的同時,如果能配合《深入理解計算機系統》這本入門的書就更好了。

我把2011年那時學習彙編語言的文件夾上傳到我的Github上了,歡迎提意見:

https://github.com/frogoscar/asm-exercise

這裏面大部分是《彙編語言》這本書的習題我的答案,不過不全了,而且還有一些其他的彙編程序。

進階

王爽老師的這本書第二版是以8086彙編語言(Intel 8086 爲16 位 CPU)作講解的,後來我進階看了一些80386(Intel 80386爲32位的CPU)的書,推薦一本我個人非常喜歡的書:《Orange S:一個操作系統的實現》。

《Orange S:一個操作系統的實現》這本書是《自己動手寫操作系統》的第二版。作者是於淵。

他的第一版《自己動手寫操作系統》很受歡迎,因爲一般很少有人能將晦澀難懂的操作系統講得如此有趣。後來他寫了更加完備的第二版。

第二版的書名有點特別,Orange是英語《桔子》的意思。據作者在序裏面說的,第一版的操作系統名字是Tinix。而第二版換成了Orange’s,這名字來自於作者的妻子。

於淵老師的這兩本書都一步步引導讀者用彙編語言和C語言編寫出一個具備基本功能的操作系統。

《Orange S:一個操作系統的實現》這本書的源代碼在Github上:

https://github.com/yyu/osfs00

當然了,其他還有很多彙編語言的優秀書籍和學習資源,歡迎大家留言補充,謝謝!

祝大家都能愉快地學習彙編語言,更好地掌握編程!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章