在學習Linux操作系統的過程中,順便學習了匯編語言,在操作系統的學習過程中,總共遇到過三種匯編,16位實模式下的匯編,32位保護模式下的匯編,C語言的內嵌匯編。這三種匯編分別用在不同的場景。如實模式下的匯編是在剛開機到操作系統啟動這段時間運行,主要用來加載操作系統到內存,跳轉執行操作系統程序。32位匯編是在操作系統接管硬件之后使用。C語言內嵌匯編可以用在一些代碼關鍵部分,需要對硬件絕對控制的部分。
除了上面這樣的分類之外,匯編語言還有兩種不同的風格,一種是AT&T風格匯編,一種是Intel風格匯編,這只是語言書寫的一種約定,需要使用不同的匯編器進行匯編,學習哪一種都是可以的,但如果要學習操作系統或者以后需要看懂別人的匯編代碼,最好兩種都學習,總之根據自身需求,不要增加自身負擔。
下面,我將具體介紹Linux平臺下如何使用匯編語言。
不管在那一平臺下,使用匯編語言都需要三種基本的工具,匯編器,鏈接器,調試器。只要知道了這三種工具在該平臺下具體是什么,就可以很順利的在此平臺下使用匯編語言。
在Linux下,這三種工具也有很多,這里主要介紹其中幾種。
- 匯編器
linux下可以使用gas匯編器,這也是gcc依賴的匯編器。基本命令為:as -o hello.o hello.s,需要注意的是,gas匯編器支持的是AT&T風格的和匯編。除gas之外還有一種匯編器:nasm,這種匯編器可以很好的支持Intel風格匯編,匯編速度也更快,命令格式:nasm -f elf hello.asm - 鏈接器
由匯編器產生的目標代碼是不能直接在計算機上運行的,它必須經過鏈接器的處理才能生成可執行代碼。鏈接器通常用來將多個目標代碼連接成一個可執行代碼,這樣可以先將整個程序分成幾個模塊來單獨開發,然后才將它們組合(鏈接)成一個應用程序。 Linux 使用 ld 作為標準的鏈接程序,它同樣也包含在 binutils 軟件包中。匯編程序在成功通過 GAS 或 NASM 的編譯并生成目標代碼后,就可以使用 ld 將其鏈接成可執行程序了: ld -s -o hello hello.o
3.調試器
Linux下可以使用GDB,DDD,ALD作為調試器
實驗:在屏幕上打印出hello world
-
使用Vim編輯器新建hello.asm文件,寫入如下代碼
輸入源代碼 - 匯編,鏈接源代碼,并執行
使用nasm匯編,ld鏈接,最后執行