【正文】
的指令。 ⑤ 按組合鍵 Alt+F10 會彈出一個適用于代碼顯示區(qū)的操作菜單。 ② 使用光標控制鍵可移動光標,通過翻頁鍵可調(diào)整所顯示的內(nèi)存區(qū)域。按組合鍵 Ctrl+C 彈出輸入數(shù)值的對話框。 (3) 查看和修改寄存器內(nèi)容 寄存器顯示區(qū)顯示了 CPU 內(nèi)部各通用寄存器、段寄存器和 IP 的當前值。按 Ctrl+T 可翻轉(zhuǎn)光條所在標志的狀態(tài),即 0 改 為 1, 1 改為 0。 Turbo Debugger 功能 TD 的主菜單條有 9 個主菜單項 (其中一個給出幫助信息 ),共 70 多個功能。選中該選項時,屏幕上出現(xiàn)一個對話框,要求用戶輸入文件名,用戶可鍵人當前目錄下的任何一個可執(zhí)行文件。 Get info : 顯示被調(diào)試程序的有關(guān)信息。 Quit : 退出 Turbo Debugger 調(diào)試程序。 3. View View 項的二級菜單提供了在當前窗口打開另一個新窗口的功能。 F2 是快捷鍵,按 F2 設(shè)置,再按 F2 清除斷點。 Module : 顯示當前源文件的模式。 CPU : 打開一個 CPU 窗口。 11 Another : 該選項中包含了 3 個已經(jīng)敘述過的選項: Module , Dump , File。 Trace into (快捷鍵 F7) : 單步執(zhí)行指令。執(zhí)行 CALL 指令時不眼蹤子程序,執(zhí)行 INT n 指令時也不跟蹤服務(wù)程序。 5. Breakpoints Breakpoints 選項提供了與斷點有關(guān)的一些功能。 6. Data Data 選項對程序中所涉及的變量和內(nèi)存區(qū)域進行檢查,并允許對表達式進行計算。如: Language : 設(shè)置表達式語言,有 C, Pascal , Assembler 可供選擇。例如: Zoom (快捷鍵 F5) : 放大或縮小窗口。 Close (快捷鍵 Alt+F3) : 關(guān)閉當前窗口。用戶可選擇該選項,也可利用TD 提供的在線幫助來調(diào)試程序。 ① DATA ENDS CODE SEGMENT USE16 ASSUME CS: CODE , DS: DATA BEG: MOV AX , DATA MOV DS , AX MOV ES , AX 。$39。 ⑦ MOV MESG+7 , 0 。 1. 調(diào)試 前的準備工 作 調(diào)用 TASM 和 TLINK 生成有調(diào)試信息的 EXE 文件,即 C: TASM HELLO / zi 生成 HELLO . OBJ C: TLINK HELLO / v / 3 生成 HELLO . EXE 2. 啟動 TD 鍵入: C: TD HELLO 成功啟動 TD 之后, TD 進入 MODULE 顯示模式,屏幕上顯示 HELLOASM 源程序,一個三角形符號指示出了標號為 BEG 的那條指令是啟動指令。按任意鍵可以恢復(fù) MODULE 窗口內(nèi)容。執(zhí)行 CALL 和 INT n 指令的時候, 不跟蹤 相關(guān)的子程序。 執(zhí)行 CALL 指令能夠跟蹤子程序,隨即暫停,等待用戶的下一步操作。 實踐證明:用 Alt+F7 跟進服務(wù)程序以后,如果再執(zhí)行單步操作,很容易使系統(tǒng)癱瘓。 將光標移到紅色光條覆蓋的指令,再次按下 F2 鍵,紅色光條消失,表明此處斷點撤銷。 (7) 檢查內(nèi)存數(shù)據(jù)區(qū)的內(nèi)容 如果被調(diào)試程序要對數(shù)據(jù)段或附加段進行操作,怎樣檢查結(jié)果 ? 關(guān)鍵問題是要找出用戶程序的數(shù)據(jù)段或附加段。例 1 中的語句 ① ~ ⑧ 就是為此項調(diào)試而設(shè)置的。 匯編語言調(diào)試軟件的文件組織 讀者應(yīng)自備一張含有 Borland Trubo Assembler 的光盤,執(zhí)行其中的INSTALL . EXE文件,根據(jù)操作提示將相關(guān)文件解壓縮存人硬盤作備份。 第 1章 匯編語言程序設(shè)計 匯編 程序的編輯與調(diào)試 【實驗?zāi)康摹? 學習匯編源程序的編輯、編譯、鏈接、執(zhí)行全過程。 【實驗 】 下面的程序采用比較法,將一個 8 位二進制數(shù)轉(zhuǎn)換成十進制數(shù)顯示,其設(shè)計方法拙劣,語法錯誤很多,希望以它為藍本,練習源程序的編輯、編譯、鏈接和調(diào)試。 DB 30H , 30H , 30H 。 100→AL ADD AH , AL MOV [BX] , AH 。 小于 100 轉(zhuǎn) SUB [BX] , 100 。 小于 10 轉(zhuǎn) SUB [BX] , 10 。 1. 示例 【 例 】變量 X, Y 為二位數(shù)字的 ASCII 碼串,請編寫程序計算并顯示出下式的值: Z←X+(Y15) 解 :求一個代數(shù)式 (或表達式 )的值,一般的做法是根據(jù)運算符的優(yōu)先級順序進行計算,如上式先計算 (Y15),再與 X 相加,將其結(jié)果存放在 Z 變量中,最后可用 DOS功能調(diào)用將結(jié)果顯示出來。sub ASCII numbers CODESG SEGMENT ASSUME CS: CODESG, DS: CODESG ORG 100H BEGIN: JMP SHORT MAIN 。 ASCII number Y DB 39。 initialize DS MOV DS , DX MOV AH , 0 。 adjust for sub MOV Z+2 , AL 。 sub digit with carry Z←Z+X 結(jié)果轉(zhuǎn)換為 ASCII 碼 顯示 結(jié)束 開始 圖 例 的 程序框圖 18 AAS 。 adjust for add XCHG AL , Z+2 。 store high_order result MOV Z , AH 。 offset of string Z MOV AH , 9 。 CODEG ENDS END BEGIN 2. 實驗題 【 實驗 】編寫程序,計算 (a + b) – 2 * (a AND b),結(jié)果送入 S 單元。 循環(huán)程序的設(shè)計 【 實驗?zāi)康?】 學習并掌握循環(huán)程序的設(shè)計方法。 根據(jù)題目的要求,程序可由三部分組成: ① 輸入:接收用戶鍵入的庫存品號; ② 查表:根據(jù)給定編號在表格中查找所要求的庫存品名稱; ③ 輸出:顯示找到的庫存品名稱。根據(jù)以上考慮可畫出程序框圖如圖 所示。 [程序清單 ]: 。 圖 例 的框圖 詢問庫存品號 庫存品號送緩存區(qū) AX← 庫存品號 接收庫存品號 顯示緩存區(qū)內(nèi)容 顯示 Not in table 有輸入? 開始 結(jié)束 修改地址 查找結(jié)束? (AX)=表格中的庫存品號? = ≠ N Y N Y 20 datasg segment para ? data‘ mess1 ld ?stock nember?‘ , 13 , 10 , ?$‘ stoknin label byte max db 3 act db ? stokn db 3 dup (?) stoktab db ?05‘ , ? Excavators ‘ db ?08‘ , ? F Lifters ‘ db ?09‘ , ? Presses ‘ db ?12‘ , ? Valves ‘ db ?23‘ , ? Processors ‘ db ?27‘ , ? Pumps ‘ descrn db 14 dup (20h) , 13 , 10 , ?$‘ mess db ?Not in table ! ? , $‖ datasg ends 。 put zore 。 into DS 。 MAIN PART OF PROGRAM GOES HERE start : lea dx , mess1 。 stock: table 21 je a30 。 length of descr‘n lea di , descrn 。 end of code segment end main 。內(nèi)層對應(yīng)于每個學生的名次計算,外層則解決所有學生的名次計算。 程序框圖如圖 所示。 define code segment 。 for return push ds 。 set DS register to current data39。 MAIN PART OF PROGRAM GOES HERE mov di , 10 mov bx , 0 loop: mov ax , grade [bx] mov dx , 0 mov cx , 10 lea si , grade next: cmp ax , [si] jg no_count inc dx no_count: add si , 2 loop next mov rank [bx] , dx add bx , 2 dec di 圖 例 的程序框圖 23 jne loop 。 end of code segment end start 。每 16 個字符為一行,每行中的相鄰兩個字符之間用空白符 (ASCII 為 0)隔開。 (3) 由于逐個顯示相繼的 ASCII 字符時,需要保存并不斷修改 dl 寄存器的內(nèi)容,而顯示空白、回車、換行符時也需要使用 DI 寄存器,為此可使用堆找來保存相繼的ASCII 字符。 24 (2) 并以十六進制的形式,顯示在屏幕上,顯示格式為: N=H MAX=H 提示 : ① 正確的答案是有 4 個負數(shù),如果你得到 3 個負數(shù),肯定是錯誤的。 【 實驗 】編程計算: S=1+2+3+…+N ≤100 的最大項數(shù) N 以及對應(yīng)的和 S。 1. 示例 【 例 】 統(tǒng)計學生成績 result。 [程序清單 ]: 。 MAIN PART OF PROGRAM 。 initialize first addr pare: mov ax , [bx] 。 80 ? jl seven cmp ax , 90 。 end of main part of program 。 [程序清單 ]: 。 define code segment 。 save old data segment sub bx , bx 。 into ds register, main partof program goes here cmp a l, 0 。 puts leastsignificant bit of al into the CF jnb not_yet 。 is on has not yet hen found, so BX is set to point to the next entry in the address table by 。 to indcate a dessired routine routine1: ┇ routine2: ┇ ret main endp 。 end assembly 2. 實驗題 【 實驗 】 試編一程序, 比較兩個字符串 STRING1 和 STRING2 所含字符是否完全相同,若相同則顯示 ‘MATCH‘ ,若不相同則顯示 ‘ NO MATCH ?。也可采用 01H 功能調(diào)用在接收字符后先分類計數(shù)然后再存入 緩沖區(qū)中。 28 提示 : (1) 用跳躍表法實現(xiàn)多個分支轉(zhuǎn)移。 要求從鍵盤取得一個十進制數(shù),然后把它以十六進制數(shù)形式在屏上顯示出來。 Convert decimal on keybd 。 Connects procedures together main proc far repeat: call decibin 開始 調(diào)用 DECIBIN 調(diào)用 BINHEX 調(diào)用 CRLF 調(diào)用 CRLF 從鍵盤取得十進制數(shù),保存在 BX中 從鍵盤取得十進制數(shù),保存在 BX中 顯示回車和換行 結(jié)束 圖 十進制到十六進制數(shù)轉(zhuǎn)換的程序結(jié)構(gòu) 29 。 print cr and lf Jmp repeat 。 RESULT IS LEFT IN BX REGISTER. Decibin proc near Mov bx , 0 。 call DOS sub al , 30h 。 yes, not dec digit cbw 。 trade digit amp。 trade digit amp。 get next digit exit ret 。 PROCEDURE TO CONVERT BINARY NUMBER IN BX TO HEX ON 。 left digit to right mov al , bl