虛擬機安裝MS-DOS環境
安裝Vmware,並下載MS-DOS鏡像。(AMD要啟用SVM)
安裝MS-DOS鏡像
一路Next,重裝完畢后會報錯
這是BIOS啟動設置的問題,按CTRL+ALT+INSERT重啟虛擬機,在vm出現logo時按F2(把握好時間,多試幾次),進入BIOS設置,向右鍵(→)切換到Boot欄,向下鍵(↓)選擇到CD-ROM Drive(變白即為選中),然后按SHIFT和加號(+),將其移動到最頂端。向右鍵(→)切換到Exit欄,選中“Exit Saving Changes”,按兩次回車,保存設置並重啟。
繼續一路Next,然后這一步不選擇“Install Add-Ons”(在選項上按空格即可取消選擇),“Next”
這一步選擇“Enable both UMB and EMS”
選擇“Load both”
選擇“Use default”
選擇“Continue”
然后會提示你是否重啟,在重啟之前,將連接改為使用物理驅動器,然后重啟,不然會一直重裝。
重啟成功
masm和link編譯文件
DOS本身並沒有自帶這兩個軟件,需要我們將masm這個文件夾放到DOS里面。先關閉DOS,然后右鍵進入設置,選擇“硬盤”,在右面的“硬盤實用工具中”,點擊“映射”。去掉“以只讀模式打開文件”的選擇,點擊確定。
這時會自動打開該磁盤(如果沒打開在我的電腦中可以找到該磁盤),把masm文件夾復制進去。
返回虛擬機,點擊“斷開連接”,確定。
使用dir命令可以看到
環境搭建完成。
WIN10下DOSBox安裝
環境
下載DOSBOX和debug.exe
微軟的masm5.0匯編編譯器,文件名為masm.exe
微軟的Overlay Linker3.60 連接器,文件名為link.exe
安裝DOSBOX,並在F盤下新建目錄TASM,把debug.exe、masm.exe、link.exe放入其中。
配置DOSBox
把DOSBOX安裝之后打開安裝文件夾,找到DOSBox 0.74 Options.bat,然后雙擊運行,找到conf文件最后最后一行,改成如下形式:
[autoexec] # Lines in this section will be run at startup. # You can put your MOUNT lines here. MOUNT C F:\TASM C: debug
運行
運行DOSBox,輸入-r查看。
Debug使用
Debug功能
Debug是DOS、Windows 都提供的實模式(8086 方式)程序的調試工具。使用它,可以查看CPU 各種寄存器中的內容、內存的情況和在機器碼級跟蹤程序的運行。
- 用Debug 的R 命令查看、改變CPU 寄存器的內容;
- 用Debug 的D 命令查看內存中的內容;
- 用Debug 的E 命令改寫內存中的內容;
- 用Debug 的U 命令將內存中的機器指令翻譯成匯編指令;
- 用Debug 的T 命令執行一條機器指令;
- 用Debug 的A 命令以匯編指令的格式在內存中寫入一條機器指令。
Debug 的命令比較多,共有20 多個,但這6 個命令是和匯編學習密切相關的。
進入Debug
進入dos,運行debug程序,輸入r查看所有寄存器的內容
R命令修改寄存器中的值
輸入“r ax" 后按Enter 鍵,將出現“:”作為輸入提示,在后面輸入要寫入的數據后按Enter 鍵,即完成了對AX中內容的修改。
修改cs/ip中的值
D命令查看內存中的內容
方式一:d 段地址:偏移地址。Debug將列出從指定內存單元開始的128 個內存單元的內容。例如:d 1000:0
方式二:d 段地址:起始偏移地址 結尾偏移地址。DEBUG從起始位置開始一直顯示到結束位置。例如:d 1000:0 9。
方式三:d 段地址:起始偏移地址 L長度,長度以L參數為標識。DEBUG從起始位置開始顯示指定長度的內容。例如:d 1000:0 L9。
E命令改寫內存
e 段地址:偏移地址 數據 數據 數據……
輸入e 1000:10, 按Enter 鍵。
e 段地址:偏移地址,逐個修改
Debug 顯示起始地址1000:0010, 和第一單元(即1000:0010 單元)的原始內容,然后光標停在“.”的后面提示輸入想要寫入的數據,此時可以有兩個選擇: 其一為輸入數據, 然后按空格鍵,即用輸入的數據改寫當前的內存單元; 其二為不輸入數據,直接按空格鍵,則不對當前內存單元進行改寫。
當前單元處理完成后(不論是改寫或沒有改寫,只要按了空格鍵,就表示處理完成), Debug 將接着顯示下一個內存單元的原始內容,並提示進行修改,讀者可以用同樣的方法處理。所有希望改寫的內存單元改寫完畢后,按Enter 鍵, E 命令操作結束。
用E命令寫入字符
用E命令從內存1000:0 開始寫入數值1、字符“a"、數值2、字符"b"、數值3、字符“C"'。字符“a"、“b"、"C"的ASCII碼十六進制值:61H、62H、63H。
用E命令將機器碼寫入內存
機器碼也是數據,可以用E命令將機器碼寫入內存。
U命令將內存單元中的內容翻譯為匯編指令
T命令執行CS:IP指向的指令
首先6個存儲單元的機器碼寫入內存1000:0000,並查看機器碼對應的匯編指令。
修改cs和ip中存儲的段地址和偏移量,並查看CS、IP寄存器中的地址。以及AX、CX寄存器中的值。
T指令運行CS:IP指向的指令數據,執行完后IP偏移量會自動移動到下一個。
A命令以匯編指令的形式在內存中寫入機器指令
debug指令總結
- 查看、修改CPU 中寄存器的內容: R 命令
- 查看內存中的內容: D 命令
- 修改內存中的內容: E 命令(可以寫入數據、指令,在內存中,它們實際上沒有區別)
- 將內存中的內容解釋為機器指令和對應的匯編指令: U 命令
- 執行CS:IP 指向的內存單元處的指令: T 命令
- 以匯編指令的形式向內存中寫入指令: A 命令
參考鏈接: