匯編程序 讀入一個(gè)文本文件并以DEBUG中的D命令格式顯示.doc_第1頁
匯編程序 讀入一個(gè)文本文件并以DEBUG中的D命令格式顯示.doc_第2頁
匯編程序 讀入一個(gè)文本文件并以DEBUG中的D命令格式顯示.doc_第3頁
匯編程序 讀入一個(gè)文本文件并以DEBUG中的D命令格式顯示.doc_第4頁
匯編程序 讀入一個(gè)文本文件并以DEBUG中的D命令格式顯示.doc_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

目 錄1. 題目12. 程序總體設(shè)計(jì)方案、思路13. 程序設(shè)計(jì)框圖34. 源程序清單115. 程序調(diào)試結(jié)果及分析186. 設(shè)計(jì)總結(jié)216.1問題216.2心得21湖南工程學(xué)院課程設(shè)計(jì)報(bào)告1. 題目讀入一個(gè)文本文件并以DEBUG中的D命令格式顯示2. 程序總體設(shè)計(jì)方案、思路本程序是讀入一個(gè)文本文件并以DEBUG中的D命令格式顯示。 操作環(huán)境是32位的windows XP系統(tǒng),使用CmasmW軟件(本人使用Masm軟件,操作環(huán)境是64位WINDOWS 7)進(jìn)行匯編。本程序要求以DEBUG中的D命令格式顯示一個(gè)文本文件,文件名從鍵盤鍵入,大體思路為打開相應(yīng)文件,讀文件至程序緩沖區(qū),并按照要求顯示,以下是我本次課程設(shè)計(jì)的詳細(xì)方案、思路:本程序要求用D命令格式顯示內(nèi)容,使用DEBUG中的D命令格式顯示一個(gè)文本文件時(shí),顯示寄存器中的內(nèi)容大致為:段地址、偏移地址、ASCII碼部分(每個(gè)字節(jié)的值都用ASCII碼表示)和字符顯示部分(將ASCII碼轉(zhuǎn)化為字符顯示),每個(gè)非打印字符(無效的字符)在顯示時(shí)用“.”表示,每行顯示16個(gè)字節(jié)的內(nèi)容,第8個(gè)字節(jié)和第9個(gè)字節(jié)之間有一個(gè)連接字符“-”。每個(gè)顯示行從16字節(jié)的邊界上開始。程序主要由兩大塊組成,第一塊是文件的獲取,包括鍵入、打開、讀取和關(guān)閉,其中主要涉及基本DOS系統(tǒng)功能調(diào)用指令的使用。第二塊是文件的顯示,包括段地址、偏移地址、以及讀取的文件內(nèi)容(ASCII碼及對(duì)應(yīng)的符號(hào)),其中就涉及到多次轉(zhuǎn)移和循環(huán),需要多個(gè)子程序的支持才能實(shí)現(xiàn)(注意子程序要進(jìn)行存儲(chǔ)保護(hù)和恢復(fù))。程序開始之前,首先在DATA SEGMENT數(shù)據(jù)段中定義BUF1用來存儲(chǔ)讀取的文件,用BUF來存儲(chǔ)文件名的最大字符緩沖以及實(shí)際輸入的字符個(gè)數(shù),通過相連的FILE來保存實(shí)際輸入的文件名,HANDLE的作用是在成功打開文件后保存文件代號(hào),ERROR_MESSAGE和MESSAGE分別是提示語句,用來提示錯(cuò)誤和鍵入值。第一大塊(文件的獲取)的內(nèi)容主要依靠基本的鍵盤鍵入以及文件存儲(chǔ)實(shí)現(xiàn):1. 首先要鍵盤輸入需要顯示內(nèi)容的文件名,通過0A號(hào)功能鍵入一個(gè)文件名到緩沖區(qū),用BUF來存放緩沖區(qū)最大字符數(shù)和實(shí)際輸入的文件名的長度,其中并不存放文件名,真正的文件名用FILE來存放,輸入完以后在FILE末給“0”(MOV指令)以結(jié)束并確認(rèn)輸入,文件名鍵入完成;2. 鍵入完成后,打開文件,通過3D號(hào)功能打開文件,需要先將AL置0以選擇讀功能(AL=1為寫,2為讀/寫),將FILE文件名首地址給DX以讀取文件名,如果打開失敗則顯示錯(cuò)誤,AX=錯(cuò)誤碼,如果成功則AX=文件代號(hào),文件代號(hào)需要通過第三方保存,因?yàn)樵诤罄m(xù)操作需要使用,進(jìn)入下一步;3. 通過3F號(hào)功能讀取文件,調(diào)用參數(shù)BX=文件代號(hào),CX=讀取字節(jié)數(shù),用BUF1讀取文件的內(nèi)容,如果讀取文件失敗,則顯示錯(cuò)誤,AX=錯(cuò)誤碼,如果成功讀取文件,則文件保存在BUF1中,AX=實(shí)際讀入的字節(jié)數(shù);4. 將HANDLE中所存的文件代號(hào)給BX,通過3E號(hào)功能完成文件關(guān)閉功能,如果程序到此都沒有發(fā)生錯(cuò)誤,則運(yùn)行成功,進(jìn)入下一個(gè)階段,如失敗,則提示錯(cuò)誤,AX=錯(cuò)誤碼。第二大塊功能主要是通過循環(huán)、轉(zhuǎn)移、比較等來實(shí)現(xiàn)最終顯示:1. 由于D命令格式顯示有其特殊的要求(上文已經(jīng)提及),所以在設(shè)計(jì)時(shí)也應(yīng)該考慮在內(nèi),本程序設(shè)置256個(gè)字符,每行顯示16個(gè)字節(jié),共16行,這里可以用到loop循環(huán)16次,每一次顯示一行內(nèi)容;2. 顯示段地址,調(diào)用子程序顯示段地址,將DATA段的地址給BX,通過4次循環(huán)(一次左移4位)依次讀出4個(gè)4位二進(jìn)制數(shù),用4位16進(jìn)制表示,具體規(guī)則是,將每次循環(huán)到低位的數(shù)和0FH相與,只留下最低4位,讓其與30H相加,如果小于3AH,說明是0-9之間的數(shù),由16進(jìn)制的規(guī)則可知他們都可以直接顯示,如果大于等于3A,則要將其加7(如A 對(duì)應(yīng)10,加30H后為3A,加7后為41H,為A對(duì)應(yīng)的ASCII碼),經(jīng)過循環(huán)后,可以將段地址顯示,段地址和偏移地址間要加“:”號(hào);3. 顯示偏移地址,用DI作為偏移量,初始化為0,將BUFDI的地址給BX,以顯示段地址的方式將偏移地址顯示出,然后顯示一個(gè)空格;4. 前8個(gè)對(duì)應(yīng)字符ASCII碼的顯示,因?yàn)镈命令格式要求8個(gè)字符中間要加一個(gè)“-”號(hào),所以在程序編寫時(shí)要分兩次進(jìn)行,中間加上“-”號(hào)。通過8次循環(huán)來依次顯示前8個(gè)字節(jié),通過BUF1DI依次讀取BUF1中的內(nèi)容,DI初始為0;5. 后8個(gè)對(duì)應(yīng)字符ASCII碼的顯示原理與第4步相同,在此不進(jìn)行過多闡述;6. 顯示ASCII碼對(duì)應(yīng)的字符,由于之前DI已經(jīng)增到16,但我們需要重新開始讀取BUF1,以此來顯示改行最開始的字符,所以要先將DI減16,回到每一行的最初位置,再通過16次循環(huán)將每行16個(gè)字節(jié)顯示出來,這里要注意D命令格式的要求,每個(gè)非打印字符在顯示的ASCII部分由“.”表示;7. 每一行顯示完畢以后,由于會(huì)執(zhí)行POP DI的操作,所以DI=16的值會(huì)被清楚,在進(jìn)行顯示下一行時(shí),先要人為將DI加16,使當(dāng)前地址指向BUF1的第16個(gè)位置,而不是重新開始,經(jīng)過16次循環(huán)后,256個(gè)字節(jié)將全部顯示出來。3. 程序設(shè)計(jì)框圖(1) 第一塊設(shè)計(jì)框圖:關(guān)于文件獲取,包括鍵入、打開、讀取以及關(guān)閉。開始0A號(hào)功能鍵入文件名3D號(hào)功能打開文件打開成功?(CF=0?)發(fā)生錯(cuò)誤 N YHANDLE=文件代號(hào)BX=文件代號(hào)CX=字節(jié)數(shù)3F號(hào)功能讀取文件讀取成功?(CF=0?) N發(fā)生錯(cuò)誤 YBX=文件代號(hào)3E號(hào)功能關(guān)閉文件結(jié)束圖3.1 文件獲取表3-1文件獲取中使用的DOS系統(tǒng)功能調(diào)用表功能調(diào)用參數(shù)返回參數(shù)0A 鍵盤輸入到緩沖區(qū)DS:DX=緩沖區(qū)首址(DS:DX)=緩沖區(qū)最大字符數(shù)(DS:DX+1)=實(shí)際輸入的字符數(shù)3D打開文件DS:DX=ASCIZ串地址AL=訪問和文件共享方式0=讀 1=寫 2=讀/寫成功:AX=文件代號(hào)失敗:AX=錯(cuò)誤碼3E 關(guān)閉文件BX=文件代號(hào)失?。篈X=錯(cuò)誤碼3F 讀文件或設(shè)備DS:DX=數(shù)據(jù)緩沖區(qū)地址BX=文件代號(hào)CX=讀取的字節(jié)數(shù)成功:AX=實(shí)際寫入的字節(jié)數(shù) AX=0已到文件失?。篈X=錯(cuò)誤碼該表中詳細(xì)列舉了文件獲取中需要使用的一些DOS系統(tǒng)調(diào)用功能,調(diào)用參數(shù)可以看作功能使用所需要的前提條件,返回參數(shù)是運(yùn)行后的一個(gè)返回值,在程序設(shè)計(jì)中要注意每一個(gè)功能使用之前必須將調(diào)用參數(shù)配置好,否則會(huì)出現(xiàn)錯(cuò)誤。表3-2文件獲取中的主要子函數(shù)及功能表子函數(shù)功能IN_FINAME用于文件名的鍵入OPENF用于文件內(nèi)容的獲取文件名的鍵入要注意哪個(gè)寄存器存字符數(shù),哪個(gè)寄存器存儲(chǔ)真正的文件名,以及鍵入完成后需要進(jìn)行的操作,文件的獲取要注意表3-1中的條件。(2) 第二塊設(shè)計(jì)框圖:關(guān)于段地址、偏移地址、16個(gè)ASCII碼、16個(gè)字節(jié)的顯示()總體設(shè)計(jì):開始設(shè)置循環(huán)次數(shù)(行數(shù))CX=16設(shè)置(地址移動(dòng))DI=0PUSH DI依次顯示該行的段地址、偏移地址、16個(gè)ASCII碼以及16個(gè)字節(jié)顯示換行 POP DI將DI加16接上一行讀取 NCX=0? Y結(jié)束圖3.2 總體設(shè)計(jì)()段地址顯示:開始MOV BX,DATA(段地址)CH=4 循環(huán)次數(shù)CL=4 位移位數(shù)將BX高四位移至低四位并取出加30H判斷是十六進(jìn)制數(shù)字還是字母,是數(shù)字? N加7 Y顯示CH=CH-1 CH0? Y N結(jié)束圖3.3 段地址顯示()偏移地址顯示:開始LEA BX,BUF1DI(偏移地址)CH=4 循環(huán)次數(shù)CL=4 位移位數(shù)將BX高四位移至低四位并取出加30H判斷是十六進(jìn)制數(shù)字還是字母,是數(shù)字? N加7 Y顯示CH=CH-1 CH0? Y N結(jié)束圖3.4 偏移地址顯示()ASCII碼顯示(一次顯示八個(gè)字節(jié),調(diào)用兩次):開始SI=0MOV BL,BUF1DICH=2 循環(huán)次數(shù)CL=4 位移位數(shù)將BL高四位移至低四位并取出加30H判斷是十六進(jìn)制數(shù)字還是字母,是數(shù)字? N加7 Y顯示CH=CH-1 CH0? Y NINC DI INC SI SI=8?空格 N Y結(jié)束圖3.5 ASCII碼顯示()字符顯示:開始SI=0 DI=DI-16MOV DL,BUF1DIDL20H? Y N顯示字符顯示“.”INC DI INC SISI=16? N Y結(jié)束圖3.6 字符顯示表3-3文件顯示中的主要子函數(shù)及功能表子函數(shù)功能DISPLAYD命令顯示子程序,是對(duì)顯示的各部分的總體控制,其內(nèi)部分為段地址顯示、偏移地址顯示、ASCII碼顯示、字符顯示DISP2顯示段地址和偏移地址,0-9以30H-39H顯示,如果是A-Z,則將其內(nèi)容加7,以41H-5AH顯示ASCII顯示每一行16個(gè)字節(jié)的ASCII碼ELEMENT顯示每一行ASCII碼對(duì)應(yīng)的實(shí)際字符,有效字符按照對(duì)應(yīng)ASCII碼顯示,無效字符用“.”表示顯示文件內(nèi)容時(shí)要注意D命令格式的排版,必須要按照嚴(yán)格的要求和順序進(jìn)行,同時(shí)對(duì)相應(yīng)地址內(nèi)容的讀取也要做到心中有數(shù),否則很容易造成地址不清楚而導(dǎo)致讀取內(nèi)容錯(cuò)誤。4. 源程序清單DATA SEGMENT BUF1 DB 256 DUP( ? ) ;存放文件內(nèi)容 BUF DB 10,? ;第一個(gè)為緩沖區(qū)最大字符數(shù) 第二個(gè)為實(shí)際輸入的字符數(shù) FILE DB 10 DUP( ? ) ;FILE來存儲(chǔ)實(shí)際的內(nèi)容 HANDLE DW ? ERROR_MESSAGE DB 0AH,ERROR!,$ MESSAGE DB Please input the filename:,0DH,0AH,$DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX LEA DX,MESSAGE MOV AH,9 INT 21H CALL IN_FINAME CALL OPENF MOV CX,16 MOV DI,0 FLAG: CALL DISPLAY ADD DI,16 loop FLAG MOV AH,1 INT 21H MOV AX,4C00H INT 21HIN_FINAME PROC NEAR ;鍵盤輸入子程序設(shè)計(jì) LEA DX, BUF MOV AH,0AH INT 21H MOV BL, BUF+1 MOV BH, 0 MOV FILEBX, 0 RETIN_FINAME ENDPOPENF PROC NEAR ;打開文件子程序設(shè)計(jì) PUSH AX PUSH BX push CX MOV DX, OFFSET FILE ;將文件名首地址給DX MOV AL,0 ;AL置0 讀模式 MOV AH,3DH ;打開文件 INT 21H JC ERROR ;CF=1失敗 MOV HANDLE, AX ;成功則文件代號(hào) MOV BX,AX ;讀文件的文件代號(hào) MOV CX,256 ;讀取字節(jié)數(shù) MOV DX,OFFSET BUF1 ;BUF1首地址給DX,文件內(nèi)容 MOV AH, 3FH ;讀文件 INT 21H JC ERROR ;CF=1失敗 MOV BX,AX MOV BUF1BX,0 ;成功則送結(jié)尾標(biāo)志 MOV BX, HANDLE ;將文件代號(hào)給BX MOV AH, 3EH ;關(guān)閉文件 INT 21H JNC END1 ;CF=0ERROR:MOV DX,OFFSET ERROR_MESSAGE MOV AH,9 INT 21HEND1: POP CX POP BX POP AX RETOPENF ENDP DISPLAY PROC NEAR ;D命令顯示子程序設(shè)計(jì) PUSH DI MOV BX,DATA CALL DISP2 ;顯示段地址 MOV AH,2 MOV DL,: INT 21H LEA BX,BUF1DI ;顯示偏移地址 call DISP2 MOV AH,2 MOV DL,20H INT 21H CALL ASCII ;前面8個(gè)H MOV DL,- MOV AH,2 INT 21H CALL ASCII ;后面8個(gè)H MOV AH,2 MOV DL,20H INT 21H SUB DI,16 CALL ELEMENT MOV AH,2 MOV DL,0AH INT 21H POP DI RETDISPLAY ENDPDISP2 PROC NEAR PUSH AX PUSH CX PUSH DX MOV CH,4 ;循環(huán)次數(shù)REP2: MOV CL,4 ;位移位數(shù) ROL BX,CL MOV DL,BL AND DL,0FH ADD DL,30H CMP DL,3AH JL PRIN2 ADD DL,7PRIN2: MOV AH,2 INT 21H DEC CH JNZ REP2 POP DX POP CX POP AX RET ;循環(huán)四次,把BX中的內(nèi)容從高位到低位顯示DISP2 ENDP ASCII PROC NEAR PUSH AX PUSH CX PUSH DX MOV SI,0 ASCII1: MOV BL,BUF1DI ;把目前所指存入BL CALL DISP1 INC DI INC SI CMP SI,8 JE EXIT1 MOV AH,2 MOV DL,20H INT 21H JMP ASCII1EXIT1: POP DX POP CX POP AX RET ASCII ENDPDISP1 PROC NEAR PUSH AX PUSH CX PUSH DX MOV CH,2REP1: MOV CL,4 ROL BL,CL MOV DL,BL AND DL,0FH ADD DL,30H CMP DL,3AH JL PRIN1 ADD DL,7PRIN1: MOV AH,2 INT 21H DEC CH JNZ REP1 POP DX POP CX pop AX RETDISP1 ENDP ELEMENT PROC NEAR

溫馨提示

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

評(píng)論

0/150

提交評(píng)論