X86匯編調試環境搭建的過程
最近畢設需要做一個基於X86的微型OS內核,一直在學習匯編,前來記錄一下
匯編環境搭建
本次使用vscode搭建的,需要的插件有X86 and X86_64 Assembly(也可以使用masm插件),還有一個hexdump for VSCode。
安裝NASM,並添加到環境變量
安裝QEMU,並將其添加到環境變量下
編寫代碼:(代碼來自30天自制操作系統)
; hello-os ; TAB=4 ; 標準FAT12格式軟盤專用的代碼 Stand FAT12 format floppy code DB 0xeb, 0x4e, 0x90 DB "HELLOIPL" ; 啟動扇區名稱(8字節) DW 512 ; 每個扇區(sector)大小(必須512字節) DB 1 ; 簇(cluster)大小(必須為1個扇區) DW 1 ; FAT起始位置(一般為第一個扇區) DB 2 ; FAT個數(必須為2) DW 224 ; 根目錄大小(一般為224項) DW 2880 ; 該磁盤大小(必須為2880扇區1440*1024/512) DB 0xf0 ; 磁盤類型(必須為0xf0) DW 9 ; FAT的長度(必須是9扇區) DW 18 ; 一個磁道(track)有幾個扇區(必須為18) DW 2 ; 磁頭數(必須是2) DD 0 ; 不使用分區,必須是0 DD 2880 ; 重寫一次磁盤大小 ; 書中作者說原因不明的兩行代碼我查到瞭,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 " ; 磁盤的名稱(必須為11字節,不足填空格) DB "FAT12 " ; 磁盤格式名稱(必須是8字節,不足填空格) TIMES 18 DB 0 ; 先空出18字節 ; 程序主體 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 ; 填寫0x00直到0x001fe DB 0x55, 0xaa ; 啟動扇區以外部分輸出 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寫好後直接終端運行
nasm -f bin day1.asm -o day1.img
-f指定輸出格式為bin,本次生成的是img文件,因為後續調試要用,當然也可以生成其他類型文件
運行命令
qemu-system-i386 day1.img
運行結果:
調試環境搭建
調試匯編我們一般用bochs軟件調試
下載鏈接
進入安裝目錄找到一個叫bochsdbg。exe的程序,我們調試主要用到這個程序
打開即可看到如下界面
在白色menu框中點擊Disk & Boot選項,選擇ATA channel 0下的First HD/CD on channel
修改如下參數
第一個指定為磁盤
第二個指定img文件路徑
Heads:磁頭數
Sectors per track :每磁道有幾個扇區
這些參數其實是由上文的程序指定的程序指定的
DW 18 ; 一個磁道(track)有幾個扇區(必須為18) DW 2 ; 磁頭數(必須是2)
之後點擊Boot Options中的boot drive設置為disk即可
點擊ok後會退到Bochs start menu菜單, 點擊start即可啟動調試
這裡展示瞭一下
註意最下面的s 其實就是單步調試的意思,還有註意的是展示的一行匯編代碼實際是未運行的,是下次運行的,比如這裡的
jmpf 0xf000:e05b
實際未運行,需要輸入s才能運行這一步
如果想要跳轉個某個地址呢 比如0x7c00,該怎麼辦呢?
輸入 b 0x7c00 b就是打斷點 運行一下
再輸入c就是continue繼續的意思即可跳轉到這
想要退出的話需要輸入2次q即可
後續有什麼命令在繼續補充吧
需要註意的是匯編代碼必須加前面那個fat代碼,不然bochs無法調試,還有另一種方法是用FixVhdw,這個方法可以去參考B站UP譚玉剛的視頻。這個軟件是X86匯編 從實模式到保護模式的作者寫的。
到此這篇關於X86匯編調試環境搭建的文章就介紹到這瞭,更多相關X86匯編調試環境內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 華為服務器配置raid1和raid5圖文詳解
- Linux磁盤管理方法介紹
- 昂達主板進入bios設置u盤啟動怎麼做 昂達主板進入bios按哪個鍵
- DELL R720服務器安裝Windows Server 2008 R2系統的圖文詳解
- C# Process調用外部程序的實現