調試工具DEBUG的使用(8086)

    有關CPU和存儲單元的概念在前一節咱們已經瞭解,那麼如何觀察實際機器內部的狀況呢?能不能看到具體的寄存器、標誌、存儲單元的內容呢?可不能夠修改和控制它們呢?linux

   DEBUG這個有力工具,就能夠深刻到機器內部進行觀察了。程序員

調試工具DEBUG

在DOS操做系統和Windows操做系統中,都提供了調試工具DEBUG。DEBUG是爲彙編語言設計的一種調試工具。工具

1. DEBUG的主要命令

DEBUG命令有20多個,咱們主要學習最經常使用的命令。學習

  • R ——查看和修改寄存器
  • D ——查看內存單元
  • E ——修改內存單元
  • U ——反彙編,將機器指令變爲彙編指令
  • T /P——單步執行
  • G ——連續執行程序
  • A ——輸入彙編指令
  • Q ——退出

2. 進入DOS

DEBUG要先進入DOS環境中再使用,linux虛擬環境中進入DOS的方法:spa

  1. 進入Linux的命令行終端
  2. 輸入DOSemu進入DOS環境,DOSemu也有其餘參數,能夠輸入dosemu --help查看
  3. 退出DOS環境,在DOS中輸入命令exitemu
  4. 或者在桌面上雙擊dosemu圖標,直接進入DOS

基本的DOS命令操作系統

  • cd\ ——首先要用cd\ 退回到根目錄C>下
  • dir ——顯示文件列表
  • md hb ——創建hb子目錄
  • cd hb ——進入hb子目錄
  • copy d:\dos\masm.exe c:\hb ——將D盤dos目錄下的masm.exe拷貝到C盤hb目錄下
  • copy d:\dos\link.exe c:\hb ——將D盤dos目錄下的link.exe拷貝到C盤hb目錄下
  • cd .. ——退回到上一級目錄
  • del \hb\masm.exe ——刪除hb子目錄中的某文件
  • rd hb ——刪除hb子目錄(子目錄中的全部文件必須先刪除)
  • e:——進入e盤
  • cls ——清屏
  • type——顯示文本文件內容(如type c:\hb\abc.asm)

DOS和DEBUG命令都支持大小寫命令行

3. 進入DEBUG

要觀察計算機內部的狀況,可直接進入DEBUG。若是要調試及觀察可執行文件,則要在DEBUG後加上文件名和擴展名.EXE。咱們先觀察,所以直接鍵入DEBUG進入系統,如圖所示。翻譯

DEBUG的提示符是小短線 ,在其後輸入命令。debug

1. R命令——查看和修改寄存器

R命令有兩種用法:直接鍵入R——將顯示CPU全部的寄存器和標誌位;設計

修改寄存器——在R後跟寫寄存器名,回車後先顯示寄存器的內容,在冒號後鍵入新的值;再用R命令就可看到修改後的內容了。將AX寄存器的值改成1234H。

再來看四個段寄存器DS、ES、SS、CS的值都是07BE,說明如今系統處在同一個邏輯段中(不一樣的系統環境下,段寄存器的值可能不同)。操做系統根據內存的狀況爲各段分配段地址,所以每臺機器或每次運行時段地址值可能會不同。

IP指令指針寄存器的值是0100H,表示將要執行的指令在代碼段的0100H單元中。該指令單元的邏輯地址應該由CS:IP構成,即0AFA:0100H。

咱們來看在寄存器的下面那一行的表示。該行顯示的是代碼段的一條指令的反彙編。所謂反彙編,指的是將二進制的機器指令顯示成彙編指令。由三部分構成:最左邊07BE:0100表示該指令所在單元的邏輯地址,中間F60000表示該指令的機器碼,第3列顯示爲彙編指令TEST。

2. D命令——查看內存單元

內存每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,可連續顯示後面的單元內容。

3. E命令——修改內存單元

用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單元的內容是否修改了

4. A 命令——輸入彙編指令

輸入彙編指令,系統自動地將鍵入的彙編指令翻譯成機器代碼,並相繼地存放在從指定地址開始的存儲區中。因爲DEBUG下的數值默認爲十六進制數,所以先要將十進制數轉換成十六進制數。

例如,前一節提到的計算Z=35+27的彙編指令爲:

MOV  AX,23H
ADD  AX,1BH
MOV  [0000],AX

輸入A命令後,系統自動地給出邏輯地址爲0AEE:0100(CS:偏移地址),在其後輸入彙編指令,回車後可輸入下一條指令,直接回車則退出輸入。操做過程以下:

也能夠在A命令後給出指令的存放地址,如A CS:0000,表示從代碼段的0號單元開始存放輸入的指令。

5. U命令 ——反彙編

程序員編寫的彙編語言源程序通過彙編(編譯)後生成了二進制的機器指令代碼,而U命令可將二進制的機器指令變爲助記符形式的彙編指令,所以稱之爲「反彙編」

經過U命令,咱們能夠獲得機器指令與彙編指令的對照,瞭解機器指令的存儲狀況

第一列爲邏輯地址,第二列爲機器指令,第三列爲彙編指令

注意:上圖顯示的程序代碼並非用戶編寫的程序,由於在輸入DEBUG命令時沒有附加exe文件。這段程序代碼是系統代碼段中保存的內容,有多是系統程序,也有多是無效的代碼。

U後跟偏移地址,則從該地址開始反彙編。如:

U 0       從代碼段0號單元開始反彙編
U100     從代碼段100H號單元開始反彙編

注意:屢次鍵入U,可連續顯示後面的程序部分。

6. T/P命令——單步執行

輸入完指令後,應該執行它。

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

7. G命令——連續執行程序

8. Q命令 ——退出DEBUG

鍵入Q,回車後退出DEBUG,返回到DOS下。

相關文章
相關標籤/搜索