不可否認,這次的標題有點長。之所以把標題寫得這麼詳細,主要是為了搜索引擎能夠准確地把確實需要了解GCC生成16位實模式代碼方法的朋友帶到我的博客。先說一下背景,編寫能在x86實模式下運行的16位代碼,這個話題確實有點復古,所以能找到的資料也相應較少。要運行x86實模式的程序,目前我知道的只有兩種方式,一種是使用DOS系統,另一種是把它寫成引導扇區的代碼,在系統啟動時直接運行。很顯然,許多講自己實現操作系統的書籍都會講到x86實模式,也只有自己實現操作系統引導的朋友需要用到x86實模式,所以我這篇文章的閱讀用戶數肯定很少,雖然我自認為它填補了網上關於該話題相關資料缺乏的空白。因此,凡是逛到我這篇文章的朋友,請點一下推薦,謝謝。
為什麼說我這篇博客填補了相關話題的空白呢?那是因為不管是那些寫書的,還是網上寫文章的,一旦需要編寫16位的實模式代碼,都喜歡拿NASM說事兒,一點也不顧GNU AS的感受。當然,這是有歷史原因的,因為Linux自從其誕生起就是32位,就是多用戶多任務操作系統,所以GCC和Gnu AS一移植到Linux上就是用來編寫32位保護模式的代碼的。而且,ELF可執行文件格式也只有ELF32和ELF64,沒聽說過有ELF16的。即使是Linux自己,剛誕生的時候(1991年),也只有使用as86匯編器來編寫自己的16位啟動代碼,直到1995年以後,GNU AS才逐步加入編寫16位代碼的能力。
Linux升級GCC 4.8.1清晰簡明教程(Ubuntu 12.04 64位版為例) http://www.linuxidc.com/Linux/2014-04/99583.htm
在CentOS 6.4中編譯安裝GCC 4.8.1 + GDB 7.6.1 + Eclipse 在CentOS 6.4中編譯安裝GCC 4.8.1 + GDB 7.6.1 + Eclipse
Ubuntu下Vim+GCC+GDB安裝及使用 http://www.linuxidc.com/Linux/2013-01/78159.htm
Ubuntu下兩個GCC版本切換 http://www.linuxidc.com/Linux/2012-10/72284.htm
CentOS6.5升級手動安裝GCC4.8.2 http://www.linuxidc.com/Linux/2015-01/112595.htm
下面開始我的GCC和GNU Binutils的16位代碼之旅。我決定使用DOS作為我的測試環境,所以最後生成的可執行文件都把它制作成DOS系統中可運行的Plain Binary格式。第一步安裝一個qemu虛擬機來運行FreeDOS,安裝虛擬機在Ubuntu中只需要一個sudo apt-get install qemu命令就可以完成,所以我就不截圖了。但是FreeDOS的軟盤映像文件需要到Qemu的官網上面去下載,下載地址如下圖:
使用qemu-system-i386 -fda freedos.img可以運行Qemu虛擬機和FreeDOS系統,如下圖:
因為匯編語言更接近底層,而C語言更高級,所以先從匯編語言開始,逐步過渡到C語言。先寫一個簡單的、能在DOS中顯示一個“Hello,world!”的匯編語言程序,考慮到我之後會使用該程序調用C語言的main函數,並且該程序負責讓程序運行結束後順利返回DOS系統,所以我把這個程序命名為test_code16_startup.s。其代碼如下:
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2015-03/114346p2.htm