匯編語言程序設計的實驗環(huán)境及上機步驟_第1頁
匯編語言程序設計的實驗環(huán)境及上機步驟_第2頁
匯編語言程序設計的實驗環(huán)境及上機步驟_第3頁
匯編語言程序設計的實驗環(huán)境及上機步驟_第4頁
匯編語言程序設計的實驗環(huán)境及上機步驟_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、匯編語言程序設計的實驗環(huán)境及上機步驟一、 實驗環(huán)境匯編語言程序設計的實驗環(huán)境如下:1. 硬件環(huán)境微型計算機(Intel x86系列 CPU 一臺2. 軟件環(huán)境Windows98/2000/XP操作系統任意一種文本編輯器(EDIT 、 NOTEPAD (記事本 、 UltraEDIT 等匯編程序(MASM.EXE 或 TASM.EXE 連接程序(LINK.EXE 或 TLINK.EXE 調試程序(DEBUG.EXE 或 TD.EXE 文本編輯器建議使用 EDIT 或 NOTEPAD , 匯編程序建議使用 MASM.EXE , 連接程序建議使用 LINK.EXE , 調試程序建議 使用 TD.EX

2、E 。二、 上機實驗步驟建議源程序存放的目錄名為 ASM (或 MASM , 并放在 C 盤或 D 盤的根目錄下。 如果沒有創(chuàng)建過此目錄, 請用如下方 法創(chuàng)建:通過 Windows 的資源管理器找到 C 盤的根目錄,在 C 盤的根目錄窗口中點擊右鍵,在彈出的菜單中選擇“新建” “文件夾” ,并把新建的文件夾命名為 ASM 。請把 MASM.EXE 、 LINK.EXE 、 DENUG.EXE 和 TD.EXE 都拷貝到此目錄中。2.建立 ASM 源程序建立 ASM 源程序可以使用 EDIT 或 NOTEPAD (記事本文本編輯器。下面的例子說明了用 EDIT 文本編輯器來建立 ASM 源程序的

3、步驟(假定要建立的源程序名為 HELLO.ASM ,用 NOTEPAD (記事本建立 ASM 源程序的步驟與此類似。 在 Windows 中 點 擊 桌 面 左 下 角 的 “ 開 始 ” 按 鈕 選 擇 “ 運 行 ” 在 彈 出 的 窗 口 中 輸 入 “ EDIT.COM C:ASMHELLO.ASM” ,屏幕上出現 EDIT 的編輯窗口,如圖 1所示。 圖 1 文本編輯器 EDIT 的編輯窗口窗口標題行顯示了 EDIT 程序的完整路徑名。 緊接著標題行下面的是菜單行, 窗口最下面一行是提示行。 菜單可以 用 Alt 鍵激活,然后用方向鍵選擇菜單項,也可以直接用 Alt-F 打開 Fil

4、e 文件菜單,用 Alt-E 打開 Edit 編輯菜單, 等等。如果鍵入 EDIT 命令時已帶上了源程序文件名(C:ASMHELLO.ASM ,在編輯窗口上部就會顯示該文件名。如果在 鍵入 EDIT 命令時未給出源程序文件名,則編輯窗口上會顯示“ UNTITLED1” ,表示文件還沒有名字,在這種情況下保存 源程序文件時, EDIT 會提示輸入要保存的源程序的文件名。編輯窗口用于輸入源程序。 EDIT 是一個全屏幕編輯程序,故可以使用方向鍵把光標定位到編輯窗口中的任何一個 位置上。 EDIT 中的編輯鍵和功能鍵符合 Windows 的標準,這里不再贅述。源程序輸入完畢后, 用 Alt-F 打開

5、 File 菜單, 用其中的 Save 功能將文件存盤。 如果在鍵入 EDIT 命令時未給出源 程序文件名,則這時會彈出一個“ Save as”窗口,在這個窗口中輸入你想要保存的源程序的路徑和文件名 (本例中為 C:ASMHELLO.ASM。 注意,匯編語言源程序文件的擴展名最好起名為 .ASM ,這樣能給后面的匯編和連接操作帶來很大的方便。 3.用 MASM.EXE 匯編源程序產生 OBJ 目標文件源文件 HELLO.ASM 建立后,要使用匯編程序對源程序文件匯編,匯編后產生二進制的目標文件(.OBJ 文件 。具 體操作如下: 方法一:在 Windows 中操作用資源管理器打開源程序目錄 C

6、:ASM,把 HELLO.ASM 拖到 MASM.EXE 程序圖標上。 方法二:在 DOS 命令提示符窗口中操作選擇“開始”“程序”“附件”“命令提示符” ,打開 DOS 命令提示符窗口,然后用 CD 命令轉到源程 序目錄下,接著輸入 MASM 命令:I:>C:<回車 >C:>CD ASM<回車 >C:ASM>MASM HELLO.ASM<回車 >操作時的屏幕顯示如圖 2所示。 圖 2 在 DOS 命令提示符窗口中進行匯編不管用以上二個方法中的哪個方法,進入 MASM 程序后,都會提示讓你輸入目標文件名(Object filename ,并

7、在 方括號中顯示默認的目標文件名,建議輸入目標文件的完整路徑名,如:C:ASMHELLO.OBJ回車 。后面的兩個提示 為可選項,直接按回車。注意,若打開 MASM 程序時未給出源程序名,則 MASM 程序會首先提示讓你輸入源程序文件名 (Source filename ,此時輸入源程序文件名 HELLO.ASM 并回車,然后進行的操作與上面完全相同。 圖 3 有錯誤的匯編過程例子如果沒有錯誤, MASM 就會在當前目錄下建立一個 HELLO.OBJ 文件(名字與源文件名相同,只是擴展名不同 。如 果源文件有錯誤, MASM 會指出錯誤的行號和錯誤的原因。 圖 3是在匯編過程中檢查出兩個錯誤的

8、例子。 在這個例子中, 可以看到源程序的錯誤類型有兩類: 警告錯誤 (Warning Errors。警告錯誤不影響程序的運行,但可能會得出錯誤的結果。此例中無警告錯誤。 嚴重錯誤 (Severe Errors。對于嚴重錯誤, MASM 將無法生成 OBJ 文件。此例中有兩個嚴重錯誤。在錯誤信息中, 園括號里的數字為有錯誤的行號 (在此例中, 兩個錯誤分別出現在第 6行和第 9行 , 后面給出了 錯誤類型及具體錯誤原因。如果出現了嚴重錯誤,你必須重新進入 EDIT 編輯器,根據錯誤的行號和錯誤原因來改正源 程序中的錯誤,直到匯編沒有錯為止。 注意,匯編程序只能指出程序的語法錯誤,而無法指出程序邏

9、輯的錯誤。4.用 LINK.EXE 產生 EXE 可執(zhí)行文件在上一步驟中,匯編程序產生的是二進制目標文件(OBJ 文件 ,并不是可執(zhí)行文件,要想使我們編制的程序能夠 運行,還必須用連接程序(LINK.EXE 把 OBJ 文件轉換為可執(zhí)行的 EXE 文件。具體操作如下: 方法一:在 Windows 中操作用資源管理器打開源程序目錄 C:ASM,把 HELLO.OBJ 拖到 LINK.EXE 程序圖標上。 方法二:在 DOS 命令提示符窗口中操作選擇“開始”“程序”“附件”“命令提示符” ,打開 DOS 命令提示符窗口,然后用 CD 命令轉到源程序 目錄下,接著輸入 LINK 命令:I:>C

10、:<回車 >C:>CD ASM<回車 >C:ASM>LINK HELLO.OBJ<回車 >操作時的屏幕顯示如圖 4所示。 圖 4 把 OBJ 文件連接成可執(zhí)行文件不管用以上二個方法中的哪個方法,進入 LINK 程序后,都會提示讓你輸入可執(zhí)行文件名(Run file ,并在方括 號中顯示默認的可執(zhí)行文件名,建議輸入可執(zhí)行文件的完整路徑名,如:C:ASMHELLO.EXE回車 。后面的兩個提示 為可選項,直接按回車。注意,若打開 LINK 程序時未給出 OBJ 文件名,則 LINK 程序會首先提示讓你輸入 OBJ 文件名 (Object Module

11、s ,此時輸入 OBJ 文件名 HELLO.OBJ 并回車,然后進行的操作與上面完全相同。如果沒有錯誤, LINK 就會建立一個 HELLO.EXE 文件。如果 OBJ 文件有錯誤, LINK 會指出錯誤的原因。對于無堆棧 警告(Warning :NO STACK segment信息,可以不予理睬,它不影響程序的執(zhí)行。如鏈接時有其它錯誤。須檢查修改 源程序,重新匯編、連接,直到正確。建立了 HELLO.EXE 文件后,就可以直接在 DOS 下運行此程序,如下所示:C:>HELLO回車C:>程序運行結束后,返回 DOS 。如果運行結果正確,那么程序運行結束時結果會直接顯示在屏幕上。如

12、果程序不顯 示結果,我們如何知道程序是否正確呢 ? 例如,這里的 HELLO.EXE 程序并未顯示出結果,所以我們不知道程序執(zhí)行的結 果是否正確。這時,我們就要使用 TD.EXE 調試工具來查看運行結果。此外,大部分程序必須經過調試階段才能糾正程 序執(zhí)行中的錯誤,調試程序時也要使用 TD.EXE 。實驗一 數據傳送一、 實驗目的1.熟悉 8086指令系統的數據傳送指令及 8086的尋址方式。2.利用 Turbo Debugger調試工具來調試匯編語言程序。二、 實驗預習要求1.復習 8086指令系統中的數據傳送類指令和 8086的尋址方式。2.預習 Turbo Debugger的使用方法(見附

13、錄二 :a 如何啟動 Turbo Debugger;b 如何在各窗口之間切換;c 如何查看或修改寄存器、狀態(tài)標志和存儲單元的內容;d 如何輸入程序段;e 如何單步運行程序段和用設置斷點的方法運行程序段。3.按照題目要求預先編寫好實驗中的程序段。三、 實驗任務1. 通過下述程序段的輸入和執(zhí)行來熟悉 Turbo Debugger的使用, 并通過顯示器屏幕觀察程序的執(zhí)行 情況。練習程序段如下:MOV BL , 08HMOV CL , BLMOV AX , 03FFHMOV BX , AXMOV DS :0020H, BX2.用以下程序段將一組數據壓入(PUSH 堆棧區(qū),然后通過不同的出棧順序出棧,觀

14、察出棧后數 據的變化情況。壓棧程序段如下:MOV AX , 0102HMOV BX , 0304HMOV CX , 0506HMOV DX , 0708HPUSH AXPUSH BXPUSH CXPUSH DX出棧程序段請自行編寫(用不同的出棧順序 。3. 指出下列指令的錯誤并加以改正,上機驗證之。(1 MOV BX, SI(2 MOV AH , BX(3 MOV AX , SIDI(4 MOV BYTE PTRBX, 2000H (5 MOV CS , AX (6 MOV DS , 2000H4. 設置各寄存器及存儲單元的內容如下: (BX=0010H , (SI=0001H(10010H=

15、12H , (10011H=34H , (10012H=56H , (10013H=78H (10120H=0ABH , (10121H=0CDH , (10122H=0EFH 說明下列各條指令執(zhí)行完后 AX 寄存器中的內容,并上機驗證。(1 MOV AX , 1200H (2 MOV AX , BX (3 MOV AX , 0120H (4 MOV AX , BX (5 MOV AX , 0110HBX (6 MOV AX , BXSI (7 MOV AX , 0110HBXSI5. 將 DS :1000H 字節(jié)存儲單元中的內容送到 DS :2020H 單元中存放。試分別用 8086的直接尋

16、址、 寄存器間接尋址、變址尋址、寄存器相對尋址傳送指令編寫程序段,并上機驗證結果。6. 設 AX 寄存器中的內容為 1111H , BX 寄存器中的內容為 2222H , DS :0010H 單元中的內容為 3333H 。 將 AX 寄存器中的內容與 BX 寄存器中的內容交換, 然后再將 BX 寄存器中的內容與 DS :0010H 單元中的內容進行交換。試編寫程序段,并上機驗證結果。7. 設 (DS=1000H , (ES=2000H ,有關存儲器的內容如圖 1.5所示。要求將 DS 段的內容傳送到 AX 寄存器, ES 段的內容傳送到 BX 寄存器,試編寫程序段。 圖 1.5 第 7題圖實驗

17、二 算術邏輯運算及移位操作DS :1000HES :2000H一、 實驗目的1.熟悉算術邏輯運算指令和移位指令的功能。2.了解標志寄存器各標志位的意義和指令執(zhí)行對它的影響。 二、 實驗預習要求1.復習 8086指令系統中的算術邏輯類指令和移位指令。2.按照題目要求在實驗前編寫好實驗中的程序段。三、 實驗任務1. 實驗程序段及結果表格如表 1. 2:表 1. 2 2. 用 BX 寄存器作為地址指針,從 BX 所指的內存單元 (0010H開始連續(xù)存入三個無符 號數 (10H、 04H 、 30H ,接著計算內存單元中的這三個數之和,和放在 0013H 單元中,再求 出這三個數之積,積放 0014單

18、元中。寫出完成此功能的程序段并上機驗證結果。MOV BX, 0010HMOV BYTE PTRBX, 10HMOV BYTE PTRBX+1, 04HMOV BYTE PTRBX+2, 30HMOV AL, 0HMOV AL, BXADD AL, BX+1ADD AL, BX+2MOV BYTE PTRBX+3, AL3.寫出完成下述功能的程序段。上機驗證你寫出的程序段,程序運行的最后結果 (AX=? 72(1 傳送 15H 到 AL 寄存器;(2 再將 AL 的內容乘以 2;(3 接著傳送 15H 到 BL 寄存器;(4 最后把 AL 的內容乘以 BL 的內容。MOV AL, 15HMUL

19、2MOV BL, 15HMUL BL4.寫出完成下述功能的程序段。上機驗證你寫出的程序段,程序運行后的商=?(1 傳送數據 2058H 到 DS :1000H 單元中,數據 12H 到 DS :1002H 單元中;(2 把 DS :1000H 單元中的數據傳送到 AX 寄存器;(3 把 AX 寄存器的內容算術右移二位;(4 再把 AX 寄存器的內容除以 DS :1002H 字節(jié)單元中的數;(5 最后把商存入字節(jié)單元 DS :1003H 中。5.下面的程序段用來清除數據段中從偏移地址 0010H 開始的 12個字存儲單元的內容(即將零送到 這些存儲單元中去 。(1 將第 4條比較指令語句填寫完整

20、(劃線處 。MOV SI , 0010HNEXT : MOV WORD PTRSI, 0ADD SI , 2CMP SI ,JNE NEXTHLT(2 假定要按高地址到低地址的順序進行清除操作 (高地址從 0020H 開始 , 則上述程序段應如何修 改?上機驗證以上兩個程序段并檢查存儲單元的內容是否按要求進行了改變。6. 輸入并運行表 1. 3中的程序段,把結果填入表右邊的空格中,并分析結果,說明本程序段的功 能是什么。表 1. 3 實驗三 串操作一、 實驗目的1.熟悉串操作指令的功能。2.了解串操作指令的使用方法。二、 實驗預習要求1.復習 8086指令系統中的串操作類指令。2.按照題目要求

21、在實驗前編寫好實驗中的程序段。三、 實驗任務1.輸入以下程序段并運行之,回答后面的問題。CLDMOV DI , 1000HMOV AX , 55AAHMOV CX , 10HREP STOSW上述程序段執(zhí)行后:(1 從 DS :1000H 開始的 16個字單元的內容是什么?(2 (DI = ?(CX = ?,并解釋其原因。2.在上題的基礎上,再輸入以下程序段并運行之,回答后面的問題。 MOV SI , 1000HMOV DI , 2000HMOV CX , 20HREP MOVSB程序段執(zhí)行后:(1 從 DS :2000H 開始的 16個字單元的內容是什么?(2 (SI = ?(DI = ?(

22、CX = ?,并分析之。3.在以上兩題的基礎上,再輸入以下三個程序段并依次運行之。 程序段 1:MOV SI , 1000HMOV DI , 2000HMOV CX , 10HREPZ CMPSW程序段 1執(zhí)行后:(1 ZF=? 根據 ZF 的狀態(tài),你認為兩個串是否比較完了?(2(SI = ?(DI = ?(CX = ?,并分析之。程序段 2:MOV 2008H, 4455HMOV SI , 1000HMOV DI , 2000HMOV CX , 10HREPZ CMPSW程序段 2執(zhí)行后:(1 ZF=? 根據 ZF 的狀態(tài),你認為兩個串是否比較完了?(2(SI = ?(DI = ?(CX =

23、 ?,并分析之。程序段 3:MOV AX , 4455HMOV DI , 2000HMOV CX , 10HREPNZ SCASW程序段 3執(zhí)行后:(1 ZF=? 根據 ZF 的狀態(tài),你認為在串中是否找到了數據 4455H ?(2(SI = ?(DI = ?(CX = ?,并分析之。4.從 DS :1000H 開始存放有一個字符串 ”This is a string” ,要求把這個字符串從后往前傳送到 DS :2000H 開始的內存區(qū)域中 (即傳送結束后, 從 DS :2000H 開始的內存單元的內容為 ”gnirts a si sihT” , 試編寫程序段并上機驗證之。實驗四 字符及字符串的

24、輸入和輸出一、 實驗目的1.熟悉如何進行字符及字符串的輸入輸出。2.掌握簡單的 DOS 系統功能調用。二、 實驗預習要求1.復習系統功能調用的 1、 2、 9、 10號功能。2.按照題目要求預先編寫好實驗中的程序段。三、 實驗任務1.輸入以下程序段并用 F8鍵單步運行,執(zhí)行 INT 21H指令時,在鍵盤上按“ 5”鍵。MOV AH , 1INT 21H(1 運行結束后, (AL =?它是哪一個鍵的 ASCII 碼?(2 重復運行以上程序段,并分別用“ A ” 、 “ B ” 、 “ C ” 、 “ D ”鍵代替“ 5”鍵,觀察運行結果有 何變化?2.在 DS :1000H 開始的內存區(qū)域設置如

25、下鍵盤緩沖區(qū):DS :1000H 5, 0, 0, 0, 0, 0, 0然后輸入以下程序段并用 F8鍵單步運行, 執(zhí)行 INT 21H指令時, 在鍵盤上鍵入 “ 5” 、 “ 4” 、 “ 3” 、 “ 2” 、 “ 1” 、 回車這六個鍵。LEA DX , 1000HMOV AH , 0AHINT 21H程序段運行完后,檢查 DS :1000H 開始的內存區(qū)域:(1 DS:1001H 單元的內容是什么?它表示了什么含義?(2 從 DS :1002H 開始的內存區(qū)域中的內容是什么?其中是否有字符 “ 1” 的 ASCII 碼?為什么? 3.輸入以下程序段并運行之。MOV DL , A MOV

26、AH , 2INT 21H(1觀察屏幕上的輸出,是否顯示了“ A ”字符?(2分別用“ #” 、 “ X ” 、 “ Y ” 、 “ $” 、 “ ? ”代替程序段中的“ A ”字符,觀察屏幕上的輸出有何變 化。(3分別用 0DH 、 0AH 代替程序段中的“ A ”字符,觀察屏幕上的輸出有何變化。(4用 07H 代替程序段中的 “ A ” 字符, 觀察屏幕上有無輸出?計算機內的揚聲器是否發(fā)出 “嗶” 的聲音?4.要在屏幕上顯示一個字符串“ Hello, world ” ,寫出該字符串變量的定義語句和顯示這個字符串的 程序段。上機驗證之。5.按 6行×16列的格式順序顯示 ASCII

27、 碼為 20H 到 7FH 之間的所有字符, 即每 16個字符為一行, 共 6行。每行中相鄰的兩個字符之間用空格字符分隔開。試編寫程序段并上機運行驗證。提示:程序段 包括兩層循環(huán),內循環(huán)次數為 16,每次內循環(huán)顯示一個字符和一個空格字符;外循環(huán)次數為 6,每個外 循環(huán)顯示一行字符并顯示一個回車符(0DH 和一個換行符(0AH 。實驗五 直線程序設計一、 實驗目的1、學習 8086匯編語言程序的基本結構和程序設計的基本方法。2、熟悉在 PC 機上建立、匯編、鏈接、調試和運行 8086匯編語言程序的全過程。二、 實驗預習要求1、 認真閱讀預備知識中匯編語言的上機步驟的說明, 熟悉匯編程序的建立、

28、匯編、 連接、 執(zhí)行、 調試的全過程。2、 復習 BCD 碼運算的調整指令。3、根據本實驗的編程提示和程序框架預先編寫匯編語言源程序。4、有興趣的同學請自行編寫出后面的實驗習題。三、 直線程序簡介直線程序是控制流僅有一個走向的程序,它主要用于解決一些無需進行判斷分支,也無需循環(huán)簡單 的簡單問題。四、 實驗內容設 a 、 b 、 c 、 d 四個數分別以壓縮的 BCD 碼形式存放在內存 NUM 開始的四個單元, 計算 (a+b-(c+d, 然后把結果顯示在屏幕上。改變 a , b , c , d 內容,然后重新匯編、連接并運行程序,檢查其結果與手工計算是否相符。下面是 幾組實驗用的數據:1、 a

29、 =09, b =16, c =04, d =172、 a =38, b =41, c =29, d =343、 a =70, b =23, c =42, d =414、 a =63, b =73, c =62, d =50五、 調試提示源程序編制完后,先靜態(tài)檢查,無誤后,對源程序進行匯編連接,生成可執(zhí)行文件。先將程序在 DOS 下運行,如正確,則改變 a , b , c , d 的值反復驗證,如不正確,則將程序調入 TD 中進行調試。六、 實驗習題若改變 a, b, c, d的值如下:1、 a =90, b =34, c =33, d =442、 a =12, b =19, c =25, d

30、 =33觀察結果,改進程序使結果正確。實驗六 分支及循環(huán)程序設計一、 實驗目的1、學習提示信息的顯示及鍵盤輸入字符的方法。2、掌握分支程序和循環(huán)程序的設計方法。二、 實驗預習要求1、復習比較指令、轉移指令、循環(huán)指令的用法。2、根據編程提示,編出匯編語言源程序。3、有興趣的同學請編寫出實驗習題中的程序。三、 分支程序和循環(huán)程序簡介1、 分支程序是根據不同條件執(zhí)行不同處理過程的程序。 分支程序的結構有兩種:種是二分支, 種是多分支。它們的共同特點是在滿足某一條件時,將執(zhí)行多個分支中的某分支。2、 循環(huán)程序四、 實驗內容在屏幕上顯示提示信息“ Please input 10 numbers:” ,提

31、示用戶輸入 10個數(數的范圍在 099之間 , 然后從鍵盤上讀入這 10個數。 接著對這 10個數從小到大進行排序, 并統計 059、 6079、 80 99的數各有多少。最后在屏幕上顯示排序后的數(每個數之間用逗號分隔并顯示統計的結果。 顯示格 式如下:Sorted numbers: xx,xx,xx,xx,xx,xx,xx,xx,xx,xx0-59: xx60-79: xx80-99: xx五、 實驗習題1. 從鍵盤輸入任意一個字符串,統計其中不同字符出現的次數(不分大小寫 ,并把結果顯示在屏 幕上。2. 從鍵盤分別輸入兩個字符串,若第二個字符串包含在第一個字符串中則顯示 MATCH ,

32、否則顯 示 NO MATCH 。TD.EXE 簡要使用說明TD . EXE (簡稱 TD 是一個具有窗口界面的程序調試器。利用 TD ,用戶能夠調試已有的可執(zhí)行程序(后綴為 EXE ; 用戶也可以在 TD 中直接輸入程序指令,編寫簡單的程序(在這種情況下,用戶每輸入一條指令, TD 就立即將輸入的指令匯編成機器指令代碼 。作為入門指導,下面簡單介紹一下 TD 的使用方法,更詳細深入的使用說明請參考相關資料。一、如何啟動 TD二、 TD 中的數制三、 TD 的用戶界面四、代碼區(qū)的操作五、寄存器區(qū)和標志區(qū)的操作六、數據區(qū)的操作七、堆棧區(qū)的操作一、如何啟動 TD1. 在 DOS 窗口中啟動 TD僅啟

33、動 TD 而不載入要調試的程序轉到 TD.EXE 所在目錄(假定為 C:ASM ,在 DOS 提示符下鍵入以下命令(用戶只需輸入帶下劃線的部分,表示 回車鍵,下同 :C:ASM>TD 用這種方法啟動 TD , TD 會顯示一個版權對話框,這時按回車鍵即可關掉該對話框。啟動 TD 并同時載入要調試的程序轉到 TD.EXE 所在目錄,在 DOS 提示符下鍵入以下命令(假定要調試的程序名為 HELLO.EXE :C:ASM>TD HELLO.EXE 若建立可執(zhí)行文件時未生成符號名表, TD 啟動后會顯示“ Program has no symbol table”的提示窗口,這時按回車鍵

34、即可關掉該窗口。2. 在 Windows 中啟動 TD僅啟動 TD 而不載入要調試的程序雙擊 TD.EXE 文件名, Windows 就會打開一個 DOS 窗口并啟動 TD 。啟動 TD 后會顯示一個版權對話框,這時按回 車鍵即可關掉該對話框。啟動 TD 并同時載入要調試的程序把要調試的可執(zhí)行文件拖到 TD.EXE 文件名上, Windows 就會打開一個 DOS 窗口并啟動 TD , 然后 TD 會把該可執(zhí)行 文件自動載入內存供用戶調試。若建立可執(zhí)行文件時未生成符號名表, TD 啟動后會顯示“ Program has no symbol table”的提示窗口,這時按回車 鍵即可關掉該窗口。

35、二、 TD 中的數制TD 支持各種進位記數制,但通常情況下屏幕上顯示的機器指令碼、內存地址及內容、寄存器的內容等均按十六進制 顯示(數值后省略“ H ” 。在 TD的很多操作中,需要用戶輸入一些數據、地址等,在輸入時應遵循計算機中數的記數制標識規(guī)范。例如: 二進制數后面加“ B ”或“ b ” ,如 10010001b 等; 十六進制數后面加“ H ”或“ h ” ,如 38h 、 0a5h 、 0ffh 等。如果在輸入的數后面沒有用記數制標識字母來標識其記數制, TD 默認該數為十六進制數。但應注意,如果十六進制數 的第一個數字為“ a ”“ f ” ,則前面應加 0,以區(qū)別于符號和名字。T

36、D 允許在常數前面加上正負號。例如,十進制數的 -12可以輸入為 -12d ,十六進制數的 -5a 可以輸入為 -5ah , TD 自動 會把輸入的帶正負號的數轉換為十六進制補碼數。只有一個例外,當數據區(qū)的顯示格式為字節(jié),若要修改存儲單元的內容則不允許用帶有正負號的數,而只 能按手工轉換成補碼后再輸入。本實驗指導書中所有的實驗在輸入程序或數據時,若沒有特別說明,都可按十六進制數進行輸入,若程序中需要輸入 負數,可按上述規(guī)則進行輸入。三、 TD 的用戶界面1. CPU 窗口TD 啟動后呈現的是一個具有窗口形式的用戶界面,見圖 B.1,它稱為 CPU 窗口。 CPU 窗口顯示了 CPU 和內存的整

37、 個狀態(tài)。利用 CPU 窗口可以:在代碼區(qū)內使用嵌入匯編,輸入指令或對程序進行臨時性修改。 存取數據區(qū)中任何數據結構下的字節(jié),并以多種格式顯示或改變它們。檢查和改變寄存器(包括標志寄存器的內容。 圖 B.1 TD 的 CPU 窗口界面代碼區(qū)數據區(qū)寄存器區(qū)堆棧區(qū) 標志區(qū)功能鍵提示條全局菜單CPU 窗口分為五個區(qū)域:代碼區(qū)、寄存器區(qū)、標志區(qū)、數據區(qū)和堆棧區(qū)。在五個區(qū)域中,光標所在區(qū)域稱為當前區(qū)域,用戶可以使用 Tab 鍵或 Shift-Tab 鍵切換當前區(qū)域,也可以在相應區(qū)中單 擊鼠標左鍵選中某區(qū)為當前區(qū)。光標在各個區(qū)域中顯示形式稍有不同,在代碼區(qū)、寄存器區(qū)、標志區(qū)和堆棧區(qū)呈現為一個反白條,在存儲

38、器 區(qū)為下劃線形狀。在圖 B.1中, CPU 窗口上邊框的左邊顯示的是處理器的類型 (8086、 80286、 80386、 80486等,對于 80486以上的 CPU 均顯示為 80486 。上邊框的中間靠右處顯示了當前指令所訪問的內存單元的地址及內容。再往右的“ 1”表示此 CPU 窗口是第一個 CPU 窗口, TD 允許同時打開多個 CPU 窗口。CPU 窗口中的代碼區(qū)用于顯示指令地址、指令的機器代碼以及相應的匯編指令;寄存器區(qū)用于顯示 CPU 寄存器當 前的內容;標志區(qū)用于顯示 CPU的 8個標志位當前的狀態(tài); 數據區(qū)用于顯示用戶指定的一塊內存區(qū)的數據 (十六進制 ; 堆棧區(qū)用于顯示

39、堆棧當前的內容。 在代碼區(qū)和堆棧區(qū)分別顯示有一個特殊標志( ,稱為箭標。代碼區(qū)中的箭標指示出當前程序指令的位置(CS :IP , 堆棧區(qū)中的箭標指示出當前堆棧指針位置(SS :SP 。2. 全局菜單介紹CPU 窗口的上面為 TD 的全局菜單條,可用“ A L T 鍵 +菜單項首字符”打開菜單項對應的下拉子菜單。在子菜單中用 “” 、 “”鍵選擇所需的功能,按回車鍵即可執(zhí)行選擇的功能。為簡化操作,某些常用的子菜單項后標出了對應的快捷鍵。下面簡單介紹一下常 用的菜單命令,詳細的說明情查閱相關資料。(1 File 菜單:文件操作Open 載入可執(zhí)行程序文件準備調試Change dir改變當前目錄Ge

40、t info顯示被調試程序的信息DOS shell執(zhí)行 DOS 命令解釋器(用 EXIT 命令退回到 TD Quit 退出 TD (Alt-X (2Copy 復制當前光標所在內存單元的內容到粘貼板(Shift-F3Paste 把粘貼板的內容粘貼到當前光標所在內存單元(Shift-F4(3Breakpoints 斷點信息Stack 堆棧段內容Watches 被監(jiān)視對象信息Variables 變量信息Module 模塊信息File 文件內容CPU 打開一個新的 CPU 窗口Dump 數據段內容Registers 寄存器內容(4Run 從 CS:IP開始運行程序直到程序結束 (F9Go to cur

41、sor從 CS:IP開始運行程序到光標處 (F4Trace into單步跟蹤執(zhí)行(對 CALL 指令將跟蹤進入子程序 (F7Step over單步跟蹤執(zhí)行 (對 CALL 指令將執(zhí)行完子程序才停下 (F8Execute to執(zhí)行到指定位置 (Alt-F9Until return執(zhí)行當前子程序直到退出 (Alt-F8(5Toggle 在當前光標處設置 /清除斷點 (F2At 在指定地址處設置斷點(Alt-F2Delete all清除所有斷點(6Inspector 打開觀察器以查看指定的變量或表達式Evaluate/Modify計算和顯示表達式的值Add watch增加一個新的表達式到觀察器窗口(

42、7Display options 設置屏幕顯示的外觀Path for source指定源文件查找目錄Save options保存當前選項(8Zoom 放大 /還原當前窗口(F5Next 轉到下一窗口(F6Next Pane轉到當前窗口的下一區(qū)域(Tab Size/Move改變窗口大小 /移動窗口(Ctrl-F5Close 關閉當前窗口(Alt-F3User screen查看用戶程序的顯示(Alt-F53. 功能鍵提示條菜單中的很多命令都可以使用功能鍵來簡化操作。 功能鍵分為三組:F1F10功能鍵, Alt-F1Alt-F10功能鍵以及 Ctrl 功能鍵(Ctrl 功能鍵實際上就是代碼區(qū)的局部菜

43、單 。 CPU 窗口下面的提示條中顯示了這三組功能鍵對應的功能。通常情況下提示條中顯示的是 F1F10功能鍵的功能。按住 Alt 不放,提示條中將顯示 Alt-F1Alt-F10功能鍵的功能。 按住 Ctrl 不放, 提示條中將顯示各 Ctrl 功能鍵的功能。表 B.1列出了各功能鍵對應的功能。表 B. 1 局部菜單TD 的 CPU 窗口中,每個區(qū)域都有一個局部菜單,局部菜單提供了對本區(qū)域進行操作的各個命令。在當前區(qū)域中按 Alt-F10鍵即可激活本區(qū)域的局部菜單。代碼區(qū)、數據區(qū)、堆棧區(qū)和寄存器區(qū)的局部菜單見圖 B.2圖 B.5所示。標志區(qū)的局部菜單非常簡單,故沒 有再給出其圖示。對局部菜單中

44、各個命令的解釋將在下面幾節(jié)中分別進行說明。圖 B.2 代碼區(qū)的局部菜單圖 B.3 數據區(qū)的局部菜單圖 B.4 堆棧區(qū)的局部菜單圖 B.5 寄存器區(qū)的局部菜單四、代碼區(qū)的操作代碼區(qū)用來顯示代碼(程序的地址、代碼的機器指令和代碼的反匯編指令。本區(qū)中顯示的反匯編指令依賴于所指定 的程序起始地址。 TD 自動反匯編代碼區(qū)的機器代碼并顯示對應的匯編指令。每條反匯編指令的最左端是其地址, 如果段地址與 CS 段寄存器的內容相同, 則只顯示字母 “ CS ” 和偏移量 (CS:YYYY , 否則顯示完整的十六進制的段地址和偏移地址(XXXX:YYYY 。地址與反匯編指令之間顯示的是指令的機器碼。如果代碼區(qū)當

45、前光標所在指令引 用了一個內存單元地址,則該內存單元地址和內存單元的當前內容顯示在 CPU 窗口頂部邊框的右部,這樣不僅可以看到指令操作碼,還可看到 指令要訪問的內存單元的內容。1. 輸入并匯編一條指令有時我們需要在代碼區(qū)臨時輸入一些指令。 TD 提供了即時匯編功能,允許用戶在 TD 中直接輸入指令 (但直接輸入的 指令都是臨時性的,不能保存到磁盤上 。直接輸入指令的步驟如下:(1 使用方向鍵把光標移到期望的地址處。(2 打開指令編輯窗口。有兩種方法:一是直接輸入匯編指令,在輸入匯編指令的同時屏幕上就會自動彈出指令的 臨時編輯窗口。二是激活代碼 (3 區(qū)局部菜單(見下一小節(jié) ,選擇其中的匯編命

46、令,屏幕上也會自動彈出指令的臨時編輯窗口。(4 在臨時編輯窗口中輸入 /編輯指令,每輸入完一條指令,按回車,輸入的指令即可出現在光標處,同時光標自動 下移一行,以便輸入下一條指(5 令。注意,臨時編輯窗口中曾經輸入過的指令均可重復使用,只要在臨時編輯窗口中用方向鍵把光標定位到所 需的指令處,按回車即可。如果臨時編輯(6 窗口中沒有完全相同的指令,但只要有相似的指令,就可對其進行編輯后重復使用。2. 代碼區(qū)局部菜單當代碼區(qū)為當前區(qū)域時(若代碼區(qū)不是當前區(qū)域,可連續(xù)按 Tab 或 Shift-Tab 鍵使代碼區(qū)成為當前區(qū)域 ,按 A lt-F10組合鍵即可激活代碼區(qū)局部菜單,代碼區(qū)局部菜單的外觀見

47、圖 B.2。下面介紹一下各菜單項的功能。Goto (轉到指定位置此命令可在代碼區(qū)顯示任意指定地址開始的指令序列。用戶可以鍵入當前被調試程序以外的地址以檢查 ROM 、 BIOS 、 DOS 及其它駐留程序。此命令要求用戶提供要顯示的代碼起始地址。使用 Previous 命令可以恢復到本命令使用前的代碼區(qū)位置。Origin (回到起始位置從 CS:IP指向的程序位置開始顯示。在移動光標使屏幕滾動后想返回起始位置時可使用此命令。使用 Previous 命令可 恢復到本命令使用前的代碼區(qū)位置。Follow (追蹤指令轉移位置從當前指令所要轉向的目的地址處開始顯示。 使用本命令后, 整個代碼區(qū)從新地址

48、處開始顯示。 對于條件轉移指令 (JE 、 JNZ 、 LOOP 、 JCXZ 等 ,無論條件滿足與否,都能追蹤到其目的地址。也可以對 CA LL 、 JMP 及 INT 指令進行追蹤。使用 Previous 命令可恢復到本 命令使用前的代碼區(qū)位置。Caller (轉到調用者從調用當前子程序的 CA LL 指令處開始顯示。本命令用于找出當前顯示的子程序在何處被調用。使用 Previous 命令可 恢復到本命令使用前的代碼區(qū)位置。Previous (返回到前一次顯示位置如果上一條命令改變了顯示地址,本命令能恢復上一條命令被使用前的顯示地址。注意光標鍵、 PgUp 、 PgDn 不會改 變顯示地址

49、。若重復使用本命令,則在當前顯示地址和前一次顯示地址之間切換。Search (搜索本命令用于搜索指令或字節(jié)列表。注意,本命令只能搜索那些不改變內存內容的指令,如:PUSH DXPOP DI+4ADD AX , 100若搜索以下指令可能會產生意想不到的結果:JE 123CA LL MYFUNCLOOP 100View Source(查看源代碼本命令打開源模塊窗口,顯示與當前反匯編指令相應的源代碼。如果代碼區(qū)的指令序列沒有源程序代碼,則本命令不 起作用。 Mixed (混合本命令用于選擇指令與代碼的顯示方式,有三個選擇:No 只顯示反匯編指令,不顯示源代碼行。Y es 如當前模塊為高級語言源模塊,

50、應使用此選擇。源代碼行被顯示在第一條反匯編指令之前。Both 如當前模塊為匯編語言源模塊,應使用此選擇。在有源代碼行的地方就顯示該源代碼行,否則顯示匯編指令。New CS:IP(設置 CS:IP為當前指令行的地址 本命令把 CS:IP設置為當前指令所在的地址, 以便使程序從當前指令處開始執(zhí)行。 用這種方法可以執(zhí)行任意一段 指令序列,或者跳過那些不希望執(zhí)行的程序段。注意,不要使用本命令把 CS:IP設置為當前子程序以外的地址,否則有可能引起整個程序崩潰。 Assemble (即時匯編本命令可即時匯編一條指令,以代替當前行的那條指令。注意,若新匯編的指令與當前行的指令長度不同,其后面機 器代碼的反

51、匯編顯示會發(fā)生變化。也可以直接在當前行處輸入一條匯編指令來激活此命令。 I/O(輸入 /輸出本命令用于對 I/O端口進行讀寫。選擇此命令后,會再彈出下一級子菜單,如圖 B.6所示。子菜單中的命令解釋如下:In byte(輸入字節(jié)用于從 I/O端口輸入一個字節(jié)。用戶需提供端口地址。Out byte(輸出字節(jié)用于往 I/O端口輸出一個字節(jié)。用戶需提供端口地址。Read word(輸入字用于從 I/O端口輸入一個字。用戶需提供端口地址。Write word(輸出字用于往 I/O端口輸出一個字。用戶需提供端口地址。 圖 B.6 輸入 /輸出子菜單五、寄存器區(qū)和標志區(qū)的操作列出了各標志位在該區(qū)的縮寫字母

52、。表 B. 2 1. 寄存器區(qū)局部菜單當寄存器區(qū)為當前區(qū)域時 (若寄存器區(qū)不是當前區(qū)域, 可連續(xù)按 Tab 或 Shift-Tab 鍵使寄存器區(qū)成為當前區(qū)域 , 按 Alt-F10組合鍵即可激活寄存器區(qū)局部菜單,寄存器區(qū)局部菜單的外觀見圖 B.5。以下是各菜單項的功能。Increment (加 1本命令用于把當前寄存器的內容加 1。Decrement (減 1本命令用于把當前寄存器的內容減 1。Zero (清零本命令用于把當前寄存器的內容清零。Change (修改本命令用于修改當前寄存器的內容。選擇此命令后,屏幕上會彈出一個輸入框,在輸入框中鍵入新的值,然后回車, 這個新的值就會取代原來該寄存

53、器的內容。修改寄存器的內容還有一個更簡單的變通方法,即把光標移到所需的寄存器上,然后直接鍵入新的值。Register 32-bit(32位寄存器按 32位格式顯示 CPU 寄存器的內容(缺省為 16位格式 。在 286以下的 CPU 或實方式時只需使用 16位顯示格式即 可。2. 修改標志位的內容用局部菜單的命令修改標志位的內容比較繁瑣。實際上只要把光標定位到要修改的標志位上按回車鍵或空格鍵即可使 標志位的值在 0、 1之間變化。六、數據區(qū)的操作數據區(qū)顯示了從指定地址開始的內存單元的內容。每行左邊按十六進制顯示段地址和偏移地址(XXXX:YYYY 。若段地 址與當前 DS 寄存器內容相同,則顯

54、示“ DS ”和偏移量(DS:YYYY 。地址的右邊根據“ Display as”局部菜單命令所設置的格式顯示一個或多個數 據項。對字節(jié)(Byte 格式,每行顯示 8個字節(jié);對字格式(Word ,每行顯示 4個字;對浮點格式(Comp 、 Float 、 Real 、 Double 、 Extended , 每行顯示 1個浮點數;對長字格式(Long ,每行顯示 2個長字。當以字節(jié)方式顯示數據時,每行的最右邊顯示相應的 ASCII 字符, TD 能顯示所有字節(jié)值所對應的 ASCII 字符。 1.顯示 /修改數據區(qū)的內容在默認的情況下, TD 在數據區(qū)顯示從當前指令所訪問的內存地址開始的存儲區(qū)域

55、內容。但用戶也可用局部菜單中的 “ Goto ”命令顯示任意指定地址開始的內存區(qū)域的內容。 TD 還提供了讓用戶修改存儲單元內容的功能,用戶可以很方便地把任意一個內存單元的內容 修改成所期望的值。但要注意,若修改了系統使用的內存區(qū)域,將會產生不可預料的結果,甚至會導致系統崩潰。修改內存單元內容的步驟如下: (1 使用局部菜單中的“ Goto ”命令并結合使用方向鍵把光標移到期望的地址單元處(注意數據區(qū)的光標是一個下 劃線 。(2 打開數據編輯窗口。有兩種方法:(3 方法 1:直接輸入數據,在輸入數據的同時屏幕上就會自動彈出數據編輯窗口。(4 方法 2:激活數據區(qū)局部菜單(見下一小節(jié) ,選擇其中的“ Change ”命令,屏幕上也會彈出數據編輯窗 口。(5 在數據編輯窗口中輸入所需的數據,輸入完后,按回車,輸入的數據就會替代光標處的原始數據。注意,數據 編輯窗口中曾經輸入過的數據均可(6 重復使用,只要在數據編輯窗口中用方向鍵把光標定位到所需的數據處,按回車即可。當數據區(qū)為

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論