X86匯編調(diào)試環(huán)境搭建的過(guò)程
最近畢設(shè)需要做一個(gè)基于X86的微型OS內(nèi)核,一直在學(xué)習(xí)匯編,前來(lái)記錄一下
匯編環(huán)境搭建
本次使用vscode搭建的,需要的插件有X86 and X86_64 Assembly(也可以使用masm插件),還有一個(gè)hexdump for VSCode。
安裝NASM,并添加到環(huán)境變量
安裝QEMU,并將其添加到環(huán)境變量下
編寫(xiě)代碼:(代碼來(lái)自30天自制操作系統(tǒng))
; hello-os
; TAB=4
; 標(biāo)準(zhǔn)FAT12格式軟盤(pán)專(zhuān)用的代碼 Stand FAT12 format floppy code
DB 0xeb, 0x4e, 0x90
DB "HELLOIPL" ; 啟動(dòng)扇區(qū)名稱(chēng)(8字節(jié))
DW 512 ; 每個(gè)扇區(qū)(sector)大小(必須512字節(jié))
DB 1 ; 簇(cluster)大?。ū仨殲?個(gè)扇區(qū))
DW 1 ; FAT起始位置(一般為第一個(gè)扇區(qū))
DB 2 ; FAT個(gè)數(shù)(必須為2)
DW 224 ; 根目錄大?。ㄒ话銥?24項(xiàng))
DW 2880 ; 該磁盤(pán)大?。ū仨殲?880扇區(qū)1440*1024/512)
DB 0xf0 ; 磁盤(pán)類(lèi)型(必須為0xf0)
DW 9 ; FAT的長(zhǎng)度(必須是9扇區(qū))
DW 18 ; 一個(gè)磁道(track)有幾個(gè)扇區(qū)(必須為18)
DW 2 ; 磁頭數(shù)(必須是2)
DD 0 ; 不使用分區(qū),必須是0
DD 2880 ; 重寫(xiě)一次磁盤(pán)大小
; 書(shū)中作者說(shuō)原因不明的兩行代碼我查到了,see https://www.ntfs.com/fat-partition-sector.htm
DB 0 ; BPB_Physical_Disk_Number DB (This is related to the BIOS physical disk number. Floppy drives are numbered starting with 0x00 for the A disk. Physical hard disks are numbered starting with 0x80. The value is typically 0x80 for hard disks, regardless of how many physical disk drives exist, because the value is only relevant if the device is the startup disk.)
DB 0 ; BPB_Current_Head DB (Not used by FAT file system)
DB 0x29 ; BPB_Signature DB (Must be either 0x28 or 0x29 in order to be recognized by Windows NT.)
DD 0xffffffff ; BPB_Volume_Serial_Number DD
DB "HELLO-OS " ; 磁盤(pán)的名稱(chēng)(必須為11字節(jié),不足填空格)
DB "FAT12 " ; 磁盤(pán)格式名稱(chēng)(必須是8字節(jié),不足填空格)
TIMES 18 DB 0 ; 先空出18字節(jié)
; 程序主體
DB 0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
DB 0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
DB 0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
DB 0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
DB 0xee, 0xf4, 0xeb, 0xfd
; 信息顯示部分
DB 0x0a, 0x0a ; 換行兩次
DB "hello, world"
DB 0x0a ; 換行
DB 0
TIMES 0x1fe-($-$$) DB 0x00 ; 填寫(xiě)0x00直到0x001fe
DB 0x55, 0xaa
; 啟動(dòng)扇區(qū)以外部分輸出
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
TIMES 4600 DB 0
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
TIMES 1469432 DB 0
; 只是把 RESB 20 改成了 TIMES 20 DB 0
編譯命令
vscode寫(xiě)好后直接終端運(yùn)行
nasm -f bin day1.asm -o day1.img
-f指定輸出格式為bin,本次生成的是img文件,因?yàn)楹罄m(xù)調(diào)試要用,當(dāng)然也可以生成其他類(lèi)型文件
運(yùn)行命令
qemu-system-i386 day1.img
運(yùn)行結(jié)果:

