【正文】
用匯編語(yǔ)言指令來(lái)做和例 5 一樣的事情。 7)現(xiàn)在,我們不但要編寫(xiě)一個(gè)匯編程序,而且我們還要把它存盤(pán)。 8) 現(xiàn)在,我們?cè)囈辉嚥榭匆粋€(gè)已經(jīng)編好的程序。 9)你可以用 DEBUG 的計(jì)算功能計(jì)算程序的長(zhǎng)度。 10)另一種顯示在 屏幕上字符串的方法。 11)讓我們?cè)囈辉嚪磸?fù)輸出。 12)我們現(xiàn)在把兩個(gè)程序連接起來(lái)。 13) 讓我們逐步運(yùn)行這個(gè)剛剛修補(bǔ)的程序。 14)如果一開(kāi)始的命令不是跳轉(zhuǎn)命令,那么可能就要用這種方法了。 以下所有的命令都是可以運(yùn)行在 WIN9x的 MSDOS 方式下的。 進(jìn)入 MSDOS 的方式有: [開(kāi)始 ][程序 ][MSDOS 方式 ] [開(kāi)始 ][運(yùn)行 ][打開(kāi) ]COMMAND[確定 ] 或者你可以雙擊它: C:\Windows\ 0)在使用時(shí),如何快速獲得 debug的使用幫助呢 以下 PROMPT表示目錄提示符:一般為: C:\WINDOWS\COMMAND\ PROMPT DEBUG /?按回車(chē) press the enter key now 怎樣?出錯(cuò)了吧。顯示如下 C:\WINDOWSDEBUG/? Runs Debug, a program testing and editing tool. DEBUG [[drive:][path]filename [testfileparameters]] [drive:][path]filename Specifies the file you want to test. testfileparameters Specifies mandline information required by the file you want to test. After Debug starts, type ? to display a list of debugging mands. 因?yàn)殄e(cuò)了所以它給你顯示一些提示。留意到最后一句了嗎? 現(xiàn)在我們?cè)賮?lái)試一試: PROMPT DEBUG按回車(chē) (注意 , DEBUG 程序的命 令是在一條橫線 后出現(xiàn)的。 ) ?在出現(xiàn)的橫線后面輸入 ?再回車(chē) (下面的內(nèi)容是按字母順序排列的 ) (注意: Note: Don39。t type the dash or ments just the ?) 顯示如下,但是沒(méi)有中文的哦,中文是我加上去的。 匯編 assemble A [address] 比較 pare C range address 傾倒 dump D [range] 進(jìn)入 enter E address [list] 填充 fill F range list 進(jìn)行 go G [=address] [addresses] 十六進(jìn)制 hex H value1 value2 輸入 input I port 裝載 load L [address] [drive] [firstsector] [number] 移動(dòng) move M range address 命名 name N [pathname] [arglist] 輸出 output O port byte 進(jìn)行 proceed P [=address] [number] 離開(kāi) quit Q 紀(jì)錄 register R [register] 搜尋 search S range list 描述 trace T [=address] [value] 反匯編 unassemble U [range] 寫(xiě) write W [address] [drive] [firstsector] [number] 分配擴(kuò)展內(nèi)存 allocate expanded memory XA [pages] 釋放擴(kuò)展內(nèi)存 deallocate expanded memory XD [handle] map expanded memory pages XM [Lpage] [Ppage] [handle] display expanded memory status XS q按回車(chē) (這是退出 DEBUG回到 DOS狀態(tài) )This quits out of debug, returning to the DOS prompt) Tested examples below walk the user thru the following debug examples: 在下面的例子里讀者必須明白以下幾條 DEBUG 命令。 D 顯示一定范圍內(nèi)存的內(nèi)容 Display the contents of an area of memory Q 退出 DEBUG 程序 Quit the debug program S 搜尋 Search for whatever H 十六進(jìn)制的運(yùn)算 Hex arithmatic R 顯示或者改變一個(gè)或者多個(gè)寄存器的內(nèi)容 Display or change the contents of one or more registers E 輸入數(shù)據(jù)進(jìn)入內(nèi)存,在一個(gè)詳細(xì)的地址里 Enter data into memory, beginning at a specific location G 運(yùn)行現(xiàn)在在內(nèi)存里的程序。 Go run the executable program in memory U 反匯編,把我們不認(rèn)識(shí)的機(jī)械代碼變?yōu)槲覀兛梢哉J(rèn)識(shí)匯編語(yǔ)言符號(hào) Unassemble machine code into symbolic code T 描述一條指令的用法。 Trace the contents of one instruction P 進(jìn)行或者執(zhí)行一個(gè)相關(guān)的指令 Proceed, or execute a set of related instructions A 編譯,把匯 編命令變?yōu)闄C(jī)械代碼 Assemble symbolic instructions into machine code N 命名一個(gè)程序 Name a program W 把一個(gè)已經(jīng)命名的程序?qū)戇M(jìn)磁盤(pán) Write the named program onto disk L 把程序裝載進(jìn)內(nèi)存 Load the named program back into memory 返回目錄 1)讓我們開(kāi)始工作吧,例如:顯示 BIOS 的日期 (以下 PROMPT表示目錄提示符:一般為: C:\WINDOWS\COMMAND\) PROMPT DEBUG按回車(chē) D FFFF:0006 L 8按回車(chē) (顯示 FFFFh, 偏移地址 6h, 長(zhǎng)度 8 bytes) 在作者的電腦上這里顯示為 1/10/96. 譯者的電腦顯示 FFFF:0000 37 2F30 36 2F 30 30 00 7/06/00.相信作者的電腦里也是用這種格式顯示的。這里顯示出來(lái)的是使用者 BIOS的日期,有興趣的話可以重新開(kāi)機(jī)看看,注意開(kāi)機(jī)時(shí)的顯示。 Q按回車(chē) (退出 DEBUG) 思考:當(dāng)只按 DEBUG的時(shí)候,編輯的是什 么?為什么可以找到 BIOS 的日期?(譯者這里也不是很清楚所以請(qǐng)大家知道的也留言給斑竹,改正。譯者認(rèn)為可能是內(nèi)存的真實(shí)物理地址。) 返回目錄 2)在你的電腦的 文件里搜尋 IBM這幾個(gè)字符 下面的 C:\Win95\是根據(jù)每不電腦不同的。像譯者的電腦里就是 C:\WINDOWS PROMPT DEBUG C:\Win95\按回車(chē) S 0 L FFFF IBM按回車(chē) (從 0 開(kāi)始搜尋 IBM,搜尋 FFFFh 多個(gè)單元格 ) Q按回車(chē) (退出 DEBUG) 以下是譯者做的: C:\WINDOWSDEBUG C:\WINDOWS\ S 0 L FFFF IBM S 0 L FFFF COMMAND 12A7:008D 12A7:04F7 12A7:3870 12A7:38BE 12A7:38DD S 0 L FFFF PATH 12A7:38AD 12A7:CCB7 12A7:CF55 S 0 L FFFF COMSPEC 12A7:38D4 12A7:3A4D 12A7:CCC4 Q C:\WINDOWS (注意:搜尋是要區(qū)分大小寫(xiě)的 ) ( 你可以看到上面是沒(méi)有找到 IBM的 , 可以試一試 PATH , COMSPEC , COMMAND) (注意 : 這種方法用在查找加密資料和已被刪除的資料等方面時(shí)是十分有用的) 返回目錄 3) 一位十六進(jìn)制數(shù)的運(yùn)算: PROMPT DEBUG按回車(chē) H 9 1按回車(chē) (加減兩個(gè)十六進(jìn)制的數(shù) , 9h+1h=Ah amp。 9h1h=8h) 結(jié)果是顯示 : 000A 0008 Q按回車(chē) (退出 DEBUG) C:\WINDOWSdebug h 9 1 000A 0008 q C:\WINDOWS 返回目錄 4) 檢查 x86 寄存器內(nèi)容 PROMPT DEBUG按回車(chē) R按回車(chē) (顯示 x86 寄存器內(nèi)容 ) Q按回車(chē) (退出 DEBUG) C:\WINDOWSdebug R AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=127C ES=127C SS=127C CS=127C IP=0100 NV UP EI PL NZ NA PO NC 127C:0100 043C ADD AL,3C Q 下面是對(duì)寄存器的簡(jiǎn)單介紹 : 數(shù)據(jù)存儲(chǔ)器 在本類(lèi)中,一般講的 AH 就是 AX 的前八位 ,AL 就是 AX 的后八位,后面的以此類(lèi)推。 AX Accumulator;作為累加器,所以它是算術(shù)運(yùn)算的主要寄存器。另外所有的 I/O指令都使用這一寄存器與外部設(shè)備傳送信息。 BX Base register;可以作為通用寄存器使用,此外在計(jì)算存儲(chǔ)器地址時(shí),它經(jīng)常用作基地址寄存器。 CX Counting register;可以作為通用寄存 器使用,此外在循環(huán) (LOOP)和串處理指令中作隱含的計(jì)數(shù)器。 DX Data register;可以作為通用寄存器使用,一般在作雙字長(zhǎng)運(yùn)算時(shí),把 DX 和 AX 組合在一起存放一個(gè)雙字長(zhǎng)數(shù), DX用來(lái)存放高位字。此外,對(duì)某些 I/O操作, DX可用來(lái)存放 I/O的端口地址。 指針及變址寄存器 BP Base pointers register ;機(jī)制指針寄存器 SI Source index register ;堆棧指針寄存器 DI Destiny index register ;目的變址寄存器 SP Battery pointe