dos下偵錯彙編程式

2020-08-10 01:44:03
前言

最近在看操作系統的實現過程,目前正在看真實模式和保護模式這塊,真實模式下的16位元彙編程式有時候會需要偵錯,於是準備在dos下使用debug進行偵錯,本文主要記錄偵錯過程中遇到的一些坑

dos環境搭建

過程可以參考怎麼在 Linux 中執行 DOS 程式
簡化過程如下:

1. 使用qemu-img建立一個虛擬磁碟

qemu-img create dos.img 200M,第一次使用這個命令,使用hexdump檢視可以發現裏面的內容全部都是0,檔案型別爲data(就是一個dd命令建立一個全爲0的檔案)

2. qemu選項:

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槽還是空的。

3. 安裝dos

安裝很簡單,一直按yes就ok了,中間會提示你掛載的C槽需要格式化爲特定的格式(後面看了一下是格式化爲FAT16檔案系統)

4. 啓動dos

啓動選項和之前的安裝選項差不多,只不過這裏不需要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共用檔案的媒介

程式偵錯

坑點

  1. 以前學彙編的時候是使用的masm+link來編譯鏈接寫好的彙編程式碼爲可執行檔案,參考的三本書中,第一本彙編語言(第三版 王爽著)這本書上面使用的也是這種方法。但是第二本linux0.11內核完全註釋當中,bootsect.s和setup.s使用的是as86和ld86編譯鏈接,第三本參考書自己動手寫操作系統使用的nasm編譯爲bin檔案,不鏈接。一開始使用的as86和ld86在linux下編譯鏈接後放到dos中執行,程式如下:
    在这里插入图片描述
    直接在dos下執行會輸出亂碼,我猜測可能是數據段設定與實際不一樣導致找不到BootMsg,所以輸出了錯誤的記憶體數據,使用debug偵錯會卡在mov sp, #0x180,後面就沒辦法執行了,dos提示file not found然後就卡死了,查資料也沒找到什麼原因。最後還是放棄了這種方法
  2. 使用nasm編譯爲純二進制檔案直接執行,放入dos中偵錯也是輸出亂碼,好在nasm文件較多,同時nasm也自帶了一個ndisasm反彙編工具可以檢視反彙編結果,最開始的程式如下(就差了這個第一行):
    在这里插入图片描述
    反彙編的結果:
    在这里插入图片描述
    其中BootMsg的偏移量爲26,int10 13功能號對應的子程式呼叫使用es:bp作爲字串首地址,輸出亂碼的原因應該就是字串首地址錯了。

plus:
在这里插入图片描述

解決方案

dos中debug執行:
在这里插入图片描述
細心點可以發現初始ip = 0100,而我們使用nsam編譯的程式是從0地址開始的,所以只要指定程式起始有0100的偏移就好了,以上程式去掉第一行的註釋,再次編譯執行就OK了
在这里插入图片描述
(看書不仔細,偵錯兩行淚)
在这里插入图片描述
隨便找了一個answer:
在这里插入图片描述