最近在看操作系統的實現過程,目前正在看真實模式和保護模式這塊,真實模式下的16位元彙編程式有時候會需要偵錯,於是準備在dos下使用debug進行偵錯,本文主要記錄偵錯過程中遇到的一些坑
過程可以參考怎麼在 Linux 中執行 DOS 程式
簡化過程如下:
qemu-img create dos.img 200M
,第一次使用這個命令,使用hexdump檢視可以發現裏面的內容全部都是0,檔案型別爲data
(就是一個dd命令建立一個全爲0的檔案)
qemu-system-i386 -m 16 -k en-us -rtc base=localtime -soundhw sb16,adlib -device cirrus-vga -display gtk -hda dos.img -cdrom FD12CD.iso -boot order=d
這個選項看起來很長,簡單解釋就是建立一個記憶體爲16m(-m 16
),具有一個硬碟(hda dos.img
)dos.img和一個cd-rom(cdrom FD12CD.ISO
)的虛擬機器,兩個盤分別掛載到dos的C槽(dos.img)
和D槽(FD12CD.ISO)
上。至於-boot order=d
選項是指定啓動盤爲D槽
也就是從下載好的iso檔案啓動,因爲這個時候C槽還是空的。
安裝很簡單,一直按yes就ok了,中間會提示你掛載的C槽需要格式化爲特定的格式(後面看了一下是格式化爲FAT16檔案系統)
啓動選項和之前的安裝選項差不多,只不過這裏不需要cd-rom了,dos已經安裝在了我們的硬碟dos.img上了,因此把啓動盤改爲C槽就好了
qemu-system-i386 -m 16 -k en-us -rtc base=localtime -soundhw sb16,adlib -device cirrus-vga -display gtk -hda dos.img -drive file=fat:rw:dosfiles/ -boot order=c
plus:-drive file=fat:rw:dosfiles/
是將dosfiles這個資料夾掛載到dos的D槽上作爲與linux共用檔案的媒介
mov sp, #0x180
,後面就沒辦法執行了,dos提示file not found
然後就卡死了,查資料也沒找到什麼原因。最後還是放棄了這種方法plus:
dos中debug執行:
細心點可以發現初始ip = 0100
,而我們使用nsam編譯的程式是從0地址開始的,所以只要指定程式起始有0100
的偏移就好了,以上程式去掉第一行的註釋,再次編譯執行就OK了
(看書不仔細,偵錯兩行淚)
隨便找了一個answer: