作者 謝恩銘,公眾號「程序員聯(lián)盟」(微信號:coderhub)。
轉(zhuǎn)載請注明出處。
原文:http://m.itdecent.cn/p/ef4b0442b3ce
內(nèi)容簡介
- 什么是匯編語言
- 語言層級的區(qū)分
- 匯編語言的特性
- 學(xué)習(xí)匯編真的必要嗎
- 匯編怎么學(xué)
常有人問:現(xiàn)在基本都使用高級語言了,匯編語言還需要學(xué)嗎?學(xué)習(xí)匯編語言有什么好處呢?匯編語言看著這么頭大,如何學(xué)習(xí)?
作為自學(xué)過匯編語言的人,我來談?wù)勑牡?。不才,有說得不正確之處,還望指正。
學(xué)生時(shí)代,因?yàn)槲业膶I(yè)是嵌入式軟件和移動(dòng)信息,入門了 C語言這個(gè)嵌入式領(lǐng)域的關(guān)鍵語言之后,我看到很多論壇說學(xué)習(xí)匯編對理解計(jì)算機(jī)的原理和內(nèi)存很有幫助,就自學(xué)了一段時(shí)間。
1. 什么是匯編語言
匯編語言(英語:assembly language)是一種用于電子計(jì)算機(jī)、微處理器、微控制器,或其他可編程器件的低級語言。
在不同的設(shè)備中,匯編語言對應(yīng)著不同的機(jī)器語言指令集。
一種匯編語言專用于某種計(jì)算機(jī)系統(tǒng)結(jié)構(gòu),而不像許多高級語言,可以在不同系統(tǒng)平臺(tái)之間移植。
使用匯編語言編寫的源代碼,然后通過相應(yīng)的匯編程序?qū)⑺鼈冝D(zhuǎn)換成可執(zhí)行的機(jī)器代碼。這一過程被稱為匯編過程。
現(xiàn)在匯編語言已不像其他大多數(shù)的程序設(shè)計(jì)語言一樣被廣泛用于程序設(shè)計(jì),在今天的實(shí)際應(yīng)用中,它通常被應(yīng)用在底層硬件操作和高要求的程序優(yōu)化的場合。
驅(qū)動(dòng)程序、嵌入式操作系統(tǒng)和實(shí)時(shí)運(yùn)行程序都會(huì)需要匯編語言。
匯編語言類似這樣:
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
LEA DX,MSG0
CALL PRINTS
CALL ENTER
2. 語言層級的區(qū)分
習(xí)慣了編程 Java 或 C++ 等語言的朋友看到上面這段代碼是不是有點(diǎn)暈的感覺。
一般來說,編程語言的層級可以分為高級和低級。
低級語言(英語:Low-level programming language),在計(jì)算機(jī)科學(xué)之中,是電腦編程語言的一類。該類編程語言之所以被稱為低級,是因?yàn)樵擃愓Z言在運(yùn)作時(shí)無法進(jìn)行進(jìn)一步的抽象化,而與中央處理器的機(jī)器語言或指令直接對應(yīng),因此一般亦被指是原始的編程語言。
匯編語言就屬于低級語言。
高級語言(High-level programming language)是高度封裝了的編程語言,與低級語言相對。它是以人類的日常語言為基礎(chǔ)的一種編程語言,使用一般人易于接受的文字來表示,使程序編寫員編寫更容易,亦有較高的可讀性,以方便對電腦認(rèn)知較淺的人亦可以大概明白其內(nèi)容。
現(xiàn)在一般我們用的編程語言,如 C語言,C++,Java,Python,PHP,C#,等都可以歸類為高級語言。
不過,低級與高級其實(shí)只是相對的概念,Java 對比 C語言可以被認(rèn)為是一種相對高級的編程語言。
3. 匯編語言的特性
說到匯編語言的特性,除了運(yùn)行高效,編寫繁瑣之外,暫時(shí)也想不到其他了。
一個(gè)簡單的加法小程序,用匯編語言寫,就要好多行。
至于用匯編語言寫貪吃蛇等小游戲,真的很需要耐心。
其實(shí),我們小時(shí)候玩的那種《超級瑪麗》,《魂斗羅》等游戲,都是匯編語言寫成的。
當(dāng)時(shí)一個(gè)超級瑪麗游戲才 128 KB 大小,想想我們現(xiàn)在動(dòng)輒好幾個(gè) GB 的大型單機(jī)游戲,一張圖片可能就超過 128 KB 了,不得不感嘆匯編語言的強(qiáng)大和當(dāng)時(shí)的程序員之威武。
如想了解更多,可以參看知乎上的這個(gè)話題:
《超級馬里奧3》使用了什么樣的技術(shù)可以在128KB中寫進(jìn)這么多東西?
4. 學(xué)習(xí)匯編真的必要嗎
我個(gè)人認(rèn)為是必要的,而且以我的體會(huì)來看,相當(dāng)值得!
當(dāng)然了,不學(xué)也沒什么不行的。不過就我個(gè)人的體會(huì)和各大論壇的評論來說,匯編語言的學(xué)習(xí)幾乎是有百利而無一害。
因?yàn)閰R編語言可以讓你接觸到計(jì)算機(jī)很多底層的技術(shù)和知識,例如寄存器,內(nèi)存,操作系統(tǒng)架構(gòu),等等。
這樣,能促使你去閱讀更多的有關(guān)計(jì)算機(jī)原理和編譯原理的書,做到知其所以然,對我們經(jīng)常使用的電腦兄有一個(gè)深入的理解。
總之:匯編語言的學(xué)習(xí)可以夯實(shí)我們的基礎(chǔ)。而且,我們并不需要學(xué)到多深入,只要能入門即可。
而且:
無論是對于反病毒工程師還是逆向分析愛好者來說,匯編都是他們必學(xué)的知識,可以說匯編是一切逆向研究的根本。不管是使用 OllyDbg 還是 IDA Pro,又或者是其它的一些反匯編工具,我們進(jìn)行逆向分析的時(shí)候,是只能查看目標(biāo)程序的匯編代碼的,通過分析其匯編代碼,來推測程序的運(yùn)行機(jī)理。因此從這個(gè)角度來說,想研究逆向,就一定要精通匯編。
5. 匯編怎么學(xué)
可以說任何語言的學(xué)習(xí)都逃不過看書+實(shí)作。那么,“讓人生畏”的匯編語言該從什么書入門呢?
要看書,自然必須看好書。
入門
我覺得,入門可以看清華大學(xué)王爽老師的《匯編語言》,目前好像是第三版了吧。我當(dāng)初學(xué)習(xí)時(shí)還是第二版。
我很感謝匯編語言,是它讓我打好了編程的基礎(chǔ),也幫助我更深入理解了 C語言(特別是 C語言的難點(diǎn):指針)。
當(dāng)時(shí),王爽老師的《匯編語言》這本書的習(xí)題我全部做了,而且專門去這本書的 官方論壇,一題題對答案,全對。
大家也可以去這個(gè) 論壇 學(xué)習(xí)。
此外,CSDN 的 匯編語言論壇 也是很不錯(cuò)的。
當(dāng)然了,學(xué)習(xí)匯編語言的同時(shí),如果能配合 《深入理解計(jì)算機(jī)系統(tǒng)》 這本入門的書就更好了。
我把當(dāng)年學(xué)習(xí)匯編語言的文件夾上傳到我的 Github 上了,歡迎提意見:
https://github.com/frogoscar/asm-exercise
這里面大部分是《匯編語言》這本書的習(xí)題的我的答案,不過不全了,而且還有一些其他的匯編程序。
進(jìn)階
王爽老師的這本書第二版是以 8086 匯編語言(Intel 8086 為16 位 CPU)作講解的,后來我進(jìn)階看了一些 80386(Intel 80386 為 32 位的 CPU)的書。推薦一本我個(gè)人非常喜歡的書:《Orange S:一個(gè)操作系統(tǒng)的實(shí)現(xiàn)》。
《Orange S:一個(gè)操作系統(tǒng)的實(shí)現(xiàn)》這本書是《自己動(dòng)手寫操作系統(tǒng)》的第二版。作者是于淵。
他的第一版《自己動(dòng)手寫操作系統(tǒng)》很受歡迎,因?yàn)橐话愫苌儆腥四軐⒒逎y懂的操作系統(tǒng)講得如此有趣。后來他寫了更加完備的第二版。
第二版的書名有點(diǎn)特別,Orange 是英語“桔子”的意思。據(jù)作者在序里面說的,第一版的操作系統(tǒng)名字是 Tinix。而第二版換成了Orange’s,這名字來自于作者的妻子。
于淵老師的這兩本書都一步步引導(dǎo)讀者用匯編語言和 C語言編寫出一個(gè)具備基本功能的操作系統(tǒng)。
《Orange S:一個(gè)操作系統(tǒng)的實(shí)現(xiàn)》這本書的源代碼在 Github 上:
當(dāng)然了,其他還有很多匯編語言的優(yōu)秀書籍和學(xué)習(xí)資源,歡迎大家留言補(bǔ)充,謝謝!
祝大家都能愉快地學(xué)習(xí)匯編語言,更好地掌握編程!
我是 謝恩銘,公眾號「程序員聯(lián)盟」(微信號:coderhub)運(yùn)營者,慕課網(wǎng)精英講師 Oscar 老師,終生學(xué)習(xí)者。
熱愛生活,喜歡游泳,略懂烹飪。
人生格言:「向著標(biāo)桿直跑」