




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、信息與通信工程學(xué)院微機(jī)原理軟件實(shí)驗(yàn)報(bào)告班級(jí): 2012211103 姓名: 申宇飛 學(xué)號(hào): 2012210064 日期: 2014年11月47 / 48文檔可自由編輯打印實(shí)驗(yàn)一 DEBUG 的使用3一、實(shí)驗(yàn)?zāi)康?二、實(shí)驗(yàn)內(nèi)容3三、預(yù)習(xí)思考5四、實(shí)驗(yàn)過(guò)程6五、實(shí)驗(yàn)總結(jié)10實(shí)驗(yàn)二 分支、循環(huán)程序設(shè)計(jì)11一、實(shí)驗(yàn)?zāi)康?1二、實(shí)驗(yàn)內(nèi)容11三、預(yù)習(xí)思考11四、實(shí)驗(yàn)過(guò)程13(一)流程圖13(二)源代碼14(三)實(shí)驗(yàn)分析18五、實(shí)驗(yàn)總結(jié)18實(shí)驗(yàn)三 代碼轉(zhuǎn)換程序設(shè)計(jì)20一、實(shí)驗(yàn)?zāi)康?0二、實(shí)驗(yàn)內(nèi)容20三、預(yù)習(xí)思考20四、實(shí)驗(yàn)過(guò)程21(一)流程圖21(二)模塊層次圖21(三)源代碼22(四)實(shí)驗(yàn)分析26五、實(shí)驗(yàn)
2、總結(jié)28實(shí)驗(yàn)四 子程序設(shè)計(jì)29一、實(shí)驗(yàn)?zāi)康?9二、實(shí)驗(yàn)內(nèi)容29三、預(yù)習(xí)思考29四、實(shí)驗(yàn)過(guò)程30(一)流程圖30(二)源代碼31(四)實(shí)驗(yàn)分析34五、實(shí)驗(yàn)總結(jié)36實(shí)驗(yàn)五 中斷程序設(shè)計(jì)37一、實(shí)驗(yàn)?zāi)康?7二、實(shí)驗(yàn)內(nèi)容37三、預(yù)習(xí)思考37四、實(shí)驗(yàn)過(guò)程38(一)流程圖38(二)源代碼39(三)實(shí)驗(yàn)分析45五、實(shí)驗(yàn)總結(jié)46實(shí)驗(yàn)一 DEBUG 的使用一、實(shí)驗(yàn)?zāi)康?. 掌握匯編程序的編輯、編譯、連接和執(zhí)行的全過(guò)程;2. 學(xué)習(xí)和掌握用DEBUG調(diào)試程序的方法。二、實(shí)驗(yàn)內(nèi)容1. 用編輯軟件,輸入以下匯編語(yǔ)言源程序: DAT SEGMENT A DB 20 B DB 15 Y DB 3 DUP(0) Z DB 0
3、,0 DAT ENDS STA SEGMENT STACK DW 50 DUP(?) STA ENDS COD SEGMENT ASSUME CS:COD,DS:DAT STAR PROC FAR PUSH DS XOR AX,AX PUSH AX MOV AX,DAT MOV DS,AX MOV AX,STA MOV SS,AX MOV AL,A MOV Z,AL MOV Z+1,AL CALL SUB1 MOV AL,B MOV Z,AL MOV Z+1,AL CALL SUB1 MOV AL,A MOV Z,AL MOV AL,B MOV Z+1,AL CALL SUB1 ADD WOR
4、D PTR Y,AX ADC BYTE PTRY+2,0 RET STAR ENDP SUB1 PROC MOV AL,Z MOV AH,Z+1 MUL AH ADD WORD PTR Y,AX ADC BYTE PTRY+2,0 RET SUB1 ENDP COD ENDS END STAR2. 通過(guò)編譯,連接形成可執(zhí)行文件。3. 用 DEBUG 將可執(zhí)行文件調(diào)入,并進(jìn)行調(diào)試。1) 用 D 命令觀察數(shù)據(jù)區(qū)在內(nèi)存中的具體內(nèi)容,記錄單元 A 和 B 的具體地址。2) 用 U 命令對(duì)目標(biāo)代碼反匯編,觀察反匯編后的結(jié)果。注意發(fā)現(xiàn)源程序的起始位置,并記錄這個(gè)起始地址。3) 用 T 命令作單步跟蹤調(diào)試。
5、比較每條指令執(zhí)行后的結(jié)果和原來(lái)的理解是否 一致,得出程序運(yùn)行的結(jié)果:它們是寫(xiě)在什么單元,具體內(nèi)容是什么;并判斷結(jié)果是否正確。在子程序 SUB1 的入口處設(shè)一斷點(diǎn),用 G 命令執(zhí)行程序。 在斷點(diǎn)處觀察堆棧的內(nèi)容,比較堆棧的內(nèi)容和程序返回地址是否一致。4) 用 E 命令修改單元 A,B 的內(nèi)容,重新執(zhí)行程序,并記錄結(jié)果。5) 用 M 命令和 A 命令對(duì)程序進(jìn)行修改:將主程序中最后兩條指令 (ADD 和ADC) 修改為一條 CALL SUB1 指令,重新執(zhí)行程序。6) 退出 DEBUG。4. 重新使用編輯軟件,把源程序最后一句中的 STAR 去掉。再次生成可執(zhí)行文件,并用 DEBUG 調(diào)入內(nèi)存。當(dāng)使
6、用 U 命令時(shí),顯示的結(jié)果與前一次(未加 STAR) 的結(jié)果有何不同?三、預(yù)習(xí)思考1. 熟悉常用的 DEBUG 命令。答:常用的DEBUG命令如下圖表所示。2. 閱讀并分析程序的功能。答:程序完成的功能是計(jì)算兩個(gè)數(shù)的完全平方和,即計(jì)算。3. 若 SS=2000H,SP=FFFFH, 向堆棧中壓入 4 字節(jié)數(shù)據(jù)后,如何用 D 命令顯示壓入堆棧的內(nèi)?答:使用的命令是:-D 2000:FFFB,即使用段基址加偏移量查看。四、實(shí)驗(yàn)過(guò)程1 編譯和鏈接形成可執(zhí)行文件。a. 用debug命令對(duì)程序進(jìn)行調(diào)試1) 用 D 命令觀察數(shù)據(jù)區(qū)在內(nèi)存中的具體內(nèi)容,記錄單元 A 和 B 的具體地址。2) 用 U 命令對(duì)目
7、標(biāo)代碼反匯編,觀察反匯編后的結(jié)果。注意發(fā)現(xiàn)源程序的起始位置,并記錄這個(gè)起始地址。其中第一個(gè)紅色框框住的076AH表示數(shù)據(jù)段的段地址,第二個(gè)紅色方框框住的是A的偏移地址,第三個(gè)紅色方框框住的是B的偏移地址。D指令后面跟隨的是A的地址。黃色方框框住的分別是A和B的數(shù)值。3) 用 T 命令作單步跟蹤調(diào)試。比較每條指令執(zhí)行后的結(jié)果和原來(lái)的理解是否 一致,得出程序運(yùn)行的結(jié)果:它們是寫(xiě)在什么單元,具體內(nèi)容是什么;并判斷結(jié)果是否正確。在子程序 SUB1 的入口處設(shè)一斷點(diǎn),用 G 命令執(zhí)行程序。 在斷點(diǎn)處觀察堆棧的內(nèi)容,比較堆棧的內(nèi)容和程序返回地址是否一致。在執(zhí)行子程序之前:第一個(gè)紅色方框框住的是call S
8、UB1指令的位置和指令的內(nèi)容。第二個(gè)紅色方框g指令后面跟隨的就是該斷點(diǎn)的地址。單步執(zhí)行后:可以在圖中看到第一個(gè)紅色方框顯示的是子程序執(zhí)行之前執(zhí)行到的代碼的地址。第二個(gè)紅色方框顯示的是子程序開(kāi)始調(diào)用后代碼執(zhí)行的地址。顯然此時(shí)前一步的CS和IP內(nèi)容已經(jīng)壓棧,并且CS和IP指向了子程序的地址。4) 用 E 命令修改單元 A,B 的內(nèi)容,重新執(zhí)行程序,并記錄結(jié)果。第一個(gè)和第二個(gè)藍(lán)色方框框住的是輸入要修改內(nèi)容的地址。第三個(gè)藍(lán)色方框表示要查看的內(nèi)存單元的地址。第一個(gè)和第二個(gè)綠色方框框住的是修改前后該地址存儲(chǔ)的內(nèi)容。第三個(gè)綠色方框表示的是修改后內(nèi)存內(nèi)存儲(chǔ)的數(shù)值情況。5) 用 M 命令和 A 命令對(duì)程序進(jìn)行修
9、改:將主程序中最后兩條指令 (ADD 和ADC) 修改為一條 CALL SUB1 指令,重新執(zhí)行程序。將ADD和ADC指令修改為一條CALL SUB1指令:2 重新執(zhí)行編譯過(guò)程:把源程序最后一句中的 STAR 去掉。再次生成可執(zhí)行文件,再次DEBUG。當(dāng)使用 U 命令時(shí),結(jié)果如下圖所示??梢钥吹?,沒(méi)有END STAR語(yǔ)句,編譯器將不知道代碼段的入口地址是多少,導(dǎo)致從數(shù)據(jù)段開(kāi)始譯碼,后續(xù)譯碼全部紊亂。END STAR的作用是指示編譯器程序結(jié)束,同時(shí)告訴編譯器程序執(zhí)行時(shí)代碼段的入口地址。五、實(shí)驗(yàn)總結(jié)此次實(shí)驗(yàn)是微機(jī)原理軟件實(shí)驗(yàn)的第一次實(shí)驗(yàn)。上課期間我們更多的是學(xué)會(huì)單句匯編語(yǔ)言的書(shū)寫(xiě)和使用法則,很少深
10、入到程序的底層和內(nèi)部進(jìn)行探究和調(diào)測(cè)。本次實(shí)驗(yàn)雖然內(nèi)容比較簡(jiǎn)單,更多地涉及到了debug命令的操作和之行,而實(shí)際上更多考察了我們對(duì)于匯編語(yǔ)言與內(nèi)存等存儲(chǔ)單元的調(diào)用和關(guān)系。這和高級(jí)語(yǔ)言是極其不同的。這次實(shí)驗(yàn)我學(xué)會(huì)了匯編程序的基本調(diào)測(cè)方法,也體會(huì)到匯編的調(diào)試和高級(jí)語(yǔ)言調(diào)試調(diào)用的方法是具有很大差別。對(duì)于匯編語(yǔ)言程序的調(diào)用和調(diào)試,需要考慮到內(nèi)存的每一個(gè)單元,在進(jìn)行子程序調(diào)用的時(shí)候,還需要照顧到堆棧的進(jìn)出關(guān)系。而高級(jí)語(yǔ)言則直接進(jìn)行語(yǔ)言的書(shū)寫(xiě)而不必考慮到底層數(shù)據(jù)和存儲(chǔ)單元的變化。我想這兩者的區(qū)別,可以通過(guò)這次實(shí)驗(yàn)得到深刻的體會(huì)。實(shí)驗(yàn)二 分支、循環(huán)程序設(shè)計(jì)一、實(shí)驗(yàn)?zāi)康?. 開(kāi)始獨(dú)立進(jìn)行匯編語(yǔ)言程序設(shè)計(jì);2.
11、掌握基本分支,循環(huán)程序設(shè)計(jì);3. 掌握最簡(jiǎn)單的 DOS 功能調(diào)用。二、實(shí)驗(yàn)內(nèi)容1. 安排一個(gè)數(shù)據(jù)區(qū),內(nèi)存有若干個(gè)正數(shù),負(fù)數(shù)和零。每類數(shù)的個(gè)數(shù)都不超過(guò) 9。2. 編寫(xiě)一個(gè)程序統(tǒng)計(jì)數(shù)據(jù)區(qū)中正數(shù),負(fù)數(shù)和零的個(gè)數(shù)。3. 將統(tǒng)計(jì)結(jié)果在屏幕上顯示。4. (擴(kuò)展題)統(tǒng)計(jì)出正奇數(shù)、正偶數(shù),負(fù)奇數(shù)、負(fù)偶數(shù)以及零的個(gè)數(shù)。三、預(yù)習(xí)思考1. 十進(jìn)制數(shù) 0 9 所對(duì)應(yīng)的 ASCII 碼是什么? 如何將十進(jìn)制數(shù) 0 9 在屏幕上顯示出來(lái)?答:09分別對(duì)應(yīng)ASCII碼的30H39H。欲將十進(jìn)制數(shù)09顯示在屏幕上,只需要調(diào)運(yùn)DOS 2號(hào)功能,入口參數(shù)為二進(jìn)制數(shù)09分別加上30H即可。2. 如何檢驗(yàn)一個(gè)數(shù)為正,為負(fù)或?yàn)榱悖?你
12、能舉出多少種不同的方法?答:方法有多種,現(xiàn)舉出兩種。CMP命令,將該數(shù)與0比較,然后用JZ等命令進(jìn)行判斷;將該數(shù)與0相比,若不等則用該數(shù)(假設(shè)為8位)和相與,取出符號(hào)位判斷,可區(qū)分正負(fù)。其余方法大同小異,核心的思想是要么直接和0相比,要么使用邏輯或移位運(yùn)算,取出符號(hào)為進(jìn)行判斷。四、實(shí)驗(yàn)過(guò)程(一)流程圖(二)源代碼DATA SEGMENT BUFF DB 100,125,47,56,6,-1,-2,-3,-8,-101,0,0,0;初始數(shù)據(jù) COUNT EQU $-BUFF ;數(shù)據(jù)長(zhǎng)度 POSI DB 0 ;正數(shù)個(gè)數(shù) NEGT DB 0 ;負(fù)數(shù)個(gè)數(shù) ZERO DB 0 ;零的個(gè)數(shù) POSIEVE
13、N DB 0 ;正偶數(shù) POSIODD DB 0 ;正奇數(shù) NEGTEVEN DB 0 ;負(fù)偶數(shù) NEGTODD DB 0 ;負(fù)奇數(shù) ;-用于打印提示的字符串定義 STR DB 0DH,0AH,'The original data are : 100,125,47,56,6,-1,-2,-3,-8,-101,0,0,0',0DH,0AH,'$' POSICHAR DB 0DH,0AH,'The number of positive: $' NEGTCHAR DB 0DH,0AH,'The number of negtive : $'
14、; ZEROCHAR DB 0DH,0AH,'The number of zero : $' EVENCHAR DB ' Even: $' ODDCHAR DB ' Odd : $' CR DB 0DH,0AH,'$' 回車換行的ASCII碼DATA ENDS ;-STACK SEGMENT STACK 'STACK' DB 100 DUP(0)STACK ENDS;-CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK;-START: MOV AX,DATA MOV DS,AX
15、 MOV SI,OFFSET BUFF MOV CL,COUNT;數(shù)組長(zhǎng)度賦予CLLOP: CMP CL,0 ;循環(huán)控制條件:數(shù)組長(zhǎng)度減為零 JE PRINT ;為零則跳出 MOV BL,SI ;采用寄存器尋址 INC SI DEC CL CMP BL,0 ;和零比較 JG ISPOSI ;是正數(shù)跳轉(zhuǎn) JE ISZERO ;是零跳轉(zhuǎn) JL ISNEGT ;是負(fù)數(shù)跳轉(zhuǎn)ISPOSI: INC POSI ;正數(shù)個(gè)數(shù)加一 AND BL,1 JZ POSI_EVEN INC POSIODD JMP LOP ISZERO: INC ZERO JMP LOP ISNEGT: INC NEGT ;負(fù)數(shù)個(gè)數(shù)加一
16、 AND BL,1 JZ NEGT_EVEN INC NEGTODD JMP LOP ;- POSI_EVEN: INC POSIEVEN JMP LOP NEGT_EVEN: INC NEGTEVEN JMP LOP;- PRINT: MOV AH,09H ;顯示原始數(shù)據(jù) MOV DL,OFFSET STR INT 21H ;-顯示正數(shù)、正偶數(shù)、正奇數(shù)個(gè)數(shù)-;*正數(shù)個(gè)數(shù)* MOV AH,09H ;顯示字符串,打印正數(shù)個(gè)數(shù)提示符 MOV DX,OFFSET POSICHAR INT 21H MOV AH,02H ;顯示單個(gè)字符,打印正數(shù)個(gè)數(shù) MOV DL,POSI ADD DL,30H ;入口
17、參數(shù)為數(shù)字的ASCII碼 INT 21H ;*正偶數(shù)個(gè)數(shù)* MOV AH,09H ;顯示字符串,打印正偶數(shù)個(gè)數(shù)提示符 MOV DX,OFFSET EVENCHAR INT 21H MOV AH,02H ;顯示單個(gè)字符,打印正偶數(shù)個(gè)數(shù) MOV DL,POSIEVEN ADD DL,30H ;入口參數(shù)為數(shù)字的ASCII碼 INT 21H ;*正奇數(shù)個(gè)數(shù)* MOV AH,09H ;顯示字符串,打印正奇數(shù)個(gè)數(shù)提示符 MOV DX,OFFSET ODDCHAR INT 21H MOV AH,02H ;顯示單個(gè)字符,打印正奇數(shù)個(gè)數(shù) MOV DL,POSIODD ADD DL,30H ;入口參數(shù)為數(shù)字的AS
18、CII碼 INT 21H ;*回車換行* MOV AH,09H ;回車換行 MOV DX,OFFSET CR INT 21H;-顯示負(fù)數(shù)、負(fù)偶數(shù)、負(fù)奇數(shù)個(gè)數(shù)- ;*負(fù)數(shù)個(gè)數(shù)* MOV AH,09H ;顯示字符串,打印負(fù)數(shù)個(gè)數(shù)提示符 MOV DX,OFFSET NEGTCHAR INT 21H MOV AH,02H ;顯示單個(gè)字符,打印負(fù)數(shù)個(gè)數(shù) MOV DL,NEGT ADD DL,30H ;入口參數(shù)為數(shù)字的ASCII碼 INT 21H ;*負(fù)偶數(shù)個(gè)數(shù)* MOV AH,09H ;顯示字符串,打印負(fù)偶數(shù)個(gè)數(shù)提示符 MOV DX,OFFSET EVENCHAR INT 21H MOV AH,02H
19、;顯示單個(gè)字符,打印負(fù)偶數(shù)個(gè)數(shù) MOV DL,NEGTEVEN ADD DL,30H ;入口參數(shù)為數(shù)字的ASCII碼 INT 21H ;*負(fù)奇數(shù)個(gè)數(shù)* MOV AH,09H ;顯示字符串,打印負(fù)奇數(shù)個(gè)數(shù)提示符 MOV DX,OFFSET ODDCHAR INT 21H MOV AH,02H ;顯示單個(gè)字符,打印負(fù)奇數(shù)個(gè)數(shù) MOV DL,NEGTODD ADD DL,30H ;入口參數(shù)為數(shù)字的ASCII碼 INT 21H ;*回車換行* MOV AH,09H ;回車換行 MOV DX,OFFSET CR INT 21H ;-顯示零的個(gè)數(shù)- MOV AH,09H ;顯示字符串,打印零的個(gè)數(shù)提示符
20、MOV DX,OFFSET ZEROCHAR INT 21H MOV AH,02H ;顯示單個(gè)字符,打印零的個(gè)數(shù) MOV DL,ZERO ADD DL,30H ;入口參數(shù)為數(shù)字的ASCII碼 INT 21H ;- EXT: MOV AX,4C00H INT 21H;-CODE ENDS END START (三)實(shí)驗(yàn)分析數(shù)據(jù)區(qū)待統(tǒng)計(jì)的數(shù)據(jù)為:100,125,47,56,6,-1,-2,-3,-8,-101,0,0,0實(shí)驗(yàn)結(jié)果如下圖所示:本實(shí)驗(yàn)較為簡(jiǎn)單,意在練習(xí)基本的分支、循環(huán)結(jié)構(gòu)。關(guān)鍵的點(diǎn)在于和0比較,區(qū)分正負(fù)和零,然后在正數(shù)和負(fù)數(shù)中判斷奇偶,與1相與,最后利用統(tǒng)計(jì)的數(shù)的個(gè)數(shù)減去偶數(shù)得奇數(shù)的方
21、法。使得程序更加流暢和簡(jiǎn)潔,思路也更清晰。五、實(shí)驗(yàn)總結(jié)實(shí)驗(yàn)中設(shè)計(jì)好的計(jì)算思路是很重要的,匯編的代碼由各種跳轉(zhuǎn)和邏輯結(jié)構(gòu)組成,需要考慮代碼間的邏輯關(guān)系,否則容易出錯(cuò)。語(yǔ)法錯(cuò)誤是很顯而易見(jiàn)的,但邏輯錯(cuò)誤卻不容易發(fā)現(xiàn)。當(dāng)有大量判斷和循環(huán)存在時(shí),需要考慮清楚程序跳轉(zhuǎn)的條件和方向,這點(diǎn)和高級(jí)語(yǔ)言有較大差異,匯編本質(zhì)上沒(méi)有循環(huán)和分支,都是通過(guò)將IP賦予代碼區(qū)地址進(jìn)行跳轉(zhuǎn)實(shí)現(xiàn)的,程序員需要自主控制如何跳轉(zhuǎn),向何處跳轉(zhuǎn),這點(diǎn)和C/C+中的goto語(yǔ)句處理有些類似??紤]到實(shí)驗(yàn)練習(xí)的重點(diǎn)在分支循環(huán)結(jié)構(gòu),此次寫(xiě)代碼時(shí)暫時(shí)沒(méi)有使用子程序或宏,導(dǎo)致輸出部分代碼有些過(guò)長(zhǎng)。實(shí)驗(yàn)三 代碼轉(zhuǎn)換程序設(shè)計(jì)一、實(shí)驗(yàn)?zāi)康?. 掌握幾種
22、最基本的代碼轉(zhuǎn)換方法;2. 運(yùn)用子程序進(jìn)行程序設(shè)計(jì)。二、實(shí)驗(yàn)內(nèi)容1. 從鍵盤(pán)上輸入若干兩位十進(jìn)制數(shù),尋找其中的最小值,然后在屏幕上顯示出來(lái)。2. 兩個(gè)十進(jìn)制數(shù)之間的分隔符,輸入結(jié)束標(biāo)志自定,但要在報(bào)告中說(shuō)明。3. 對(duì)輸入要有檢錯(cuò)措施,以防止非法字符輸入,并有適當(dāng)?shù)奶崾尽?. 將整個(gè)程序分解為若干模塊,分別用子程序?qū)崿F(xiàn)。在報(bào)告中要給出模塊層次圖。三、預(yù)習(xí)思考1. 如何將輸入的兩個(gè)字符(09)變?yōu)槭M(jìn)制或二進(jìn)制數(shù)?答:輸入的字符09是ASCII碼表示的,對(duì)應(yīng)于30H39H,通過(guò)減去30H,可以轉(zhuǎn)換為相應(yīng)的計(jì)算機(jī)數(shù)。2. 如何將選出的最小值(二進(jìn)制或十進(jìn)制)變?yōu)?ASCII 碼再進(jìn)行顯示?答:如果采
23、用輸入時(shí)把ASCII碼轉(zhuǎn)換為數(shù)字,然后比較數(shù)字的大小再輸出,那么輸出時(shí)還需要把數(shù)字再次轉(zhuǎn)換為ASCII碼。這是不明智的。可以直接讀入并存儲(chǔ)數(shù)字的ASCII碼,容易比較其大小,然后直接輸出ASCII碼即可。3. 你覺(jué)得采用二進(jìn)制運(yùn)算還是十進(jìn)制運(yùn)算更適合于這個(gè)實(shí)驗(yàn)?答:采用二進(jìn)制或者十進(jìn)制都需要進(jìn)行ASCII碼到數(shù)字的轉(zhuǎn)換和其反向轉(zhuǎn)換,換用新的思路可以大大簡(jiǎn)化編程負(fù)擔(dān)。即直接使用數(shù)字對(duì)應(yīng)的ASCII比較,分別比較十位和個(gè)位,最后直接輸出字符即可。四、實(shí)驗(yàn)過(guò)程(一)流程圖(二)模塊層次圖(三)源代碼DATA SEGMENT BUFF DB 100 DUP(0) MIN DB '9'-
24、'0','9'-'0' ;置最小值的初始值為99 COUNT DB 0 ;數(shù)組長(zhǎng)度 IFERR DB 0 ;輸入錯(cuò)誤標(biāo)志,0無(wú)錯(cuò),1有錯(cuò) ;-提示信息字符串 INPUTTIP DB 0DH,0AH,0DH,0AH,'Please input several double-digit decimal numbers separated with ",",',0DH,0AH,0DH,0AH,'and end inputting with "Enter".','$'
25、 NUMTIP DB 0DH,0AH,0DH,0AH,' Your numbers are:','$' OUTTIP DB 0DH,0AH,0DH,0AH,' The minimum is :','$' AGAIN DB 0DH,0AH,'-Do you want to run the program again (Y/N):','$' LINE DB 0DH,0AH,'-','$'-錯(cuò)誤輸入提示 ERROR DB 0DH,0AH,0DH,0AH,'ERROR
26、:',0DH,0AH,'Your input must be double-digit decimal numbers.',0DH,0AH,'And you must separate every two of them with only one ",".','$'DATA ENDS;-CODE SEGMENT ASSUME CS:CODE,DS:DATA MAIN PROC FAR MOV AX,DATA MOV DS,AX MOV DX,OFFSET INPUTTIP ;調(diào)用輸入提示 CALL PRINT ;-注
27、:數(shù)字的存儲(chǔ)和比較都是以ASCII碼形式REP1:MOV DX,OFFSET NUMTIP ;調(diào)用提示 CALL PRINT CALL INPUT ;獲取用戶輸入 CMP IFERR,1 ;判斷輸入過(guò)程是否有錯(cuò) JZ GOON ;繼續(xù) CALL FINDMIN ;查找最小數(shù) MOV DX,OFFSET OUTTIP ;調(diào)用輸出提示 CALL PRINT MOV AH,02H MOV DL,MIN ;輸出最小值的十位 INT 21H MOV AH,02H MOV DL,MIN1 ;輸出最小值的個(gè)位 INT 21H GOON: MOV DX,OFFSET LINE ;分隔線輸出 CALL PRIN
28、T MOV DX,OFFSET AGAIN ;調(diào)用繼續(xù)比較提示 CALL PRINT MOV AH,01H ;從鍵盤(pán)讀取一個(gè)字符 INT 21H CMP AL,59H ;是否是Y JE REP1 ;是,重新輸入 CMP AL,79H ;是否是y JE REP1 ;是,重新輸入 BACK: MOV AX,4C00H ;返回DOS INT 21HMAIN ENDP;-;輸入子過(guò)程-出口參數(shù)為IFERR,表示是否有錯(cuò)INPUT PROC PUSH AX ;保存現(xiàn)場(chǎng),將子過(guò)程用到的寄存器入棧 PUSH BX PUSH CX PUSH DX PUSH SI MOV SI,0 ;數(shù)組下標(biāo) MOV CX,0
29、 ;循環(huán)計(jì)數(shù),三個(gè)輸入字符為一個(gè)小單元 INPUTLOOP: MOV AH,01H ;從鍵盤(pán)讀取一個(gè)字符 INT 21H CMP AL,0DH ;和回車比較 JE EXIT1 ;是回車則結(jié)束輸入 INC CX ;輸入字符計(jì)數(shù) CMP CX,3 ;輸入是否為第3n個(gè)字符(n=1,2.),即是否為輸入分隔符的位置 JE CHECK ;是,則檢驗(yàn)分隔符 JMP GETNUM ;不是,則讀取輸入字符 CHECK:CMP AL,2CH ;輸入字符是否為逗號(hào) JNE ERR ;不是,則分隔符錯(cuò)誤,進(jìn)行錯(cuò)誤處理 XOR CX,CX ;是,則計(jì)數(shù)單元清零 JMP INPUTLOOP GETNUM:CMP AL
30、,30H ;和0比較 JL ERR ;小于0則是無(wú)效字符,進(jìn)行錯(cuò)誤處理 CMP AL,39H ;和9比較 JG ERR ;大于9則是無(wú)效字符,進(jìn)行錯(cuò)誤處理 MOV BUFFSI,AL ;保存輸入的數(shù)(存儲(chǔ)的是ASCII碼) INC COUNT ;統(tǒng)計(jì)輸入的數(shù)字個(gè)數(shù),為判斷是否輸入為兩位數(shù) INC SI ;向后移動(dòng)數(shù)組 JMP INPUTLOOP ;繼續(xù)輸入ERR: MOV IFERR,1 ;錯(cuò)誤處理 MOV DX,OFFSET ERROR CALL PRINT JMP RETURNEXIT1: MOV BL,COUNT ;把數(shù)組長(zhǎng)度送入BL CMP BL,0 ;判斷輸入數(shù)的個(gè)數(shù)是否為零 JE
31、ERR ;是0,則輸出錯(cuò)誤并退出 AND BL,01H ;判斷數(shù)組長(zhǎng)度是否為偶數(shù) CMP BL,0 JNE ERR ;輸入數(shù)字個(gè)數(shù)為奇數(shù)則出錯(cuò) RETURN:POP SI ;恢復(fù)現(xiàn)場(chǎng) POP DX POP CX POP BX POP AX RETINPUT ENDP;-;打印顯示子過(guò)程-入口參數(shù)為DXPRINT PROC PUSH AX MOV AH,09H INT 21H POP AX RETPRINT ENDP;-;查找最小數(shù)子程序-入口參數(shù)為數(shù)組地址和數(shù)組長(zhǎng)度FINDMIN PROC PUSH SI ;保護(hù)現(xiàn)場(chǎng) PUSH AX PUSH CX MOV SI,0 ;數(shù)組下標(biāo) MOV CL,
32、COUNT ;把數(shù)組長(zhǎng)度送入CL MOV AL,CL CBW ;將AL的最高位擴(kuò)展至AH MOV CX,AXLOOP1: CMP CX,SI ;是否已經(jīng)比較完畢 JE EXIT2 ;是,則退出 MOV AH,BUFFSI ;否,則接著比較,當(dāng)前數(shù)的十位移入AH MOV AL,BUFFSI+1 ;當(dāng)前數(shù)的個(gè)位移入AL ADD SI,2 ;數(shù)組下標(biāo)移位至下一個(gè)數(shù)的十位 CMP AH,MIN ;比較十位數(shù),MIN低地址為十位 JA LOOP1 ;如果MIN小,則直接比較下一個(gè)數(shù) JE HIGHEQU ;如果十位數(shù)相等,比較個(gè)位數(shù),再否則十位大就直接存儲(chǔ) STOMIN:MOV MIN,AH MOV M
33、IN1,AL JMP LOOP1HIGHEQU:CMP AL,MIN1 ;比較個(gè)位數(shù) JNB LOOP1 ;個(gè)位數(shù)比MIN大則跳到下一個(gè)數(shù) JMP STOMIN ;否則將當(dāng)前數(shù)寫(xiě)入為MINEXIT2: POP CX POP AX POP SI RETFINDMIN ENDP;-CODE ENDS END MAIN(四)實(shí)驗(yàn)分析實(shí)驗(yàn)中輸入的數(shù)字必須是兩位十進(jìn)制數(shù)字,每?jī)蓚€(gè)數(shù)字之間用逗號(hào)“,”作為分隔符,且每?jī)蓚€(gè)數(shù)之間只能有一個(gè)分隔符,以回車為輸入結(jié)束標(biāo)志符。檢錯(cuò)思路:試驗(yàn)中實(shí)行對(duì)每一個(gè)輸入字符的實(shí)時(shí)檢測(cè),輸入非法則立即停止。為方便檢錯(cuò),試驗(yàn)中每3對(duì)輸入字符作為一個(gè)小單元。判斷條件:每個(gè)小單元的第
34、1、2個(gè)字符必須是09中的一個(gè)數(shù)字;而第3位必須是分隔符“,”;回車之后對(duì)總的輸入進(jìn)行判斷,輸入數(shù)字的個(gè)數(shù)必須為偶數(shù)。以上三種情況囊括了所有可能的格式錯(cuò)誤,不滿足任何一個(gè)條件即出錯(cuò)。實(shí)驗(yàn)運(yùn)行結(jié)果截圖如下:正確輸入:錯(cuò)誤輸入輸入3位數(shù)錯(cuò)誤輸入輸入1位數(shù)錯(cuò)誤輸入輸入非法字符錯(cuò)誤輸入分隔符格式不正確五、實(shí)驗(yàn)總結(jié)總結(jié)實(shí)驗(yàn)中的關(guān)鍵設(shè)計(jì)思路如下:1、嚴(yán)格的輸入格式檢查,嚴(yán)格的輸入字符有效性檢查。2、以數(shù)組方式進(jìn)行存儲(chǔ),每?jī)蓚€(gè)BYTE存儲(chǔ)一個(gè)輸入的兩位數(shù),存儲(chǔ)格式為字符ASCII碼。不進(jìn)行字符ASCII碼到數(shù)字的轉(zhuǎn)換。3、比較數(shù)字大小時(shí),采用分別比較高位ASCII碼和低位ASCII碼的方式,從而不用在輸入時(shí)
35、將字符存儲(chǔ)為數(shù)字,輸出時(shí)也不用再進(jìn)行逆轉(zhuǎn)換。程序效率大為提高。4、為使得程序結(jié)構(gòu)清晰,減小代碼耦合度,采用了多子程序的設(shè)計(jì)方式。把實(shí)驗(yàn)任務(wù)分為三步:讀取輸入、找出最小、輸出打印,分別以子程序方式實(shí)現(xiàn),主調(diào)函數(shù)依次調(diào)用完成實(shí)驗(yàn)任務(wù)。實(shí)驗(yàn)中比較大小的方式有多種,如何采用更加簡(jiǎn)潔有效的方式是值得思考的問(wèn)題。我一開(kāi)始也不免陷入到比較數(shù)字大小的常規(guī)方法中,但由于匯編輸入具有特殊性,即輸入的是ASCII碼而非數(shù)字的大小,且存在將兩個(gè)字符進(jìn)行連接成為兩位數(shù)的需求,而輸出時(shí)又需一情況,所以本實(shí)驗(yàn)中的數(shù)值存儲(chǔ)、比較和輸出都是用ASCII碼。這說(shuō)明,在實(shí)要進(jìn)行反過(guò)程??紤]到ASCII也是可以比較的,且十位數(shù)和個(gè)位
36、數(shù)是可以分別比較的這際的編程中,需要根據(jù)具體情況調(diào)整一般方法,使得方法更加簡(jiǎn)潔可行且有效。實(shí)驗(yàn)四 子程序設(shè)計(jì)一、實(shí)驗(yàn)?zāi)康?. 進(jìn)一步掌握子程序設(shè)計(jì)方法;2. 進(jìn)一步掌握基本的 DOS 功能調(diào)用。二、實(shí)驗(yàn)內(nèi)容1. 從鍵盤(pán)上輸入某班學(xué)生的某科目成績(jī)。輸入按學(xué)生的學(xué)號(hào)由小到大的順序輸入。2. 統(tǒng)計(jì)檢查每個(gè)學(xué)生的名次。3. 將統(tǒng)計(jì)結(jié)果在屏幕上顯示。4. 為便于觀察,輸入學(xué)生數(shù)目不宜太多,以不超過(guò)一屏為宜。輸出應(yīng)便于閱讀.盡可能考慮美觀。5. 輸入要有檢錯(cuò)手段。三、預(yù)習(xí)思考1. 如何確定一個(gè)學(xué)生在這門(mén)科目中的名次?答:抽取每個(gè)學(xué)生的成績(jī)和其他所有學(xué)生的成績(jī)進(jìn)行比較,然后統(tǒng)計(jì)比其分?jǐn)?shù)高的學(xué)生,得出該學(xué)生的
37、名次;通過(guò)n次冒泡,將成績(jī)的相對(duì)最大值(連帶學(xué)號(hào))不斷往前移動(dòng),最后出來(lái)的就是一個(gè)從高到低的包括學(xué)號(hào)在內(nèi)的排名表。本實(shí)驗(yàn)采用第二種方式,用冒泡法予以具體實(shí)現(xiàn)。2. 輸入結(jié)束后,采用什么方法進(jìn)行比較以得到學(xué)生的名次最為簡(jiǎn)單?答:我采用了檢錯(cuò)后使用n輪冒泡,將最大值連帶學(xué)號(hào)不斷往前移動(dòng)的方式實(shí)現(xiàn)了成績(jī)的排名與學(xué)號(hào)的對(duì)應(yīng)。3. 準(zhǔn)備好模塊層次圖。4. 給出輸出顯示的形式。答:程序中使用的數(shù)據(jù)區(qū)的數(shù)據(jù)單元格式:INFO DB 50 DUP(?);數(shù)據(jù)檢錯(cuò)后的數(shù)據(jù)存儲(chǔ)器6個(gè)字節(jié)為一個(gè)數(shù)據(jù)單元學(xué)號(hào)分隔符成績(jī)分隔符31H30H09H36H39H09HINFO2 DB 100 DUP(?);排序后的數(shù)據(jù)存儲(chǔ)器
38、9個(gè)字節(jié)為一個(gè)數(shù)據(jù)單元學(xué)號(hào)(字),Tab(09H),成績(jī)(字),Tab(09H),排名(字節(jié)ASCII),0AH,0DH學(xué)號(hào)分隔符成績(jī)分隔符排名換行符31H30H09H36H39H09H31H0AH0DH四、實(shí)驗(yàn)過(guò)程(一)流程圖 (二)源代碼DATA SEGMENTINPUTINFO DB 0AH,0DH,'PLEASE INPUT THE SCORES:',0AH,0DH,'$'BUFC1 DB 50 ;緩沖區(qū)第一個(gè)字節(jié)NUM DB 0 ;緩沖區(qū)第二個(gè)字節(jié)存放輸入的字符數(shù)BUFC2 DB 50 DUP(0) ;存儲(chǔ)用戶真正輸入的字符INFO DB 50 DUP
39、(0);數(shù)據(jù)檢錯(cuò)后的數(shù)據(jù)存儲(chǔ)器INFO1 DB 0AH,0DH,'NO.',09H,'SCORES',09H,'PAIPING',0AH,0DH;表頭INFO2 DB 100 DUP(0);排序后的學(xué)號(hào)(字),Tab(09H),成績(jī)(字),Tab(09H),排名(字節(jié)ASCII),0AH,0DH-9個(gè)字節(jié)為一項(xiàng)ERROR DB 0AH,0DH,'Your input has some error',0AH,0DH,'$' DATA ENDS;-STACK SEGMENTDB 100 DUP(0)STACK ENDS
40、;-CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXLEA DX,INPUTINFO;使用DOS 9號(hào)功能,將提示信息顯示在屏幕MOV AH,09HINT 21HMOV DX,OFFSET BUFC1 ;使用DOSA號(hào)功能,將輸入存到緩沖區(qū)BUFMOV AH,0AHINT 21HXOR CX,CX;清空CX,為存儲(chǔ)用戶實(shí)際輸入的成績(jī)數(shù)量做準(zhǔn)備LEA BX,BUFC2LEA DI,INFOCALL CHECK;調(diào)用CHECK子程序檢測(cè)用戶的輸入是否有誤,無(wú)誤就講數(shù)據(jù)轉(zhuǎn)移到INF0區(qū)域,并生成相應(yīng)的學(xué)號(hào)MO
41、V NUM,CL;將學(xué)生數(shù)存到NUM;以下為排序過(guò)程LEA DI,INFO2MOV DL,CL;DL用于控制冒泡的趟次MOV DH,31H;DH用于表示排名的次序L:DEC DL;冒泡的輪數(shù)MOV CL,NUMDEC CL;冒泡的次數(shù)MOV CH,0LEA SI,INFOMOV BX,SI;BX存儲(chǔ)"最高成績(jī)"所在的地址單元MAX:ADD SI,6;將SI直到下一個(gè)數(shù)據(jù)單元MOV AX,BX+3;將最高成績(jī)賦給AXCMP AX,SI+3;最高成績(jī)與下一個(gè)成績(jī)比較JB JIAOHUAN;下一個(gè)成績(jī)高則將下一個(gè)數(shù)據(jù)單元的地址賦給BXJMP LO;否則進(jìn)行下一個(gè)冒泡JIAOHUA
42、N:MOV BX,SILO:LOOP MAXMOV AX,BX;將最大值的數(shù)據(jù)單元傳到INFO2數(shù)據(jù)區(qū)MOV WORD PTRBX,0;并將原INFO數(shù)據(jù)區(qū)最大值清零,為下一次的找最大值做準(zhǔn)備MOV DI,AXMOV AX,BX+2MOV WORD PTRBX+2,0MOV DI+2,AXMOV AX,BX+4MOV WORD PTRBX+4,0MOV DI+4,AXMOV DI+6,DHMOV DI+7,0D0AH;添加回車換行符,為顯示做準(zhǔn)備ADD DI,9;INFO2數(shù)據(jù)區(qū)轉(zhuǎn)移到下一個(gè)數(shù)據(jù)單元,為下一次的數(shù)據(jù)轉(zhuǎn)移做準(zhǔn)備INC DH;看是否完成了所有數(shù)據(jù)的轉(zhuǎn)移CMP DL,0JA LMOV
43、 BYTE PTRDI,'$'MOV DX,OFFSET INFO1;使用INFO1是因?yàn)閹媳眍^顯示MOV AH,09HINT 21HMOV AH,4CHINT 21H;-CHECK PROC NEAR;數(shù)據(jù)合法性檢測(cè)與數(shù)據(jù)單元初始化MOV DX,3130H;學(xué)號(hào)LOOPP:INC CX;統(tǒng)計(jì)實(shí)際輸入的學(xué)生成績(jī)數(shù)量MOV DI,DX;為INFO數(shù)據(jù)單元賦學(xué)號(hào)ADD DX,100H;下一個(gè)學(xué)號(hào)MOV DI+2,09H;為INFO數(shù)據(jù)單元賦分隔符ADD DI,3MOV AL,BX;檢測(cè)個(gè)位是否合法CMP AL,'0'JB ERRORSCMP AL,'9'JA ERRORSMOV AH,BX+1;檢測(cè)十位是否合法CMP AH,'0'JB ERRORSCMP AH,'9'JA ERRORSMOV DI,AX;為INFO數(shù)據(jù)單元賦成績(jī)ADD DI,2MOV AL,BX+2CMP AL,0DH;檢驗(yàn)是否為回車JE EXITRETMOV BYTE PTRDI,09H;分隔符改為tableINC DIADD BX,3;加3去檢測(cè)下一個(gè)輸入的數(shù)據(jù)JMP LOOPP;-EXITRET:MOV BYTE PTRDI,09
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 高考作文與社會(huì)的互動(dòng)試題及答案
- 高考數(shù)學(xué)新題解析與試題及答案
- 高考數(shù)學(xué)挑戰(zhàn)試題及答案
- 行政法學(xué)新進(jìn)展研究試題及答案
- 2023-2025北京高二(上)期末數(shù)學(xué)匯編:分類加法計(jì)數(shù)原理與分步乘法計(jì)算原理
- 行政法學(xué)考前沖刺指導(dǎo):試題及答案
- 未來(lái)公司戰(zhàn)略與網(wǎng)絡(luò)安全風(fēng)險(xiǎn)管理探究試題及答案
- 用戶需求識(shí)別與分析試題及答案
- 2025年醫(yī)療健康行業(yè)戰(zhàn)略試題及答案
- 軟考網(wǎng)絡(luò)管理員考試注意事項(xiàng)試題及答案
- 人工智能在價(jià)格預(yù)測(cè)中的應(yīng)用-深度研究
- 《新聞傳播學(xué)》課件
- Unit 3 The world of Science 大單元教學(xué)設(shè)計(jì)-2023-2024學(xué)年高中英語(yǔ)外研版(2019)必修第三冊(cè)
- 延邊大學(xué)《物聯(lián)網(wǎng)技術(shù)1》2023-2024學(xué)年第二學(xué)期期末試卷
- 2024年山東省濟(jì)南市中考英語(yǔ)試題卷(含答案解析)
- 基礎(chǔ)寫(xiě)作-終結(jié)性考核(期末考試)-國(guó)開(kāi)(SC)-參考資料
- 中建路基邊坡防護(hù)及排水專項(xiàng)施工方案
- 《十萬(wàn)個(gè)為什么》(米伊林)分享課課件
- DB11-T 584-2022 薄抹灰外墻外保溫工程技術(shù)規(guī)程
- 2024秋期國(guó)家開(kāi)放大學(xué)《當(dāng)代中國(guó)政治制度》一平臺(tái)在線形考(任務(wù)一至四)試題及答案
- 2025年中考?xì)v史復(fù)習(xí)專項(xiàng)訓(xùn)練:中國(guó)近代史材料題40題(原卷版)
評(píng)論
0/150
提交評(píng)論