明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

[基礎(chǔ)知識(shí)]Debug 使用簡(jiǎn)介

[摘要]調(diào)試程序DEBUG的特點(diǎn): 在受控環(huán)境中測(cè)試程序; 裝入,顯示或修改任何文件; 執(zhí)行DOS程序; 完成磁盤實(shí)際讀/寫操作; 建立或匯編匯編語言程序。 DEBUG的命令格式: [drive:][path] DEBUG [d:][p][filename][.ext][param...]其中: driv...
  • 調(diào)試程序DEBUG的特點(diǎn):
    1. 在受控環(huán)境中測(cè)試程序;
    2. 裝入,顯示或修改任何文件;
    3. 執(zhí)行DOS程序;
    4. 完成磁盤實(shí)際讀/寫操作;
    5. 建立或匯編匯編語言程序。
  • DEBUG的命令格式:
  • [drive:][path] DEBUG [d:][p][filename][.ext][param...]

    其中:

    drive:  是指定DEBUG文件的磁盤驅(qū)動(dòng)器標(biāo)識(shí)符,DEBUG是外部DOS命令,所以必須把它從磁盤讀入內(nèi)存。若未指定,DOS將使用當(dāng)前默認(rèn)磁盤驅(qū)動(dòng)器。

    path:  是DOS查找DEBUG文件的一個(gè)子目錄串表示的路徑。若未指定,DOS將使用當(dāng)前工作目錄。

    d:  是DEBUG將要調(diào)試的文件所在的磁盤驅(qū)動(dòng)器。

    p:  是查找DEBUG將要調(diào)試的文件所需的子目錄路徑,若未指定,DOS使用當(dāng)前目錄。

    filename[.ext] 是DEBUG將要調(diào)試的文件名。

    param  是將被調(diào)試的程序(或文件)的命令行參數(shù)。

    附:

        DEBUG所完成的初始化動(dòng)作,假定文件名沒有,啟動(dòng)DEBUG:

    • 段寄存器CS、DS、ES和SS置為DEBUG程序后的第一個(gè)段。
    • 指令指針寄存器IP置為100H(程序段前綴PSP后的第一個(gè)語句)。
    • 堆棧指針SP置為段末或COMMAND.COM暫駐部分的結(jié)束地址(其中較小的那個(gè)地址)。
    • 其余通用寄存器均置為0,標(biāo)志寄存器置為下述狀態(tài)。
    •     NV    UP    EI    PL    NE    NA    PO    NC

        如果DEBUG命令行含有文件名,段寄存器DS和ES指向PSP。寄存器BX和CX含有程序長(zhǎng)度。

    • DEBUG使用單字符命令:

    這些DEBUG命令主要參考清華大學(xué)計(jì)算機(jī)系列教材IBM-C匯編語言程序設(shè)計(jì)》一書。

     ☆  顯示存儲(chǔ)單元的命令D(DEBUG),格式為:

          - D[address]
          - D[range]

    例如,按指定范圍顯示存儲(chǔ)單元內(nèi)容的方法為:

        -D 100 120
        067C:0100  C7 D7 0D 0A 32 33 33 34 - D5 C5 B4 C6 30 10 42 0C    ....2334....0.B.
        067C:0110  03 41 42 43 44 45 46 47 - 48 49 4A 4B 4C 4D 4E 4F    .ABCDEFGHIJKLMNO
        067C:0120  8B

        其中0100至0120是DEBUG顯示的單元內(nèi)容。 左邊用十六進(jìn)制表示每個(gè)字節(jié),右邊用ASCII字符表示每個(gè)字節(jié),“.”表示不可顯示的字符。這里沒有指定段地址, D命令自動(dòng)顯示DS段的內(nèi)容。如果只指定首地址,則顯示從首地址開始的80個(gè)字節(jié)的內(nèi)容。如果完全沒有指定地址,則顯示上一個(gè)D命令的最后一個(gè)單元的內(nèi)容。

        這里順便提一下存儲(chǔ)器及其地址的分段。

        計(jì)算機(jī)存儲(chǔ)信息的基本單位是一個(gè)二進(jìn)制位,一位可存儲(chǔ)一個(gè)二進(jìn)制數(shù):0或1。每8位組成一個(gè)字節(jié),位編號(hào)如下所示:

    76543210

        正當(dāng)MS-DOS盛行的時(shí)候,PC機(jī)的字長(zhǎng)為16位,由2個(gè)字節(jié)組成,位編號(hào)如下所示:
    1514131211109876543210
                    
    字節(jié)7654321076543210
    高位字節(jié)  MSB低位字節(jié)  LSB
    在存儲(chǔ)器里以字節(jié)為單位存儲(chǔ)信息。為了正確地存放或取得信息,每一個(gè)字節(jié)單元給以一個(gè)存儲(chǔ)器地址。地址從0開始編號(hào),順序地每次加1。在機(jī)器里,地址也是用二進(jìn)制數(shù)來表示的。它是無符號(hào)整數(shù),書寫格式為十六進(jìn)制。

        16位二進(jìn)制可以表示2的16次方個(gè)字節(jié)單元的地址,它可表示的地址范圍應(yīng)該是0-65535。為方便,存儲(chǔ)器的容量以2的10次方=1024為基本單位,稱為1K。這樣,65536個(gè)字節(jié)單元的存儲(chǔ)容量就是64K,其地址編號(hào)的范圍用16進(jìn)制數(shù)表示為0-FFFFH。如下所示。

    0000,0001,0002,……,……,……0009,000A,000B,000C,000D,000E,000F,
    0010,0011,0012,……,……,……0019,001A,001B,001C,001D,001E,001F,
    0020,0021,0022,……,……,……0029,002A,002B,002C,002D,002E,002F,
    ……

    ……

    FFE0,F(xiàn)FE1,F(xiàn)FE2,……,……,……FFE9,F(xiàn)FEA,F(xiàn)FEB,F(xiàn)FEC,F(xiàn)FED,F(xiàn)FEE,F(xiàn)FEF,
    FFF0,F(xiàn)FF1,F(xiàn)FF2,……,……,……FFF9,F(xiàn)FFA,F(xiàn)FFB,F(xiàn)FFC,F(xiàn)FFD,F(xiàn)FFE,F(xiàn)FFF。

        一個(gè)字存入存儲(chǔ)器要占有相繼的二個(gè)字節(jié),存放時(shí),低位字節(jié)存入低地址,高位字節(jié)存入高地址,以相反的次序存入的。

        存儲(chǔ)器的特點(diǎn):它的內(nèi)容是取之不盡的。從某個(gè)單元取出其內(nèi)容后,該單元仍然保存著原來的內(nèi)容不變,可以重復(fù)取出,只有存入新的信息之后,原來保存的內(nèi)容自動(dòng)丟失。

    存儲(chǔ)器地址的分段:

        前面已經(jīng)提到16位字長(zhǎng)的機(jī)器可以訪問最大存儲(chǔ)空間為64K字節(jié),而PC機(jī)的最大存儲(chǔ)容量為1M(原MS-DOS操作系統(tǒng)下)。要訪問1M字節(jié)空間的存儲(chǔ)器必須有20位地址,用16進(jìn)制數(shù)表示1M字節(jié)的地址范圍應(yīng)該為00000-FFFFF。

        在1M字節(jié)的存儲(chǔ)器里,每一個(gè)存儲(chǔ)單元都有一個(gè)唯一的20位地址,稱為該存儲(chǔ)單元的物理地址。CPU訪問存儲(chǔ)器時(shí),必須先確定所要訪問的存儲(chǔ)單元的物理地址才能取得(或存入)該單元的內(nèi)容。20位物理地址由16位段地址和16位偏移地址組成,段地址是指每一段的起始地址,由于它必須是小段的首地址,所以其低4位一定是0,這樣就可以規(guī)定段地址只取段起始地址的高16位值。偏移地址則是指在段內(nèi)相對(duì)于段起始地址的偏移值。這樣,物理地址的計(jì)算方法如下:

        把段地址左移4位再加上偏移地址值就形成物理地址;?qū)懗桑?nbsp; 16dX段地址+偏移地址=物理地址

        每個(gè)存儲(chǔ)單元只有唯一的物理地址,但它卻可由不同的段地址和不同的偏移地址組成。

        在PC機(jī)中,有四個(gè)專門存放段地址的寄存器,稱為段寄存器。它們是代碼段CS(Code Segment)、數(shù)據(jù)段DS(Data Segment)、堆棧段SS(Stack Segment)和附加段ES(Extra Segment)寄存器。每個(gè)段寄存器可以確定一個(gè)段的起始地址,而這些段則各有各的用途。代碼段是存放當(dāng)前正在運(yùn)行的程序。數(shù)據(jù)段存放當(dāng)前運(yùn)行程序所用的數(shù)據(jù),如果程序中使用了串處理指令,則其源操作數(shù)也存放在數(shù)據(jù)段中。堆棧段定義了堆棧的所在區(qū)域,堆棧是一種數(shù)據(jù)結(jié)構(gòu),它是一個(gè)比較特殊的數(shù)據(jù)段。附加段是附加的數(shù)據(jù)段,它是一個(gè)輔助的數(shù)據(jù)區(qū),也是串處理指令的目的操作數(shù)存放區(qū)。還有四個(gè)通用數(shù)據(jù)寄存器AX、BX、CX、DX;四個(gè)指針及變址寄存器SP、BP、SI、DI;控制寄存器包括IP(指令指針寄存器)和PSW程序狀態(tài)字寄存器。這些將專門開辟一頁(yè)詳加介紹。

      ☆   修改存儲(chǔ)單元內(nèi)容的命令有兩種
    • 輸入命令E(Enter),有兩種格式如下:

        第一種格式可以用給定的內(nèi)容表來替代指定范圍的存儲(chǔ)單元內(nèi)容。命令格式為:

        -E  address  [list]

        例如,-E  DS:100   F3'XYZ'8D

        其中F3,‘X’,‘Y’,‘Z’和8D各占一個(gè)字節(jié),該命令可以用這五個(gè)字節(jié)來替代存儲(chǔ)單元DS:0100到0104的原先的內(nèi)容。

        第二種格式則是采用逐個(gè)單元相繼修改的方法。命令格式為:

        -E  address

        例如,-E  CS:100

        則可能顯示為:

        18E4:0100   89. -

        如果需要把該單元的內(nèi)容修改為78,則可以直接鍵入78,再按空格鍵可接著顯示下一個(gè)單元的內(nèi)容,這樣可以不斷修改相繼單元的內(nèi)容,直到Enter鍵結(jié)束該命令為止。

    • 填寫命令F(Fill),其格式為:

        -F  range   list

        例如,-F  4BA:0100   5  F3'XYZ'8D

        使04BA:0100-0104單元包含指定的五個(gè)字節(jié)的內(nèi)容。如果list中的字節(jié)數(shù)超過指定的范圍,則忽略超過的項(xiàng);如果list的字節(jié)數(shù)小于指定范圍,則重復(fù)使用list填入,直到填滿指定的所有單元為止。

      ☆   檢查和修改寄存器內(nèi)容的命令R(Register),它有三種格式如下:
    • 顯示CPU內(nèi)所有寄存器內(nèi)容和標(biāo)志位狀態(tài),其格式為:

        -R

        例如,

        -r

        AX=0000  BX=0000  CX=010A  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
        DS=18E4  ES=18E4  SS=18E4  CS=18E4  IP=0100     NV UP DI PL NZ NA PO NC
        18E4:0100  C70604023801    MOV    WORD PTR[0204],0138    DS:0204=0000

        其中標(biāo)志位狀態(tài)的含義可見下表:

    標(biāo)  志  名標(biāo)志為1標(biāo)志為0

    OF

    DF

    IF

    SF

    ZF

    AF

    PF

    CF

    溢出(是/否)

    方向(減量/增量)

    中斷(允許/關(guān)閉)

    符號(hào)(負(fù)/正)

    零(是/否)

    輔助進(jìn)位(是/否)

    奇偶(偶/奇)

    進(jìn)位(是/否

    OV

    DN

    EI

    NG

    ZR

    AC

    PE

    CY

    NV

    UP

    DI

    PL

    NZ

    NA

    PO

    NC

    • 顯示和修改某個(gè)寄存器內(nèi)容,其格式為:

        -R  register name

        例如,鍵入

        -r  ax

        系統(tǒng)將響應(yīng)如下:

        AX  F1F4
       :

        即AX寄存器的當(dāng)前內(nèi)容為F1F4,如不修改則按Enter鍵,否則,鍵入欲修改的內(nèi)容如:

        -r  bx
        BX  0369
        :059F

        則把BX寄存器的當(dāng)前內(nèi)容修改為059F。

    • 顯示和修改標(biāo)志位狀態(tài),命令格式為:

        -RF

        系統(tǒng)將響應(yīng),如:

        OV DN EI NG ZR AC PE CY -

        此時(shí)如不修改其內(nèi)容可按Enter鍵,否則,建入欲修改的內(nèi)容,如:

        OV DN EI NG ZR AC PE CY - PONZDINV

        即可,鍵入的順序是任意的。

      ☆   運(yùn)行命令G(Go),其格式為:
    其中,地址1指定了運(yùn)行的起始地址,如不指定則從當(dāng)前的CS:IP開始運(yùn)行。后面的地址均為斷點(diǎn)地址,當(dāng)指令執(zhí)行到斷點(diǎn)時(shí),就停止執(zhí)行并顯示當(dāng)前所有寄存器及標(biāo)志位的內(nèi)容,和下一條將要執(zhí)行的指令。
      ☆   跟蹤命令T(Trace),有兩種格式:
    • 逐條指令跟蹤

        -T[=address]

        從指定地址起執(zhí)行一條指令后停下來,顯示所有寄存器內(nèi)空及標(biāo)志位的值。如未指定則從當(dāng)前的CS:IP開始執(zhí)行。

    • 多要指令跟蹤

        -T[=address][value]

        從指定地址起執(zhí)行n條指令后停下來,n由value指定。

      ☆   匯編命令A(yù)(Assemble),其格式為:

        -A [address]

        該命令允許鍵入?yún)R編語言語句,并能把它們匯編成機(jī)器代碼,相繼地存放在從指定地址開始的存儲(chǔ)區(qū)中。必須注意:DEBUG把鍵入的數(shù)字均看成十六進(jìn)制數(shù),所以如要鍵入十進(jìn)制數(shù),則其后應(yīng)加以說明,如100D。

      ☆   反匯編命令U(Unassemble),有兩種格式:
    • 從指定地址開始,反匯編32個(gè)字節(jié),其格式為:

        -U[range]

        例如:

        -u 100

        18E4:0100   C70604023801    MOV    WORD  PTR[0204],0138
        18E4:0106   C70606020002    MOV    WORD  PTR[0206],0200
        18E4:010C   C70608020202    MOV    WORD  PTR[0208],0202
        18E4:0112   BB0402          MOV    BX,0204
        18E4:0115   E80200          CALL    011A
        18E4:0118   CD20            INT    20
        18E4:011A   50              PUSH    AX
        18E4:011B   51              PUSH    CX
        18E4:011C   56              PUSH    SI
        18E4:011D   57              PUSH    DI
        18E4:011E   8B37            MOV    SI,[BX]

        如果地址被省略則從上一個(gè)U命令的最后一條指令的下一個(gè)單元開始顯示32個(gè)字節(jié)。

    • 對(duì)指定范圍內(nèi)的存儲(chǔ)單元進(jìn)行反匯編,格式為:

        -U[range]

    例如:

        -u 100  10C

        18E4:0100   C70604023801    MOV    WORD  PTR[0204],0138
        18E4:0106   C70606020002    MOV    WORD  PTR[0206],0200
        18E4:010C   C70608020202    MOV    WORD  PTR[0208],0202

        -u 100  112

        18E4:0100   C70604023801    MOV    WORD  PTR[0204],0138
        18E4:0106   C70606020002    MOV    WORD  PTR[0206],0200
        18E4:010C   C70608020202    MOV    WORD  PTR[0208],0202

    這兩種格式是等效的。

      ☆   命名命令N(Name),其格式為:

        -N  filespecs  [filespecs]

        命令把兩個(gè)文件標(biāo)識(shí)符格式化在CS:5CH和CS:6CH的兩個(gè)文件控制塊中,以便在其后用L或W命令把文件裝入或存盤。filespecs的格式可以是:

        [d:][path]  filename[.ext]

    例如:

        -N  myprog

        -L

        -

        可把文件myprog裝入存儲(chǔ)器。

      ☆   裝入命令L(Load),有兩種功能:
    • 把磁盤上指定扇區(qū)范圍的內(nèi)容裝入到存儲(chǔ)器從指定地址開始的區(qū)域中。其格式為:

    -L[address [drive  sector  sector]]

    • 裝入指定文件,其格式為:

    -L[address]

        此命令裝入已在CS:5CH中格式化了的文件控制塊所指定的文件。如未指定地址,則裝入CS:0100開始的存儲(chǔ)區(qū)中。

      ☆   寫命令W(Write),有兩種功能:
    • 把數(shù)據(jù)寫入磁盤的指定扇區(qū)。其格式為:

    -W address drive sector sector

    • 把數(shù)據(jù)寫入指定的文件中。其格式為:

    -W [address]

        此命令把指定的存儲(chǔ)區(qū)中的數(shù)據(jù)寫入由CS:5CH處的文件控制塊所指定的文件中。如未指定地址則數(shù)據(jù)從CS:0100開始。要寫入文件的字節(jié)數(shù)應(yīng)先放入BX和CX中。

      ☆   退出DEBUG命令Q(Quit),其格式為:

    -Q

    它退出DEBUG,返回DOS。本命令無存盤功能,如需存盤應(yīng)先使用W命令。