調(diào)試環(huán)境搭建
調(diào)試匯編我們一般用bochs軟件調(diào)試
下載鏈接
進(jìn)入安裝目錄找到一個(gè)叫bochsdbg。exe的程序,我們調(diào)試主要用到這個(gè)程序
打開(kāi)即可看到如下界面

在白色menu框中點(diǎn)擊Disk & Boot選項(xiàng),選擇ATA channel 0下的First HD/CD on channel

修改如下參數(shù)

第一個(gè)指定為磁盤(pán)
第二個(gè)指定img文件路徑
Heads:磁頭數(shù)
Sectors per track :每磁道有幾個(gè)扇區(qū)
這些參數(shù)其實(shí)是由上文的程序指定的程序指定的
DW 18 ; 一個(gè)磁道(track)有幾個(gè)扇區(qū)(必須為18) DW 2 ; 磁頭數(shù)(必須是2)
之后點(diǎn)擊Boot Options中的boot drive設(shè)置為disk即可

點(diǎn)擊ok后會(huì)退到Bochs start menu菜單, 點(diǎn)擊start即可啟動(dòng)調(diào)試
這里展示了一下

注意最下面的s 其實(shí)就是單步調(diào)試的意思,還有注意的是展示的一行匯編代碼實(shí)際是未運(yùn)行的,是下次運(yùn)行的,比如這里的
jmpf 0xf000:e05b
實(shí)際未運(yùn)行,需要輸入s才能運(yùn)行這一步
如果想要跳轉(zhuǎn)個(gè)某個(gè)地址呢 比如0x7c00,該怎么辦呢?
輸入 b 0x7c00 b就是打斷點(diǎn) 運(yùn)行一下
再輸入c就是continue繼續(xù)的意思即可跳轉(zhuǎn)到這
想要退出的話需要輸入2次q即可
后續(xù)有什么命令在繼續(xù)補(bǔ)充吧
需要注意的是匯編代碼必須加前面那個(gè)fat代碼,不然bochs無(wú)法調(diào)試,還有另一種方法是用FixVhdw,這個(gè)方法可以去參考B站UP譚玉剛的視頻。這個(gè)軟件是X86匯編 從實(shí)模式到保護(hù)模式的作者寫(xiě)的。
到此這篇關(guān)于X86匯編調(diào)試環(huán)境搭建的文章就介紹到這了,更多相關(guān)X86匯編調(diào)試環(huán)境內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
8086匯編開(kāi)發(fā)環(huán)境搭建和Debug模式介紹(圖文詳解)
這篇文章主要介紹了8086匯編開(kāi)發(fā)環(huán)境搭建和Debug模式介紹,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01
王爽 匯編語(yǔ)言學(xué)習(xí)筆記(詳細(xì))
王爽匯編語(yǔ)言第三版是一款高清完整版的專(zhuān)業(yè)編程圖書(shū),該書(shū)結(jié)構(gòu)設(shè)計(jì)合理,內(nèi)容全面涵蓋知識(shí)點(diǎn)豐富,適合自學(xué)者使用,有需要者快來(lái)2020-01-01
X86匯編調(diào)試環(huán)境搭建的過(guò)程
本次使用vscode搭建的,需要的插件有X86 and X86_64 Assembly(也可以使用masm插件),還有一個(gè)hexdump for VSCode。 安裝NASM,并添加到環(huán)境變量,下面看下X86匯編調(diào)試環(huán)境搭建的過(guò)程吧2021-11-11
匯編語(yǔ)言DOSBox及debug.exe在Windows64下環(huán)境搭建
這篇文章主要為大家介紹了匯編語(yǔ)言環(huán)境的搭建DOSBox及debug.exe在Windows64下安裝配置過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11
一位數(shù)乘法的匯編語(yǔ)言實(shí)現(xiàn)方法
這篇文章主要介紹了一位數(shù)乘法的匯編語(yǔ)言實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02

