注意觀察圖中,CS和IP的值:
CS:IP處的地址就是CPU當前要讀取、執行的指令。
Debug還列出了CS:IP所指向的內存單元處所存放的機器碼,並將它翻譯成爲彙編治指令。
圖中,CS:IP所指向的內存單元爲0AE1:0100,此處存放的機器碼爲 DF9989916,對應的彙編指令爲:c++
FISTP WORD PTR [BX+DI+1689]
還能夠用R命令來修改寄存器中的內容:翻譯
(5)使用debug中的D命令查看內存中的內容。
咱們使用「D 段地址:偏移地址」的格式來查看某個內存中的內容。好比查看內存10000H中的內容,地址格式是1000:0,而後用"D 1000:0"列出1000:0處的內容:
使用「D 段地址+偏移地址」的格式,Debug將列出從指定內存單元開始的128個內存單元的內容。
好比,咱們運行命令「D 0AE1:0100」,結果如圖所示:debug
解析:
使用D命令,Debug將輸出三部分的內容:code
- 左邊是每行的起始地址。
- 右邊是每一個內存單元中的數據對應可顯示的ASCII碼字符。
- 中間部分是從指定地址開始的128個內存單元的內容,用16進制的格式輸出,每行的輸出從16的整數倍的地址開始,最多輸出16個單元的內容。
注意每行的中間有一個「-」,將每行的輸出分紅兩部分,這僅僅是爲了便於查看。
咱們看到的內存中的內容,在不一樣的計算機中是不同的,也可能每次用Debug看到的內容都不相同。
由於咱們用Debug看到的都是原來就在內存中的內容,這些內容受隨時都有可能變化的系統環境的影響。內存
使用「D 1000:9」查看1000:9處的內容:
Debug從1000:9開始顯示,一直到1000:88,一共是128個字節。第一行中的1000:0~1000:8的內容不顯示。字符串
在使用「D 段地址:偏移地址」,以後,接着使用D命令,可列出後續的內容:bug
也能夠指定D命令的查看範圍:
D 段地址:起始偏移地址 結尾偏移地址。im
好比要看1000:0~1000:9中的內容:數據
(6)用Debug的E命令改寫內存中的內容。img
將內存1000:0~1000:9單元中的內分別寫爲0,1,2,3,4,5,6,7,8,9,能夠用「E 起始地址 數據 數據 數據…………」的格式來進行;
用E命令向內存中寫入字符,好比:用E命令從內存1000:0開始寫入:一、「a」 、二、「b」、三、「c」。結果以下:
用E命令向內存中寫入字符串,好比,用E命令從內存1000:0開始寫入:一、」a+b「、二、」c++「、三、」IBM「。結果以下:
(7)用E命令向內存中寫入機器碼,用U命令查看內存中機器碼的含義,用T命令執行內存中的機器碼。
從內存1000:0單元開始寫入這樣一段機器碼:
mov ax,0001 //機器碼:b80100 mov cx,0002 // 機器碼:b90200 add ax,cx //機器碼:01c8
**咱們能夠用U命令查看咱們寫入內存的或內存中原有的機器碼所對應的機器指令
用U命令將從1000:0開始的內存單元中的內容翻譯爲彙編指令,並顯示出來。U命令的顯示輸出分爲3部分:每一條機器指令的地址、機器指令、機器指令所對應的彙編指令。
咱們能夠看到,內存中的數據和代碼沒有任何區別。關鍵在於如何解釋。
用debug的T命令能夠執行一條或多條指令,簡單地使用T命令,能夠執行CS:IP指向的指令。要使用T命令執行寫到1000:0的指令,有以下兩個步驟:
- 先讓CS:IP指向1000:0
- 用R命令修改CS、IP中的內容,使CS:IP指向1000:0
- 使用T命令執行咱們寫入的指令(此時,CS:IP指向咱們的指令所在的內存單元)
- 執行T命令後,CPU執行CS:IP所指向的指令,則1000:0處的指令B8 01 00(mov ax,0001)獲得執行,指令執行後,debug顯示輸出CPU中寄存器的狀態。
指令執行後,AX中的內容被改寫爲1,IP變爲IP+3(由於mov ax,ooo1的指令長度爲3個字節),CS:IP指向下一條指令。
咱們能夠繼續用T命令向下執行指令:
(8)用debug的A命令以彙編指令的形式在內存中寫入機器指令。
能夠看到,在使用A命令寫入指令時,咱們輸入的是彙編指令,Debug將這些彙編指令翻譯爲對應的機器指令,將它們的機器碼寫入內存。
本次實驗中須要用到的命令
- 查看、修改CPU中寄存器的內容:R命令
- 查看內存中的內容:D命令
- 修改內存中的內容:E命令(能夠寫入數據、指令,在內存中,它們實際上沒有區別)
- 將內存中的內容解釋爲機器指令和對應的彙編指令:U命令
- 執行CS:IP指向的內存單元處的指令:T命令
- 以彙編指令的形式向內存中寫入指令:A命令