匯編調(diào)試命令debug的詳細(xì)用法
??在學(xué)習(xí)16位匯編時(shí),debug是常用的調(diào)試工具,但很多基本用法,幫助中并未提及。本文中的基本概念是指命令語(yǔ)法中需要提供給命令的參數(shù),在命令幫助中并未提供任何提示。經(jīng)查資料和試驗(yàn),特記錄如下:
??一、基本概念:
??DOS5.0之前debug是com格式,從5.0之后就改為exe格式了,本文是指的是DOS6.22中的debug.exe格式。debug可加載exe或com文件,并顯示內(nèi)存中內(nèi)容或變量值,還可以顯示cpu的寄存器值。可以顯示可執(zhí)行文件的機(jī)器碼(匯編的方式),只支持8086/8088(8087)指令,并且可以通過(guò)單步執(zhí)行匯編代碼,檢測(cè)程序的邏輯錯(cuò)誤,并可修改匯編代碼或內(nèi)存數(shù)據(jù)。
??如果想更多支持,可使用DR-DOS7.0自帶的debug,可支持到pentium指令級(jí),更多選擇:Microsoft的CodeView、Borland的TurboDebug或Debug32等。
??1、命令語(yǔ)法:
??dos下輸入:debug 可執(zhí)行文件名稱,然后進(jìn)入命令提示符界面(橫線-),輸入:命令 參數(shù)。
??例如:
??c:\>debug hello.exe(回車)
??-?(回車) 顯示幫助
??-r(回車) 顯示cpu寄存器值
??
??2、參數(shù)分隔符
??debug中參數(shù)之間的分隔符可用“空格”或“逗號(hào)”,效果一致,如:
??-u 100 110等于-u 100,110
??-d 0100:0000 0010等于-d 0100:0000,0010
??3、value的表示
??無(wú)論是debug的參數(shù)中含有的地址,立即數(shù)或匯編代碼中的數(shù)字,都是十六進(jìn)制,無(wú)需加前綴或后綴,范圍只能是0~4位。
??字符需要引號(hào),如:'a'
??4、debug命令和代碼不區(qū)分大小寫。
??5、地址(address)表示
??1)完全地址形式(段地址segment:偏移地址offset):段地址可通過(guò)段寄存器名稱和立即地址表示,如地址可通過(guò)DS:0010和0100:0010兩種方式表示。
??2)默認(rèn)段地址形式(偏移地址offset):-d 0100(默認(rèn)段地址是DS)。
??3)部分指令,參數(shù)中地址的形式是:=address,這是因?yàn)閰?shù)中可添加多個(gè)數(shù)值參數(shù),為了區(qū)分,其中一個(gè)用=address的方式。如:-g =0003 0008(0003代表開始地址,0008代表斷點(diǎn)偏移地址)
??6、range的寫法
??參數(shù)range有2種寫法:
??1)開始地址和結(jié)束地址,如:
??-d 0100:0000 0010(開始地址與結(jié)束地址位于同一個(gè)段,不能跨段)
??-d 0000 0010 (起始都是默認(rèn)段地址DS)
??2)開始地址和長(zhǎng)度,如:
??-d 0100:0000 L 0080(開始地址和長(zhǎng)度,字母L大小寫均可)
??7、list的寫法
??用分隔符把各項(xiàng)羅列出來(lái),如-f 0100:0110 1f 2f 3f ff(用數(shù)值列表輪流填充)
??8、string的表示
??'string'或"string"都行,表示一串字符,實(shí)質(zhì)相當(dāng)于字符list
??9、路徑path規(guī)范
??文件的路徑可寫成完整路徑,如當(dāng)前目錄,可省略路徑
??10、加載匯編代碼
??可通過(guò)debug < hello.asm的方式加載命令行代碼,就相當(dāng)于手動(dòng)輸入每一行(最后必須有Q命令)。當(dāng)然,debug < hello.asm > output.txt,也可將輸出的信息發(fā)送到文件output.txt。
;hello.asm文件
a 100
mov ax,5
mov bx,10
add ax,bx
int 20
(blank line)
Q
??11、Debug初始狀態(tài)
??Debug加載時(shí),Dos位于內(nèi)存的最低地址(640K)端,緊接著是Debug,最后是debug載入的程序;
??所有段寄存器都設(shè)置成可用內(nèi)存的最低段地址處;
??IP設(shè)置成0100h(為psp留空間);
??當(dāng)前段的最后256字節(jié)留給棧;
??BX:CX的值代表載入程序的長(zhǎng)度(BX代表高字節(jié),CX代表低字節(jié));
??Flag寄存器值:NV UP EI PL NZ NA PO NC
??二、命令用法:
??首先Q命令,-q(回車),退出debug命令。
??1、N(指定文件名稱)
??語(yǔ)法:n [pathname] [arglist]
??pathname指定寫出(W)或載入(L)的文件名稱(包括路徑和文件名),如載入hello.exe。
??arglist相當(dāng)于執(zhí)行上述hello執(zhí)行時(shí)需要的參數(shù)(本例沒(méi)有),如dir c:\中c:\就是arglist。debug是需要將程序載入后模擬執(zhí)行的,所以如果執(zhí)行程序所需參數(shù)也要加上。
??-N c:\c\hello.exe
??-L
??也可直接通過(guò)debug c:\c\hello.exe載入。
??2、R(寄存器操作)
??語(yǔ)法:r [register](r和reg之間的空格可以省略)
??R顯示所有寄存器的值,R reg顯示置頂寄存器得值,并可修改其值。reg指16位寄存AX、CS、F(flag寄存器)等,不能操作al,ah非16位寄存器。
-r(顯示所有寄存器的值)
-r ax(顯示ax的值,并在冒號(hào):處提示輸入新值,直接回車則表示不修改)
ax 0000
:
-r f(顯示標(biāo)志寄存器的值,并在斷線-處提示輸入新值,直接回車則表示不修改)
NV UP EI PL NZ NA PO NC -ZR AC(新值是表示每個(gè)標(biāo)志位的值,順序不限,值個(gè)數(shù)不限)
??標(biāo)志位的值對(duì)應(yīng)的代碼如下:
標(biāo)志位 設(shè)置1 設(shè)置0
--------------- --------------- -------------------
Overflow of = OV (OVerflow) NV [No oVerflow]
Direction df = DN (decrement) UP (increment)
Interrupt if = EI (enabled) DI (disabled)
Sign sf = NG (negative) PL (positive)
Zero zf = ZR [zero] NZ [ Not zero]
Auxiliary Carry af = AC NA [ No AC ]
Parity pf = PE (even) PO (odd)
Carry cf = CY [Carry] NC [ No Carry]
??3、D(顯示塊數(shù)據(jù))
??語(yǔ)法:d [range]
??不指定range,默認(rèn)當(dāng)前位置開始(一開始是DS:0000),顯示128個(gè)字節(jié)的數(shù)據(jù);可指定range,range語(yǔ)法參考文章開頭。
-d 0100:0000 0010(結(jié)束地址段地址與開始相同,不能跨段)
-d 0000 0010 (起始都是默認(rèn)段地址)
-d 0100:0000 L 0080(開始地址和長(zhǎng)度)
??4、E(修改塊數(shù)據(jù))
??語(yǔ)法:d address [list]
??默認(rèn)段為DS。
??如果不指定list就根據(jù)提示(提示顯示的是當(dāng)前地址的原數(shù)據(jù),原點(diǎn)后輸入新數(shù)據(jù)),從指定地址address開始,逐字節(jié)輸入數(shù)據(jù),每輸入一個(gè)字節(jié)按一次空格進(jìn)行下一次輸入。要停止輸入時(shí)直接按回車。
??或通過(guò)list,直接指定數(shù)據(jù)(用空格隔開)或字符串(單引號(hào)或雙引號(hào))。
-d 0(從偏移地址0處,手動(dòng)輸入,原數(shù)據(jù)是0e,圓點(diǎn).后輸入新數(shù)據(jù))
4dc5:0000 0e.
-d 0 "hello"(從偏移地址0處,依次數(shù)據(jù)為字符h e l l o)
-d 0 12 34 56 ef
??5、U(反編譯)
??語(yǔ)法:d [range]
??默認(rèn)段為CS。從指定地址處開始將機(jī)器碼轉(zhuǎn)換成匯編代碼,地址必須是合理的地址(因機(jī)器碼可以看成數(shù)據(jù),也可以看成代碼)。
4ddd:0000 B8DC4D mov ax,4DDC
4ddd:0003 8ed8 mov ds,ax
4ddd:0005 B440 mov ax,40
??如上代碼,此處就不能從0002處開始反匯編,雖然也能解析成代碼,但后面的代碼都沒(méi)有意義。
??如果range中通過(guò)L指定反編譯的范圍,L后面的數(shù)值是大概指字節(jié)數(shù),為什么是“大概”,因?yàn)橹付ㄩL(zhǎng)度的位置的代碼可能沒(méi)有完全顯示當(dāng)前的指令,需要在向后顯示幾個(gè)字節(jié)。
??如上代碼:u 0000 L 4就需要再向后一個(gè)字節(jié),因?yàn)樵撎幍拇a沒(méi)顯示完。
??6、A(輸入?yún)R編代碼)
??語(yǔ)法:a [address]
??默認(rèn)段為CS。
??從指定地址address處寫匯編代碼,只支持8086/8088(8087)指令,也支持db,dw兩個(gè)偽指令,最后一行直接回車結(jié)束匯編代碼輸入模式。
-a 100
4ddd:1000 mov ax,4ddc
4ddd:1003 mov ds,ax
4ddd:1005 (直接回車結(jié)束編輯)
-
-a 110
-4ddd:0110 db "hello" (定義數(shù)據(jù))
??7、G(輸入?yún)R編代碼)
??語(yǔ)法:g [=address] [addresses]
??默認(rèn)段為CS,不指定參數(shù)=address則表示從當(dāng)前位置,不指定參數(shù)addresses則表示執(zhí)行到程序最后。
??=address位起點(diǎn)地址,起點(diǎn)位置要是有效的位置(原因如同u指令);addresses為斷點(diǎn)位置,可以指定10個(gè),多個(gè)斷點(diǎn)間用空格分割。不指定斷點(diǎn)則執(zhí)行到程序最后。
??因?yàn)?個(gè)都是地址,為了區(qū)分,前一個(gè)加等號(hào)=。
??斷點(diǎn)只一次有效,為什么要指定多個(gè)斷點(diǎn)呢,因?yàn)榭赡懿淮_定程序的執(zhí)行方向,多設(shè)置幾個(gè)斷點(diǎn)。
??程序執(zhí)行完畢后,再g則退出debug。
-g =0002 0008 0011
從0002處執(zhí)行,可在0008或0011處中斷,先執(zhí)行到哪就在哪停止,執(zhí)行完畢后清除斷點(diǎn),下一次g指令時(shí),這些斷點(diǎn)無(wú)效。
??8、P(單步或指定步數(shù))
??語(yǔ)法:p [=address] [number]
??默認(rèn)段為CS,不指定參數(shù)=address則表示從當(dāng)前位置,不指定參數(shù)number則表示執(zhí)行1步。
??=address位起點(diǎn)地址,起點(diǎn)位置要是有效的位置(原因如同u指令);
??number是運(yùn)行指令的條數(shù),不指定,默認(rèn)是1條。
??p指令遇到子程序或中斷程序,直接運(yùn)行子程序和中斷程序,不進(jìn)入子程序或中斷程序內(nèi)部單步執(zhí)行,相當(dāng)于調(diào)試高級(jí)程序中的Step Over。
??9、T(單步或指定步數(shù))
??語(yǔ)法:t [=address] [number]
??默認(rèn)段為CS,不指定參數(shù)=address則表示從當(dāng)前位置,不指定參數(shù)number則表示執(zhí)行1步。
??=address位起點(diǎn)地址,起點(diǎn)位置要是有效的位置(原因如同u指令);
??number是運(yùn)行指令的條數(shù),不指定,默認(rèn)是1條。
??p指令遇到子程序或中斷程序,要單步進(jìn)入子程序和中斷程序內(nèi)部,相當(dāng)于調(diào)試高級(jí)程序中的Step Into。
??10、M(復(fù)制數(shù)據(jù)塊)
??語(yǔ)法:m range address
??默認(rèn)段為DS。
??復(fù)制range的數(shù)據(jù)到起始點(diǎn)位address的內(nèi)存處。如果range用了段前綴,address的段前綴也需指定,否則range和address可能不在一個(gè)段。
-m 4ddc:0000 3 5
這里的range所在段是4ddc,adress所在段為ds。
-m 4ddc:0000 0003 4ddc:0005
range和adress在同一個(gè)段
??11、S(搜索數(shù)據(jù)塊)
??語(yǔ)法:s range list
??默認(rèn)段為DS。
??搜索到了,顯示搜索到的地址,多處顯示多處地址。
兩種range的寫法:
-s fe00:0 L ffff "BIOS"
-s fe00:0 ffff "BIOS"
FE00:0021
FE00:006F
數(shù)據(jù)區(qū)域
-d fe00:0
FE00:0000 41 77 61 72 64 20 53 6F-66 74 77 61 72 65 49 42 Award SoftwareIB
FE00:0010 4D 20 43 4F 4D 50 41 54-49 42 4C 45 20 34 38 36 M COMPATIBLE 486
FE00:0020 20 42 49 4F 53 20 43 4F-50 59 52 49 47 48 54 20 BIOS COPYRIGHT
FE00:0030 41 77 61 72 64 20 53 6F-66 74 77 61 72 65 20 49 Award Software I
FE00:0040 6E 63 2E 6F 66 74 77 61-72 65 20 49 6E 63 2E 20 nc.oftware Inc.
FE00:0050 41 77 03 0C 04 01 01 6F-66 74 77 E9 12 14 20 43 Aw.....oftw... C
FE00:0060 1B 41 77 61 72 64 20 4D-6F 64 75 6C 61 72 20 42 .Award Modular B
FE00:0070 49 4F 53 20 76 34 2E 35-31 50 47 00 DB 32 EC 33 IOS v4.51PG..2.3
??12、C(比較數(shù)據(jù)塊)
??語(yǔ)法:c range list
??默認(rèn)段為DS。
??比較兩個(gè)數(shù)據(jù)塊的數(shù)據(jù)是否一致,將不一致的地址和各自的數(shù)據(jù)顯示出來(lái)。
??
??13、F(填充數(shù)據(jù)塊)
??語(yǔ)法:f range list
??默認(rèn)段為DS。
??用list數(shù)據(jù)填充區(qū)域range,如果list的長(zhǎng)度小于range的長(zhǎng)度,則重復(fù)填充。跟MASM中的db 100 dup("ha")方式一致,就是填充50個(gè)"ha"。
??
??14、I和O(端口讀寫)
??語(yǔ)法:?i port
??????o port byte(byte的值是16位整數(shù))
??對(duì)端口進(jìn)行讀寫(端口的定義請(qǐng)查閱其他博文),如讀取CMOS芯片的小時(shí):
-o 70 04
-i 71
08(當(dāng)前小時(shí)是8)
-
??15、H(16位整數(shù)的加減)
??語(yǔ)法:?h value1 value2
??計(jì)算value1+value2和value1-value2,2個(gè)結(jié)果同時(shí)顯示,對(duì)標(biāo)志位不影響。
-h aaa 531
0FDB 0579(前一個(gè)是和,后一個(gè)是差)
-
??16、L(加載數(shù)據(jù))
??語(yǔ)法:L [address] [drive] [firstsector] [number]
??如程序執(zhí)行完畢,可通過(guò)L可再次加載程序,如g指令后可通過(guò)L重新開始。
??加載有3種形式,BX和CX共同表示文件長(zhǎng)度,如文件長(zhǎng)123456H字節(jié),BX=0012H,CX=3456H。
??L(直接加載N指定的文件到CS:0100)
??L DS:200(加載N指定的文件到DS:0200)
??L 100 2 A 5(從C盤0Ah邏輯扇區(qū)開始加載5個(gè)扇區(qū)到CS:0100,L address drvie firstSector number,drive從0開始表示A盤,1=B、2=C以此類推,每個(gè)扇區(qū)521Byte)
??MBR儲(chǔ)存在C盤0扇區(qū),可加載查看(MBR最后2個(gè)字節(jié)是55AA,地址為0100+01FF)
??
??17、W(向磁盤寫數(shù)據(jù))
??語(yǔ)法:w [address] [drive] [firstsector] [number]
??使用方法基本同L。
??BX和CX共同表示文件長(zhǎng)度,如文件長(zhǎng)123456H字節(jié),BX=0012H,CX=3456H;執(zhí)行W時(shí)需通過(guò)R指令設(shè)置BX、CX數(shù)值。
??R BX 0(設(shè)置文件長(zhǎng)度)
??R CX 20(設(shè)置文件長(zhǎng)度)
??W(從CS:0100開始,寫20H字節(jié)到文件)
??W 0(從CS:0000開始,寫20H字節(jié)到文件)
??W DS:200(從DS:0200開始,寫20H字節(jié)到文件)
??W 100 2 0 1(從CS:0100開始,寫1個(gè)扇區(qū)數(shù)據(jù),到C盤0邏輯扇區(qū)。可以用來(lái)寫MBR程序到磁盤或軟盤)
??18、XA、XD、XM、XS(內(nèi)存操作)
??語(yǔ)法:
??未完待續(xù)...?

浙公網(wǎng)安備 33010602011771號(hào)