『壹』 系統如何調用debug查看CPU匯編指令和內存
Debug是DOS(Disk Operating System,磁碟操作系統)、windows提供的實模式(8086方式)程序的調試工具。使用它,可以查看CPU各種寄存器中的內容、內存的情況和在機器碼級跟蹤程序的運行。
查看更詳細的介紹DEBUG網路
一般我們常用到的Debug參數:
r命令查看、修改CPU寄存器的內容;
d命令查看內存中的內容;
e命令改寫內存中的內容;
u命令將內存中的機器指令翻譯成匯編指令;
t命令執行一條機器指令;
a命令以匯編指令的格式在內存中寫入一條機器指令。
打開界面如下:
將debug.exe拷貝到D盤(某盤根目錄),在DOSBOX中輸入「mount c D:\」命令(此命令輸入後有「Drive C is mounted as local directory d:\」,再輸入「c:」回車。然後輸入debug,結果如下:
例如輸入u可以查看系統的匯編指令,一直輸入u會列出系統所有的匯編指令。如下圖所示:
『貳』 debug常用命令
以下是 Debug 命令列表:
? 顯示 Debug 命令列表。
a 匯編 8086/8087/8088 記憶碼。
c 比較內存的兩個部分。
d 顯示部分內存的內容。
e 從指定地址開始,將數據輸入到內存。
f 使用指定值填充一段內存。
g 運行在內存中的可執行文件。
h 執行十六進制運算。
i 顯示來自特定埠的 1 位元組值。
l 將文件或磁碟扇區內容載入到內存。
m 復制內存塊中的內容
/n 為 l 或 w 命令指定文件,或者指定正在測試的文件的參數。
o 向輸出埠發送 1 個位元組的值。
p 執行循環、重復的字元串指令、軟體中斷或子常式。
q 停止 Debug 會話。
r 顯示或改變一個或多個寄存器。
s 在部分內存中搜索一個或多個位元組值的模式。
t 執行一條指令,然後顯示所有寄存器的內容、所有標志的狀態和 Debug 下一步要執行的指令的解碼形式。
u 反匯編位元組並顯示相應的原語句。
w 將被測試文件寫入磁碟。
xa 分配擴展內存。
xd 釋放擴展內存。
xm 映射擴展內存頁。
xs 顯示擴展內存的狀態。
『叄』 電腦XP系統怎麼使用debug查看內存和匯編指令
簡單介紹下debug查看內存中的機器碼,已經查看匯編指令的方法。
-r 參數用來查看CPU中寄存器的值,以及改變寄存器的值。
至於那些神馬AX,BX,CX,DX的都不用說了,CS跟IP更不用說了,指向了要執行的下一條指令。
可以用-r cs或者-r ip來改變它們的值。如圖:
這樣我們就可以讓CS:IP指向我們希望的指向內存地址,從而可能執行我們預先在該地址存放好的代碼。
-D命令:用來查看內存中的值。比如:
如圖:最左邊的是內存的地址,用基地址:偏移量的方式給出,中間存放的是內存中的機器碼,一行剛好15個位元組,而最右邊則是對這些數據敵對應的可顯示的ASCII字元,對於沒有的,則用.代替。所以如果想看一下,右邊輸出hello之類的 東西,則可以向指令裡面寫如這些字元的ASCII碼。
-E命令:改寫內存中的內容。上面已經說到了,下面我們來試試,用E改變CS:IP裡面存放的指令。
如圖:使用' 『的格式就可以向裡面輸入字元了,右邊出現了字元hello,所以我們可以認為中間的數據就是對應字元的ASCII碼,我們之所以看到h是68,那是因為這是十六進制的數據,h真正的ASCII碼應該是6*16+8=104,所以是吻合的。比如我們像內存裡面寫入:61(也就是6*16=97)
而0到9幾個數字ASCII碼的十六機制剛好是3x,也就是48+x.這點必須的搞清楚。
好,搞了這么長時間的E命令,我們在看看U命令,它用來查看機器碼對應的匯編代碼。比如:
可以看到十六進制的61對應的匯編還是61?所以我們可以用-e寫入機器碼,然後用-u來查看匯編指令。
-A:以匯編的形式向內存寫入指令。比如:
還有一個命令就是-t,也就是執行,不多說了。
『肆』 debug命令有什麼作用如何使用
DEBUG是為匯編語言設計的一種高度工具,它通過單步、設置斷點等方式為匯編語言程序員提供了非常有效的調試手段。x0dx0a一、DEBUG程序的調用x0dx0a 在DOS的提示符下,可鍵入命令:x0dx0a C:\DEBUG [D:][PATH][FILENAME[.EXT]][PARM1][PARM2]x0dx0a 其中,文件名是被調試文件的名字。如用戶鍵入文件,則DEBUG將指定的文件裝入存儲器中,用戶可對其進行調試。如果未鍵入文件名,則用戶可以用當前存儲器的內容工作,或者用DEBUG命令N和L把需要的文件裝入存儲器後再進行調試。命令中的D指定驅動器PATH為路徑,PARM1和PARM2則為運行被調試文件時所需要的命令參數。x0dx0a 在DEBUG程序調入後,將出現提示符,此時就可用DEBUG命令來調試程序。x0dx0a二、DEBUG的主要命令x0dx0a 1、顯示存儲單元的命令D(DUMP),格式為:x0dx0a _D[address]或_D[range]x0dx0a 例如,按指定范圍顯示存儲單元內容的方法為:x0dx0a -d100 120x0dx0a18E4:0100 c7 06 04 02 38 01 c7 06-06 02 00 02 c7 06 08 02 G...8.G.....G...x0dx0a18E$:0110 02 02 bb 04 02 e8 02 00-CD 20 50 51 56 57 8B 37 ..;..h..M PQVW.x0dx0a 7x0dx0a18E4:0120 8Bx0dx0a 其中0100至0120是DEBUG顯示的單元內容,左邊用十六進製表示每個位元組,右邊用ASCII字元表示每個位元組,·表示不可顯示的字元。這里沒有指定段地址,D命令自動顯示DS段的內容。如果只指定首地址,則顯示從首地址開始的80個位元組的內容。如果完全沒有指定地址,則顯示上一個D命令顯示的最後一個單元後的內容。x0dx0a2、修改存儲單元內容的命令有兩種。x0dx0a ·輸入命令E(ENTER),有兩種格式如下:第一種格式可以用給定的內容表來替代指定范圍的存儲單元內容。命令格式為:x0dx0a -E address[list]x0dx0a例如,-E DS:100 F3'XYZƎDx0dx0a 其中F3,'X','Y','Z'和各佔一個位元組,該命令可以用這五個位元組來替代存儲單元DS:0100到0104的原先的內容。x0dx0a 第二種格式則是採用逐個單元相繼修改的方法。命令格式為:x0dx0a -E addressx0dx0a例如,-E DS:100x0dx0a 則可能顯示為:x0dx0a 18E4:0100 89.-x0dx0a 如果需要把該單元的內容修改為78,則用戶可以直接鍵入78,再按「空格」鍵可接著顯示下一個單元的內容,如下:x0dx0a 18E4:0100 89.78 1B.-x0dx0a 這樣,用戶可以不斷修改相繼單元的內容,直到用ENTER鍵結束該命令為止。x0dx0a ·填寫命令F(FILL),其格式為:x0dx0a -F range listx0dx0a例如:-F 4BA:0100 5 F3'XYZƎDx0dx0a 使04BA:0100~0104單元包含指定的五個位元組的內容。如果list中的位元組數超過指定的范圍,則忽略超過的項;如果list的位元組數小於指定的范圍,則重復使用list填入,直到填滿指定的所有單元為止。x0dx0a3)檢查和修改寄存器內容的命令R(register),它有三種格式如下:x0dx0a ·顯示CPU內所有寄存器內容和標志位狀態,其格式為:x0dx0a -Rx0dx0a例如,-rx0dx0a AX=0000 BX=0000 CX=010A DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000x0dx0a DS=18E4 ES=18E4 SS=18E4 CS=18E4 IP=0100 NV UP DI PL NZ NA PO NCx0dx0a 18E4:0100 C70604023801 MOV WORD PTR [0204],0138 DS:0204=0000x0dx0a ·顯示和修改某個寄存器內容,其格式為:x0dx0a -R register namex0dx0a例如,鍵入x0dx0a -R AXx0dx0a 系統將響應如下:x0dx0a AX F1F4x0dx0a :x0dx0a即AX寄存器的當前內容為F1F4,如不修改則按ENTER鍵,否則,可鍵入欲修改的內容,如:x0dx0ax0dx0a -R bxx0dx0a BX 0369x0dx0a :059Fx0dx0a則把BX寄存器的內容修改為059F。x0dx0a ·顯示和修改標志位狀態,命令格式為:x0dx0a -RF系統將響應,如:x0dx0a OV DN EI NG ZR AC PE CY-x0dx0a 此時,如不修改其內容可按ENTER鍵,否則,可鍵入欲修改的內容,如:x0dx0a OV DN EI NG ZR AC PE CY-PONZDINVx0dx0a 即可,可見鍵入的順序可以是任意的。x0dx0a4)運行命令G,其格式為:x0dx0a -G[=address1][address2[address3?]]x0dx0a 其中,地址1指定了運行的起始地址,如不指定則從當前的CS:IP開始運行。後面的地址均為斷點地址,當指令執行到斷點時,就停止執行並顯示當前所有寄存器及標志位的內容,和下一條將要執行的指令。x0dx0a5)跟蹤命令T(Trace),有兩種格式:x0dx0a ·逐條指令跟蹤x0dx0a -T [=address]x0dx0a 從指定地址起執行一條指令後停下來,顯示所有寄存器內容及標志位的值。如未指定地址則從當前的CS:IP開始執行。x0dx0a ·多條指令跟蹤x0dx0a -T [=address][value]x0dx0a 從指定地址起執行n條指令後停下來,n由value指定。x0dx0a6)匯編命令A(Assemble),其格式為:x0dx0a -A[address]x0dx0a 該命令允許鍵入匯編語言語句,並能把它們匯編成機器代碼,相繼地存放在從指定地址開始的存儲區中。必須注意:DEBUG把鍵入的數字均看成十六進制數,所以如要鍵入十進制數,則其後應加以說明,如100D。x0dx0a7)反匯編命令U(Unassemble)有兩種格式。x0dx0a ·從指定地址開始,反匯編32個位元組,其格式為:x0dx0a -U[address]x0dx0a例如:x0dx0a -u100x0dx0a 18E4:0100 C70604023801 MOV WORD PTR[0204],0138x0dx0a 18E4:0106 C70606020002 MOV WORD PTR[0206],0200x0dx0a 18E4:010C C70606020202 MOV WORD PTR[0208],0202x0dx0a 18E4:0112 BBO4O2 MOV BX,0204x0dx0a 18E4:0115 E80200 CALL 011Ax0dx0a 18E4:0118 CD20 INT 20x0dx0a 18E4:011A 50 PUSH AXx0dx0a 18E4:011B 51 PUSH CXx0dx0a 18E4:011C 56 PUSH SIx0dx0a 18E4:011D 57 PUSH DIx0dx0a 18E4:011E 8B37 MOV SI,[BX]x0dx0a如果地址被省略,則從上一個U命令的最後一條指令的下一個單元開始顯示32個位元組。x0dx0a ·對指定范圍內的存儲單元進行反匯編,格式為:x0dx0a -U[range]x0dx0a例如:x0dx0a -u100 10cx0dx0a 18E4:0100 C70604023801 MOV WORD PTR[0204],0138x0dx0a 18E4:0106 C70606020002 MOV WORD PTR[0206],0200x0dx0a 18E4:010C C70606020202 MOV WORD PTR[0208],0202x0dx0a或x0dx0a -u100 112 x0dx0a 18E4:0100 C70604023801 MOV WORD PTR[0204],0138x0dx0a 18E4:0106 C70606020002 MOV WORD PTR[0206],0200x0dx0a 18E4:010C C70606020202 MOV WORD PTR[0208],0202x0dx0ax0dx0a 可見這兩種格式是等效的。x0dx0a8)命名命令N(Name),其格式為:x0dx0a -N filespecs [filespecs]x0dx0a命令把兩個文件標識符格式化在CS:5CH和CS:6CH的兩個文件控制塊中,以便在其後用L或W命令把文件裝入存檔。filespecs的格式可以是:x0dx0a[d:][path] filename[.ext]x0dx0a例如,x0dx0a -N myprogx0dx0a -Lx0dx0a -x0dx0a可把文件myprog裝入存儲器。x0dx0a9)裝入命令(Load),有兩種功能。x0dx0a ·把磁碟上指定扇區范圍的內容裝入到存儲器從指定地址開始的區域中。其格式為:x0dx0a -L[address[drive sector sector]x0dx0a ·裝入指定文件,其格式為:x0dx0a -L[address]x0dx0a此命令裝入已在CS:5CH中格式化了文件控制塊所指定的文件。如未指定地址,則裝入CS:0100開始的存儲區中。x0dx0a10)寫命令W(Write),有兩種功能。x0dx0a ·把數據寫入磁碟的指定扇區。其格式為:x0dx0a -W address drive sector sectorx0dx0a ·把數據寫入指定的文件中。其格式為:x0dx0a -W[address]x0dx0a此命令把指定的存儲區中的數據寫入由CS:5CH處的文件控制塊所指定的文件中。如未指定地址則數據從CS:0100開始。要寫入文件的位元組數應先放入BX和CX中。x0dx0a11)退出DEBUG命令Q(Quit),其格式為:x0dx0a -Qx0dx0a它退出DEBUG,返回DOS。本命令並無存檔功能,如需存檔應先使用W命令。