1.3 Debug的安裝啟動
利用安裝DOS,同時注意配套的masm的安裝,網上有很多的教程。
啟動后如下圖所示:
二、用R命令查看、改變CPU寄存器的內容
我們可以使用r命令查看CPU中各寄存器的內容:
注意CS和IP的值,CS=1CA7,IP=0100,也就是說,內存1CA7:0100處的指令為CPU當前要讀取、執行的指令。在所有寄存器值的下方,Debug列出了1CA7:0100,同時列出了這個內存單元所存放的機器碼并翻譯成了匯編指令。其中,機器碼為0000,對應的匯編指令為ADD [BX+SI],AL
debug輸出的右下角還有一個信息,DS:0000=CD,這點暫時可以不用理會。
我們還可以用R命令來改變寄存器中的內容,如下圖所示:
如果我們要修改一個寄存器中的值,比如AX中的值,可用R命令后加寄存器名來進行,輸入r ax后按Enter鍵,將出現:做為輸出提示,在:后面輸入要寫入的數據后按Enter鍵,即完成了對AX中內容的修改。
我們也可以利用R命令修改CS和IP中的內容:
如果我們要查看修改后的值,再次調用r指令即可。
三、用D命令查看內存中的內容
如果我們想知道內存處的內容,可以用d 段地址:偏移地址的格式來查看,如圖所示:
使用d 段地址:偏移地址的格式,Debug將列出從指定內存單元開始的128個內存單元的內容。上圖中,Debug列出了1000:0~1000:7F中的內容。上面的內容分為三部分:
中間是從指定地址開始的128個內存單元(內存單元按照字節尋址)的內容,用十六進制的格式輸出,每行的輸出從16的整數倍的地址開始,最多輸出16個單元的內容。從上圖中,我們可以知道匯編語言轉換成機器碼,內存1000:0單元中的內容是00H,內存1000:1單元中的內容是50H,內存1000:0~1000:F中的內容都在第一行。注意在每行的中間有一個"-",它將每行的輸出分成兩部分,這樣便于查看。左邊是每行的起始地址右邊是每個內存單元中的數據對應的可顯示的ASCⅡ碼字符。當沒有對應可顯示的ASCⅡ字符,Debug就用"."來代替。
當我們使用d 1000:9查看1000:9處的內容,Debug將怎么樣輸出呢?如下圖所示:
可以看到Debug從1000:9開始顯示,一直到1000:88,一共是128個字節。第一行中的1000:0~1000:8單元中的內容不顯示。
在使用d 段地址:偏移地址之后,接著使用D命令,可列出后續的內容,如下圖所示:
我們也可以指定D命令的查看范圍,此時采用d 段地址:起始偏移地址 結尾偏移地址的格式。比如要看1000:0~1000:9中的內容,可以用"d 1000:0 9"實現,如下圖所示:
四、用E命令改寫內存中的內容
可以使用E命令來改寫內存中的內容,比如,要將內存1000:0~1000:9單元中的內容分別寫為0、1、2、3、4、5、6、7、8、9,可以用"e 起始地址 數據 數據 數據 …"的格式來進行,如下圖所示:
也可以采用提問的方式來一個個地改寫內存中的內容,如下圖所示:
步驟如下:
輸入e 1000:10,按Enter鍵Debug顯示起始地址1000:0010,和第一單元(即 1000:10單元的原始內容:FA,然后光標停在"."的后面提示輸入想要寫入的數據,此時可以有兩個選擇:其一為輸入數據(我們輸入的是0),然后按空格鍵,即用輸入的數據改寫當前的內存單元;其二為不輸入數據,直接按空格鍵,則不對當前內存單元進行改寫。當前單元處理完成后(不論是改寫還是沒有改寫,只要按了空格鍵,就表示處理完成),Debug將接著顯示下一個內存單元的原始內容,并提示進行修改,我們可以用同樣的方法處理所有希望改寫的內存單元改寫完畢后,按Enter鍵,E命令操作結束
我們也可用E命令向內存中寫入字符串,如下圖所示:
五、用E命令寫入機器碼,用U命令查看機器碼的含義,用T命令執行機器碼
我們知道匯編語言轉換成機器碼,機器碼也是數據,所以可以用E命令將機器碼寫入內存。比如我們要從內存1000:0單元開始寫入這樣一段機器碼:
機器碼 對應的匯編指令
b80100 mov ax,0001

b90200 mov cx,0002
01c8 add ax,cx
就可以用下圖第二行所示的方式使用E命令寫入機器碼。
在上圖中,首先用E命令向從1000:0開始的內存單元中寫入了8個字節的機器碼;然后用D命令查看內存1000:0~1000:1f中的數據(從數據的角度看一下寫入的內容);最后用U命令查看從1000:0開始的內存單元中的機器指令和它們所對應的匯編指令。
U指令的顯示輸出分為3部分:每一條機器指令的地址、機器指令、機器指令所對應的匯編指令,我們可以看到:
從上面,我們可以再一次看到內存中的數據和代碼沒有任何區別,關鍵在于如何解釋。
完成了上面的步驟后,我們就可以使用Debug的T命令來執行我們寫入的指令了,在執行指令前,我們需要將CS:IP指向我們所需要的指令:
完成上面的步驟后,我們就可以使用T命令來執行我們寫入的指令了(此時,CS:IP指向我們的指令所在的內存單元)。執行T命令后,CPU執行CS:IP指向的指令,則1000:0處的指令b8 01 00(mov ax,0001)得到執行,指令執行后,Debug顯示輸出CPU中寄存器的狀態。
可以看到,指令執行后,AX中的內容被改寫為1,IP改變為IP+3,CS:IP指向下一條指令。
我們可以繼續執行下面的指令,一個完整的流程如下所示:
六、用Debug的A命令以匯編指令的形式在內存中寫入機器指令
前面我們使用E命令寫入機器指令,這樣做很不方便。Debug提供了A命令,可以以匯編指令的形式寫入指令。A命令的使用方法如下所示:
在上圖中,首先用A命令,以匯編語言向從1000:0開始的內存單元中寫入了幾條指令,然后用D命令查看A命令的執行結果。可以看到,在使用A命令寫入指令時,我們輸入的是匯編指令,Debug將這些匯編指令翻譯為對應的機器指令,將它們的機器碼寫入內存。
使用A命令寫入匯編指令時,在給出的起始地址后直接按Enter鍵表示操作結束。