有關CPU和存儲單元的概念在前一節咱們已經瞭解,那麼如何觀察實際機器內部的狀況呢?能不能看到具體的寄存器、標誌、存儲單元的內容呢?可不能夠修改和控制它們呢?linux
DEBUG這個有力工具,就能夠深刻到機器內部進行觀察了。程序員
在DOS操做系統和Windows操做系統中,都提供了調試工具DEBUG。DEBUG是爲彙編語言設計的一種調試工具。工具
DEBUG命令有20多個,咱們主要學習最經常使用的命令。學習
DEBUG要先進入DOS環境中再使用,linux虛擬環境中進入DOS的方法:spa
DOSemu
進入DOS環境,DOSemu
也有其餘參數,能夠輸入dosemu --help
查看exitemu
基本的DOS命令:操作系統
DOS和DEBUG命令都支持大小寫。命令行
要觀察計算機內部的狀況,可直接進入DEBUG。若是要調試及觀察可執行文件,則要在DEBUG後加上文件名和擴展名.EXE。咱們先觀察,所以直接鍵入DEBUG
進入系統,如圖所示。翻譯
DEBUG的提示符是小短線- ,在其後輸入命令。debug
R命令有兩種用法:直接鍵入R——將顯示CPU全部的寄存器和標誌位;設計
修改寄存器——在R後跟寫寄存器名,回車後先顯示寄存器的內容,在冒號後鍵入新的值;再用R命令就可看到修改後的內容了。將AX寄存器的值改成1234H。
再來看四個段寄存器DS、ES、SS、CS的值都是07BE,說明如今系統處在同一個邏輯段中(不一樣的系統環境下,段寄存器的值可能不同)。操做系統根據內存的狀況爲各段分配段地址,所以每臺機器或每次運行時段地址值可能會不同。
IP指令指針寄存器的值是0100H,表示將要執行的指令在代碼段的0100H單元中。該指令單元的邏輯地址應該由CS:IP構成,即0AFA:0100H。
咱們來看在寄存器的下面那一行的表示。該行顯示的是代碼段的一條指令的反彙編。所謂反彙編,指的是將二進制的機器指令顯示成彙編指令。由三部分構成:最左邊07BE:0100表示該指令所在單元的邏輯地址,中間F60000表示該指令的機器碼,第3列顯示爲彙編指令TEST。
內存每16個字節單元爲一小段,邏輯段必須從小段的首址開始。用D命令能夠查看存儲單元的地址和內容。
D命令格式爲:
D 段地址:起始偏移地址 [結尾偏移地址] [L範圍]
例如:
D DS:0 查看數據段,從0號單元開始 D ES:0 查看附加段,從0號單元開始 D DS:100 查看數據段,從100H號單元開始 D 0200:5 15 查看0200H段的5號單元到15H號單元(在虛擬機上該命令不能執行) D 0200:5 L 11 用L選擇範圍。查看0200H段的5號單元到15H號單元共10個單元
其中左邊一列爲邏輯地址,中間部分爲存儲單元的內容。每行爲16個字節單元,中間的小橫線用於區分前8個單元和後8個單元。在邏輯地址中只給出每行第一個單元的偏移地址,其他15個單元的偏移地址沒有標出。能夠推斷出圖中第一行單元的偏移地址從0000H到000FH,第二行單元的偏移地址爲0010H~001FH,以此類推。右邊部分顯示出內存單元中的ASCII碼錶示的字符,沒法顯示時用小點代替。
若是在D後面直接寫出偏移地址,則顯示當前數據段下偏移地址開始的內存單元,如:
D 10 從數據段10H號單元開始顯示
D100 從數據段100H號單元開始顯示
注意:屢次鍵入D,可連續顯示後面的單元內容。
用E命令能夠改寫多個存儲單元的內容。格式爲:E 起始地址 修改值 修改值 …
例如:將數據段中的DS:3~DS:5 三個單元的內容修改成1四、1五、16。命令爲
E DS:3 14 15 16
若是E後面直接跟偏移地址,則修改當前數據段下偏移地址所指單元值;還能夠用E命令修改其它段的存儲單元內容。
E 10 修改當前數據段10H號單元內容 E ES:100 修改附加段100H號單元內容 D ES:100 查看一下100H單元的內容是否修改了
輸入彙編指令,系統自動地將鍵入的彙編指令翻譯成機器代碼,並相繼地存放在從指定地址開始的存儲區中。因爲DEBUG下的數值默認爲十六進制數,所以先要將十進制數轉換成十六進制數。
例如,前一節提到的計算Z=35+27的彙編指令爲:
MOV AX,23H
ADD AX,1BH
MOV [0000],AX
輸入A命令後,系統自動地給出邏輯地址爲0AEE:0100(CS:偏移地址),在其後輸入彙編指令,回車後可輸入下一條指令,直接回車則退出輸入。操做過程以下:
也能夠在A命令後給出指令的存放地址,如A CS:0000,表示從代碼段的0號單元開始存放輸入的指令。
程序員編寫的彙編語言源程序通過彙編(編譯)後生成了二進制的機器指令代碼,而U命令可將二進制的機器指令變爲助記符形式的彙編指令,所以稱之爲「反彙編」。
經過U命令,咱們能夠獲得機器指令與彙編指令的對照,瞭解機器指令的存儲狀況
第一列爲邏輯地址,第二列爲機器指令,第三列爲彙編指令
注意:上圖顯示的程序代碼並非用戶編寫的程序,由於在輸入DEBUG命令時沒有附加exe文件。這段程序代碼是系統代碼段中保存的內容,有多是系統程序,也有多是無效的代碼。
U後跟偏移地址,則從該地址開始反彙編。如:
U 0 從代碼段0號單元開始反彙編
U100 從代碼段100H號單元開始反彙編
注意:屢次鍵入U,可連續顯示後面的程序部分。
輸入完指令後,應該執行它。
T命令能夠一條一條地執行指令,至關於逐過程調試。
P命令的做用與T命令相同,當遇到中斷指令INT n和調用指令CALL時,會進入子程序,至關於逐語句調試。
下面執行第四步中的彙編指令:
本次執行前,先用R命令查看指令指針寄存器IP的值是否爲0100,若是不是,用R IP命令修改成0100。表示如今要從CS:0100單元開始執行指令。
T命令每執行一次,都會顯示當前寄存器的情況,咱們能夠隨時瞭解指令的執行狀況。
用D DS:0命令查看該單元的值已經爲003B(兩個字節單元爲一個字單元),這裏相似大端法,高位在高地址,低位在低地址。
T命令還能夠連續執行多條指令。如上例中連續執行3條指令,可用以下T命令:
-T 3
T命令也能夠設置開始地址和執行條數。如上例中從0100H開始連續執行3條指令,可用以下T命令:
-T =0100 3
鍵入Q,回車後退出DEBUG,返回到DOS下。