實驗一 查看CPU和內存,使用機器語言和匯編語言進行編程
1.預備知識:Debug的使用
Debug是DOS、Windows提供的實模式(8086方式)程序的調試工具。使用它,可以查看CPU各種寄存器中的內容、內存的情況和在機器碼級跟蹤程序的運行。是匯編程序設計中常用的調試工具。在Debug環境下,可以調試經匯編、連接后生成的可執行程序,編寫簡單的程序。
在32位操作系統下debug的啟動與退出:
啟動:
方法一:單擊“開始”→“運行”(或使用快捷鍵Windows+R),輸入cmd,確定,進入dos界面,輸入debug,回車,進入debug調試環境,以短線“—”為命令提示符。
方法二:單擊“開始”→“運行”(或使用快捷鍵Windows+R),輸入debug,確定,即進入debug調試環境,以短線“—”為命令提示符。
退出:
使用q命令,回車即可。
Debug命令格式和參數:
在debug中的命令大小寫等價;
Debug中數字默認為十六進制表示,不需要加H;
在debug中輸入命令后,按下回車鍵執行;按下ctrl+c則終止命令的執行;
在debug中命令和參數之間可以沒有分隔符(如空格)。
在64位操作系統下使用debug:
Debug不能在64位操作系統下運行,因此需要下載debug與32位DOS模擬器(在此使用DOSBOX)。
DOSBOX下載:https://www.dosbox.com/download.php?main=1
安裝下載Debug.exe
環境配置:找到DOSBox安裝目錄下的DOSBox 0.74 Options.bat文件,然后雙擊:
進入文本,在末尾添加如圖示:
在此環境已配置好了。
2. 常用debug功能
l 用r命令查看、改變CPU寄存器的內容:
—R<回車>
顯示所有寄存器的值
—R AX<回車>
顯示當前AX所謂值為0000,若要修改,則在冒號后輸入要修改的值,如輸入1234,回車再用—R AX查看,可見AX值已修改。如若不修改,則兩次回車即可。
l D命令查看內存中的內容:
—D<回車>
D命令直接查看,列出預設地址處128位個字節內容
—D 地址
—D 1001
顯示從當前地址開始之后128個字節內容
—D 地址范圍
—D 1001 1008
兩種方式顯示指定范圍內存儲單元的內容,如上圖
l E命令改寫內存中內容;
—E 地址 數據 數據·····(或字符)
—E 1001 0 1 2 3 4 5 6 7
用E命令修改從1001開始的8個單元的內容,用D查看內容變化
也可以用提問方式逐個修改:
a. 輸入E 1001,按enter鍵;
b. Debug顯示起始地址,和起始單元內容,光標停在”.”后提示想要寫入數據,輸入數據按空格,用輸入數據修改當前內存單元;或不輸入數據直接按空格,即不對當前單元進行修改;
c. 當前單元處理完成后,接着顯示下一單元的內容,並提示凈宗修改,同樣方法進行處理;
d. 當所有希望改寫的內存單元改寫完后,按enter鍵,E命令操作結束。
也可用E命令向內存中寫入字符串。
l 用U命令將內存中的機器指令翻譯成匯編指令
用E命令向內存中寫入機器碼,D命令查看寫入的機器碼用U命令可以查看每一條機器指令的地址、機器指令,並將內存單元中的內容翻譯為匯編指令並顯示出來。
l 用T命令執行一條機器指令
用E命令向從1000:0開始的內存單元中寫入8個字節的機器碼;R命令查看CPU中寄存器的狀態,CS=073F,IP=0100,指向內存073F:0100;用R命令修改CS、IP中的內容,使CS:IP指向1000:0。然后就可以用T命令來執行我們寫入的指令,執行后,AX中的內容變為1,IP變為IP+3。
l 用A命令以匯編指令的格式在內存中寫入一條機器指令
—A 起始地址,以匯編語言向從1000:0開始的內存單元中寫入了幾條指令,然后用D命令查看A命令的執行結果
—A 回車,從預設的地址開始輸入,想要結束A命令,則不輸入匯編指令,直接按enter鍵即結束A命令
—?<回車>
顯示常用命令集,可幫助快速找到所需命令。
2. 實驗任務
(1)使用debug,將下面的程序段寫入內存,逐條執行,觀察每條指令執行后CPU中相關寄存器中內容的變化。
提示:用E命令和A命令以兩種方式將指令寫入內存,T命令執行時注意CS:IP的指向。
用E命令從1000:0處開始寫入機器碼,因為有長度限制,我只寫到第八條bb 26 00這一條,輸入R命令查看CPU內容,並修改CS:IP使其指向1000:0。然后使用T命令逐條執行機器碼如下:
同樣方法從1000:0012處開始寫從bb 26 00以下的機器碼,CS:IP指向1000:0012
用A命令以匯編指令方式寫入內存,打開DOSBOX,輸入debug進入調試模式,使用R命令修改CS:IP的內容使其指向1000:0,先用D命令查看從1000:0開始的單元內容,然后用A命令從1000:0處開始逐條寫入匯編指令,再次用D命令查看匯編指令執行后單元里面的內容。
(2)將下面三條指令寫入從2000:0開始的單元中,利用這三條指令計算2的八次方。
MOV AX,1
ADD AX,AX
JMP 2000:0003
一直逐條執行T命令,直到AX=0100,因為debug程序中數字默認16進制,100H=256=2^8
計算所需執行指令條數 (3+2*7=17=11H),也可直接輸入: —T=0 11
(3)查看內存中的內容。PC機主板上的ROM中寫有一個期,在內存FFF00H~FFFFFH的某幾個單元,請找到並試圖修改它。
可以看見E命令並未修改成功。
這是因為Rom(Read Only Memory)只讀存儲器,這種存儲器(Memory)的內容任何情況下都不會改變,計算機與用戶只能讀取保存在這里的指令,和使用存儲在ROM的數據,但不能變更或存入數據。
(3)向從內存單元B8100H開始的單元中填寫數據,如:
—E B810:0000 01 01 02 02 03 03 04 04
修改數據后:
修改地址后:
實驗發現每兩個字節表示一個字符,其中前一字節控制字符種類,后一字節控制顏色。偏移地址與字符在終端中顯示的位置有關。
實驗總結:
通過這次實驗,我對匯編debug的常用功能有了基本了解,對匯編語言這門課程有了更深層次的認識。知道了debug的調試環境以及配置問題,了解了匯編程序的簡單編寫,知道了機器指令與匯編指令編程的方式。