實驗目的:
搭建基本實驗環境,熟悉基本開發與調試工具
對應章節:第一、二章
實驗內容:
1.認真閱讀章節資料
2.在實驗機上安裝virtualbox,並安裝ubuntu
3.安裝ubuntu開發環境,32位環境
4.下載bochs源碼,編譯並安裝bochs環境
5.使用bochs自帶工具bximage創建虛擬軟驅
6.閱讀、編譯boot.asm,並反匯編閱讀
7.修改bochsrc,運行並調試你的第一個程序:
刪除AA55,觀察程序效果,找出原因
修改程序中輸出為,一個任意長度的打印字符串,調試程序
把生成的可執行文件反匯編,並設置斷點進行調試,打印過程
回答:為什么要對段寄存器進行賦值
回答:如何在該程序中調用系統中斷
實驗環境:
VMwareWorkstationPro 15.5.0
Ubuntu 12.04.5 desktop i386 32位
bochs 2.6.9
關鍵技術:
Bochs的使用,主要在於反匯編與單步調試
匯編代碼的理解
Makefile的使用
實驗步驟:
1.在實驗機上安裝virtualbox,並安裝ubuntu開發環境,32位環境
在官網下載VMware Workstation Pro 15.5.0並安裝
在http://mirrors.163.com/ubuntu-releases/,下載:32位Ubuntu,12.04LTS
之后在VMware Workstation Pro中利用ubuntu iso文件安裝虛擬機
並安裝vmwaretools工具
結果如圖:
2.下載bochs源碼,編譯並安裝bochs環境
(1)首先Bochs下載:bochs 2.6.9
http://bochs.sourceforge.net/getcurrent.html
下載完畢后復制到ubuntu
(2)安裝必要環境
先修改ubuntu源
修改ubuntu源方法:
http://mirrors.163.com/.help/ubuntu.html
deb http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse
deb-src http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse
deb http://mirrors.163.com/ubuntu/ precise-security universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-security universe main multiverse restricted
deb http://mirrors.163.com/ubuntu/ precise-updates universe main multiverse restricted
deb http://mirrors.163.com/ubuntu/ precise-proposed universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-proposed universe main multiverse restricted
deb http://mirrors.163.com/ubuntu/ precise-backports universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-backports universe main multiverse restricted
deb-src http://mirrors.163.com/ubuntu/ precise-updates universe main multiverse restricted
之后安裝必要環境
sudo apt-get install g++
sudo apt-get install build-essential
Sudo apt-get install libgtk2.0-dev
Sudo apt-get install bison
Sudo apt-get install libx11-dev
libxrandr-dev
libsdl1.2-dev
vgabios
/*bximage*/
(3)之后安裝bochs
$tar vxzf bochs-2.6.9.tar.gz
$cd bochs-2.6.9
$./configure --enable-debugger --with-sdl --enable-disasm --enable-readline LIBS='-lX11'
$make
$sudo make install
輸入命令bochs
如下圖,說明安裝成功
3.使用bochs自帶工具bximage創建虛擬軟驅
控制台輸入bximage即可
注意創建的a.img位於Home
4.閱讀、編譯boot.asm,並反匯編閱讀
(1)閱讀boot.asm
Boot.asm相當於寫了一個引導程序
CPU通過CS:IP寄存器中的內容找到要執行的代碼片段所在的實際物理內存地址
Mov ax ,cs
Mov ds ,ax
Mov es,ax
相當於給定代碼段和數據段,和附加段基地址。
之后DispStr調用10h 13號中斷展示BootMessage字符串,規定的展示位置,字體顏色等等。
之后BootMessage db “...”定義了字符串
Times 510 -($-$$) db 0 計算需要多少字節0才能填充剩余0,使得從開頭到當前,再加填充的0構成510字節
最后dw 0Xaa55 定義最后兩字節為aa55。共512字節,最后兩字節為aa55,固為引導程序。
org 規定程序起始地址為07c00h
cs 代碼段寄存器,
ds 數據段寄存器
es 附加段寄存器
bp 基址
ES 段地址 BP偏移地址
cx,ax,bx 數據寄存器
ah ax高8位,al ax低8位
dl dx 低8位
db 定義字節變量
Int interrupt
dw定義字類型變量
mov a,b 將b值賦給a
Jmp $ 表示死循環
$表示當前地址,表示當前行被匯編后的地址。
$$表示節的開始處被匯編后的地址
引導程序
BIOS將所檢查啟動磁盤的第一個扇區512字節載入內存,放於內存0x0000:0x07c00處。
如果第一扇區最后兩個字節是AA55,那么它就是一個引導程序。
引導程序特點
大小是512字節,不能多也不能少,因為BIOS只讀取512B到內存中。
它結尾必須是55AA,這是引導扇區標志。
它總是放在磁盤第一個扇區上(0磁頭0此道1扇區)因為BIOS只讀取第一個扇區。
Int 10h
10H中斷的13號中斷用於顯示字符串,參數為:
AH=13H
AL=顯示方式
BH表示視頻區頁數
如果AL的BIT1為0,則BL表示顯示屬性。
CX為字符串長度
DH表示在第幾行顯示(0為第一行)
DL表示在第幾列顯示(0為第一列)
ES:BP指向字符串
(2)編譯boot.asm
nasm boot.asm -o boot.bin
5.修改bochsrc,運行並調試你的第一個程序:
(1)修改bochsrc
修改vgaromimage和romomage對應的文件位置,注意是bochs安裝后的位置,而不是tar解壓的bochs文件夾中的文件
注釋掉keyboard_mapping一行
增加display_library: sdl
修改后相當於規定了啟動軟盤為a.img
(2)Makefile
先看Makefile文件
意為:先解壓a.img.gz,然后匯編編譯boot.asm,然后用boot.asm填充a.img,然后運行bochs
Clean rm -f 為刪除文件
./configure 是用來檢測你的安裝平台的目標特征的。比如它會檢測你是不是有CC或GCC,並不是需要CC或GCC,它是個shell腳本。
make 是用來編譯的,它從Makefile中讀取指令,然后編譯。
make install是用來安裝的,它也從Makefile中讀取指令,安裝到指定的位置。
Bochs從當前目錄尋找bochsrc作為配置文件
(3)運行
Cd 到目標文件夾
Make
就先后完成解壓,編譯,打開了bochs
然后輸入6開始simulation
記得要輸入c continue
(4)調試刪除AA55,查看效果
修改后的boot.asm
Nasm編譯為b2.bin
Bximage 創建新的floppy disk a.img
寫入
Bochs運行
發現效果為:無法運行,直接退出
原因:因為位於1扇區的512字節,且最后字節為aa55的程序為引導程序,a.img作為引導盤,aa55為標志,刪除后相當於沒有引導程序,故無法運行直接退出
(5)修改輸出字符串
只需要根據想要輸出的字符串修改BootMessage,根據BootMessage的長度修改cx即可
舉例,輸出just monika
修改后的asm
運行效果
(6)把生成的可執行文件反匯編,並設置斷點進行調試,打印過程
用nasm,ndisam可以反匯編
用bochs也可以反匯編,並實現單步調試
具體指令參考教材第二章,或輸入 help查看命令
就對寫入了原始boot.asm編譯產生的boot.bin的a.img用bochs調試
b 0x7a00 設置斷點
C 運行到斷點
Info cpu查看cpu寄存器
x /64xb 0x7c00 查看內存 64為sequence長度,x為16進制顯示,b為長度為byte
Help x 可以具體查看參數意義。
n 單步運行 (遇到函數會跳過)
trace-reg on 讓bochs每一步都顯示主要寄存器的值
U 為反匯編 disasm
可見在調用DispStr函數后,程序一直循環
6. 回答相關問題
(1)回答:為什么要對段寄存器進行賦值
cs為代碼段基址,賦給ds,es,確定程序運行的基址,比如數據段基址,之后加上bp,ES:BP就構成了BootMessage的地址
(2)回答:如何在該程序中調用系統中斷
使用匯編int 10h 調用中斷,同時設置好其參數,比如cx為字符串長度,ah=13表示輸出字符串,AL=01h為顯示器模式,bx 000c為顏色,dl 0 表示在第一行輸出,ES:BP存儲字符串地址
遇到的問題及解決:
1.報錯
可以考慮在執行configure時添加參數LIBS='-lX11'
./configure --enable-debugger --enable-disasm --enable-readline LIBS='-lX11'
2.報錯make: *** [Makefile:429: install_bin] Error 1
解決 加上sudo權限即可