一起學習在linux下使用匯編語言(1)
2024-07-21 02:37:19
供稿:網友
作者:luster
摘要:我開始學習在linux使用匯編語言了。我以前從來沒有在Linux下使用過匯編語言。我今天看到了一份文檔,是Linux Assembly HOWTO,我看了看,決定學習學習。下面是我的學習筆記。讓我一起學習吧。
在Linux下使用匯編語言
by Wang Hui(hwang@ustc.edu)
2001/9/11
我開始學習在Linux使用匯編語言了。我以前從來沒有在Linux下使用過匯編語言。我今天看到了一份文檔,是Linux Assembly HOWTO,我看了看,決定學習學習。下面是我的學習筆記。讓我一起學習吧。
1. 你需要匯編語言嗎?
匯編語言的優點和缺點
匯編語言可以很直接的表達比較低層次的:
· 你可以通過匯編代碼訪問與機器硬件直接相關的存儲器或者I/O口。
· 你可以在一些要害的代碼區準確的控制某些代碼的行文,避免其他方法帶來的多線程共同訪問或者硬件設備共享引起的死鎖。
· 你可以通過使用匯編打破通常的編譯器編譯的結果,例如你可以根據自己的考慮優化一些東西。
· 我們可以在代碼分片之間建立一些接口。
· 我們可以通過一些匯編代碼使處理器進入不平常的編程模式。例如16 bit mode to interface startup, firmware, or legacy code on Intel PCs.
· 可以優化一些代碼,提高運行速度。
· 可以為特定的應該編寫優化代碼。
· 可以為某語言的編譯器編寫代碼。
匯編語言是一種層次非常低的語言(僅僅高于手動編寫二進制機器指令碼),這就意味著:
· 開始寫起來會很長而且單調
· 很輕易出現bug
· 程序中的bug非常難查找
· 寫出來的代碼非常難懂,而且不好維護和修改
· 而且結果是不能到其他體系結構的平臺上運行。
· 代碼只能針對某特特定體系結構的特定型號的處理器優化。例如,在Intel兼容系列的CPU中,每一款CPU都有非凡的設計,變量也不一樣,都有特定的優化考慮。CPU的時間已經有很多了,例如:Intel 386, 486, Pentium, PPRo, PII, PIII, PIV; Cyrix 5x86, 6x86, M2; AMD K5, K6 (K6-2, K6-III), K7 (Athlon, Duron). 而且新的設計還不斷地出現。
· 編寫匯編代碼時候,我們會花費很多的時間在一些細節事情上,而不能專注一些小的或者大的算法設計,而算法的優化能更快的提高程序運行的速度。例如,你可以用匯編加快一些數組的訪問和治理,但是總體上講,使用hash表會更大程度上加快訪問速度。
· 一個算法上的小的改動,可能需要我們全部重新寫一段很長的代碼。
"compilers make it a lot easier to use complex data strUCtures,
and compilers don't get bored halfway through and generate
reliably pretty good code."
2. Linux 和匯編
你可能已經注重到了,在linux下開發程序,通常不需要使用匯編語言。與DOS不一樣,你不需要使用匯編來編寫linux的驅動程序(當然,假如你非得用匯編寫,也可以)。而且現在的編譯器有很多優化器,可以針對不多的CPU優化尼的高級語言寫的代碼,例如C代碼。當然既然我們在討論這個問題,而且你都在閱讀本文了,luster知道你肯定有自己的理由去使用匯編而不是C或者C++了。:)
你可能需要使用匯編,或者你不得不使用匯編。簡單的說,使用匯編的理由就是精簡代碼和libc無關性。還有一個理由就是,希望像一個以前的瘋狂的hacker那樣,這些20多歲的hacker的習慣就是用匯編寫任何代碼。
然而,假如你要移植linux到某些嵌入式硬件環境下,你需要減少系統的大小,你需要將很多基本的系統精簡到很小的空間。其中的一個可行的方法就是,重新用匯編寫部分(或者全部?)代碼。例如,用匯編寫的簡單的http服務器程序可能少于600 bytes,這樣呢可以把建立一個webserver(包括一個內核和一個httpd),大小只有400KB或者更小。
是不是很爽?:)
今天就學習到這里。下面就讓我們真正開始吧。
待續'