下面是第一次匯編實驗的具體內容以及我的收獲。
首先,是實驗任務的具體操作以及相關說明。
實驗任務(1):使用debug,將下面的程序段寫入內存,逐條執行,觀察每條指令執行后CPU中相關寄存器中內容的變化。
具體操作:1)嘗試用e命令修改內存單元里的內容,我首先調用了d命令查看原來內存單元的初始內容,接着,調用e命令將內存單元原先的值修改為題中所給的數據。最后再次調用d命令查看此時內存單元中的內容是否發生改變,同時調用u命令查看此時的匯編指令。(在這里我進行修改的內存單元地址就是原先CS:IP指向的地址。)

(——調用e命令修改)

(——調用u命令查看匯編指令)
2)嘗試用a命令以匯編指令的形式在內存中寫入機器指令。首先調用a命令將匯編指令寫入,其次,調用t命令單步調試該程序段,最后我調用了d命令查看此時的內存單元里的內容是否發生了相應的改變。

(——調用a命令寫入匯編指令)
...
(——調用t命令單步調試該程序段,此處由於單步調試的次數過多,故截圖時省略了中間單步調試的過程)

(——調用d命令查看此時內存單元內容)
實驗任務(2):將下面3條指令寫入從2000:0開始的內存單元中,利用這3條指令計算2的8次方。
具體操作:這里主要考察修改寄存器CS與IP的值。由於語句3 JMP 2000:0003,將IP的值修改為0003,與語句2構成一個循環,此時要計算2的8次方只需要知道要循環多少次即可。同時最后的結果將保存在ax寄存器中。

(——實現2的8次方)
同時在這里我遇到了一個問題,t命令后面可以直接跟單步執行的次數,我根據單步調試得出計算2的8次方一共需要單步調試16次,然后我就想先調試一次給出CS與IP此時的值后直接連續單步調試15次,就出現了如下的情況:(已經超過了2的8次方,當我連續單步調試10次時方出現2的8次方的值,不知道是為什么?)

(???question)
實驗內容(3):查看內存中的內容。在內存FFF00H~FFFFFH的某幾個單元中,找到生產日期並試圖改變它。
具體說明:該實驗中主要要注意
1)如何將用CS、IP的值指向物理地址。(有多種方法);
2)如何用d命令查看內存中的內容;
3)該段內存地址在8086CPU中具體是哪一塊內存地址分配空間。

由圖可見,試圖改變表示日期的內存單元的內容卻改不了,這主要和CPU內存地址空間分配的情況有關,

如圖所示,在8086CPU機內存地址空間分配中,FFF00H~FFFFFH是各類ROM地址空間,此時向FFF00H~FFFFFH的內存單元中寫入數據的操作是無效的,因為這等於只改寫只讀存儲器中的內容。
實驗任務(4):向內存從B810H開始的單元中填寫數據,觀察產生的現象,在改寫填寫的地址,觀察產生的現象。
具體操作:1)首先調用e命令修改內存單元,修改偏移地址為0000,0002,0004,0006的內存單元內容,觀察其產生的現象。

2)在此基礎上,修改偏移地址為0001,0003,0005,0007的內存單元內容,觀察其變化。

3)改變地址,向內存從2000:0開始的單元中填寫數據,觀察其有何變化。

(——調用e命令修改內存單元的內容)
![]()
(——查看修改后從2000:0到2000:0007的內存地址中存放的值)
這與實驗任務(3)是一樣的原理,只不過在8086CPU機內存地址空間分配中,內存從B810H到BFFFH 是顯存地址空間,用e命令修改的是顯存,故而會在屏幕上顯示出類似愛心,笑臉的圖形。根據觀察還可以發現,修改偏移地址為0000,0002,0004,0006的內存內容,出現的是圖案,當在此基礎上修改偏移地址為0001,0003,0005,0007的內存內容,會發生顏色變化。這真是一件神奇的事情!
具體的實驗操作就是上述的這么多了,接下來說說我的收獲與體會。在本次試驗中我對於a,d,e,r,u,t等命令有了更深入的認識,其中給我印象最深,也是比較容易出現error的就是t命令、g命令、u命令。由於它們的用法比較多,所以比較容易搞混。下圖是debug中的一些命令用法,可以看出調用g,t,p命令時address的前面有等號,其他則沒有,在使用時要格外注意這一點。
舉例來說,調用t命令時,有3種用法。(1)t后面不帶參數,-t即表示從當前CS:IP開始單步調試一次,(2)t后面帶參數,-t=2000:0即表示從CS為2000,IP為0的地址開始單步調試一次,(此時即不在默認CS:IP所指地址位置進行調試,若想要讓t不帶參數,也可以修改CS與IP的值)(3)t后面帶參數,-t=2000:0 5即表示從CS為2000,IP為0的地址開始連續單步調試5次。
調用g命令時,若要確定調試的范圍,應這樣寫-g=0:200 0:208(后一個地址要寫全,不能只寫偏移地址),同時還需注意g命令的另一種用法,-g 208 ,該條語句的意思是從當前CS與IP所指的地址開始執行到CS:207(不包括偏移地址為208的內存單元)。
與此不同的是u即反匯編指令,它有3種用法,(1)-u 0:200 208即從0:200執行到0:208結束(是包括偏移地址為208的內存單元),(2)-u 0:200 l9即從0:200開始連續反匯編9個字節結束,(3)-u 0:200即從0:200開始連續反匯編32個字節結束。

還有e命令,我覺得也要注意一下它的用法。e命令修改內存單元的內容,支持單(雙)引號,支持連續字符。


