北京郵電大學(xué)微機(jī)原理與接口技術(shù)軟件件實(shí)驗(yàn)報(bào)告_第1頁(yè)
北京郵電大學(xué)微機(jī)原理與接口技術(shù)軟件件實(shí)驗(yàn)報(bào)告_第2頁(yè)
北京郵電大學(xué)微機(jī)原理與接口技術(shù)軟件件實(shí)驗(yàn)報(bào)告_第3頁(yè)
北京郵電大學(xué)微機(jī)原理與接口技術(shù)軟件件實(shí)驗(yàn)報(bào)告_第4頁(yè)
北京郵電大學(xué)微機(jī)原理與接口技術(shù)軟件件實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩55頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

北京郵電大學(xué)微機(jī)原理與接口技術(shù)軟件件實(shí)驗(yàn)報(bào)告資料僅供參考信息與通信工程學(xué)院微機(jī)原理軟件實(shí)驗(yàn)報(bào)告班級(jí):學(xué)號(hào):姓名:序號(hào):時(shí)間:-11-6——-11-29實(shí)驗(yàn)二分支,循環(huán)程序設(shè)計(jì)一、實(shí)驗(yàn)?zāi)康?1.開(kāi)始獨(dú)立進(jìn)行匯編語(yǔ)言程序設(shè)計(jì);2.掌握基本分支,循環(huán)程序設(shè)計(jì);3.掌握最簡(jiǎn)單的DOS功能調(diào)用.二、實(shí)驗(yàn)內(nèi)容:1.安排一個(gè)數(shù)據(jù)區(qū)(數(shù)據(jù)段),內(nèi)存有若干個(gè)正數(shù),負(fù)數(shù)和零.每類數(shù)的個(gè)數(shù)都不超過(guò)9。2.編寫一個(gè)程序統(tǒng)計(jì)數(shù)據(jù)區(qū)中正數(shù),負(fù)數(shù)和零的個(gè)數(shù)。3.將統(tǒng)計(jì)結(jié)果在屏幕上顯示。4.(選做)統(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)?答:十進(jìn)制數(shù)0——9對(duì)應(yīng)的二進(jìn)制數(shù)為30H——39H。要屏顯0-9的數(shù)碼,只需將AH置成02H(DOS功能調(diào)用),然后將要顯示的數(shù)碼的ASCII碼存進(jìn)DL里,然后執(zhí)行INT21H就能夠打印字符?;蛘?,若這些數(shù)碼是以字符串的格式存儲(chǔ),則能夠?qū)H置成09H,(最后以’$’字符結(jié)束,)然后將串首地址傳給DS,然后執(zhí)行INT21H就能夠打印字符串。2、如何檢驗(yàn)一個(gè)數(shù)為正,為負(fù)或?yàn)榱?你能舉出多少種不同的方法?答:能夠?qū)⒋龣z驗(yàn)數(shù)與0比較(使用CMP指令后用JZ指令判斷ZF是否為零),也能夠?qū)⒋龣z驗(yàn)數(shù)與80H相與,判斷ZF的值。二是和0相比是否相等,然后用該數(shù)(假設(shè)為8位)和10000000相與,取出符號(hào)位判斷,可區(qū)分正負(fù)。本次試驗(yàn)中我使用的方法是與0比較,所有判決方法的核心思想要么是直接和0相比,要么使用邏輯或移位運(yùn)算,取出符號(hào)進(jìn)行判斷。四、實(shí)驗(yàn)過(guò)程:流程圖:定義數(shù)據(jù)段,將所需判別數(shù)據(jù)存入數(shù)據(jù)段,定義輸出字符定義數(shù)據(jù)段,將所需判別數(shù)據(jù)存入數(shù)據(jù)段,定義輸出字符CXCX是否為0是否CX=CCX=CX-1BXBX中的數(shù)和0比較大于0小于0負(fù)數(shù)個(gè)數(shù)加1正數(shù)個(gè)數(shù)加負(fù)數(shù)個(gè)數(shù)加1正數(shù)個(gè)數(shù)加1等于000個(gè)數(shù)加1BX中的數(shù)與BX中的數(shù)與1相與,結(jié)果加到負(fù)偶數(shù)中BX中的數(shù)與1相與,結(jié)果加到正偶數(shù)中統(tǒng)計(jì)輸出正數(shù)、負(fù)數(shù)、零,正負(fù)偶數(shù),計(jì)算正負(fù)奇數(shù)統(tǒng)計(jì)輸出正數(shù)、負(fù)數(shù)、零,正負(fù)偶數(shù),計(jì)算正負(fù)奇數(shù)輸出結(jié)果輸出結(jié)果結(jié)束

結(jié)束代碼:DATA SEGMENT;數(shù)據(jù)段BUFF DW4,0,37,99,-9,-2,-87,0,76,11,0,-34,-11,0,22;待判斷數(shù)據(jù)COUNT EQU$-BUFF;COUNT的值為BUFF所占的字節(jié)數(shù)POSIDB? ;正數(shù) ZERO DB? ;負(fù)數(shù) NEGTDB?;0POSIEVENDB0;正偶數(shù)POSIODDDB?;正奇數(shù)NEGTEVENDB0;負(fù)偶數(shù)NEGTODDDB?;負(fù)奇數(shù) POSICHARDB'Positive:$';用于打印提示的字符串定義 NEGTCHARDB'Negtive:$' ZEROCHARDB'Zero:$' EVENCHARDB'Even:$' ODDCHARDB'Odd:$' CRDB0DH,0AH,'$';回車換行的ASCII碼DATA ENDSSTACK SEGMENTSTACK'STACK';堆棧段 DB 100 DUP(?)STACK ENDSCODE SEGMENT;代碼段ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKBEGIN: PUSHDSXORAX,AXPUSHAX;返回DOSMOV AX,DATA MOV DS,AX;給DS真正賦值 MOV CX,COUNT SHR CX,1 ;相當(dāng)于除2,正好為BUFF中的數(shù)據(jù)個(gè)數(shù) MOV DX,0 ;設(shè)定初值:DH及DL分別為等于、大于零的個(gè)數(shù) MOV AH,0 ;設(shè)定初值:AH為小于零的個(gè)數(shù) LEA BX,BUFF;把BUFF中的第一個(gè)數(shù)存到BXAGAIN: CMPWORDPTR[BX],0;BUFF中的第一個(gè)數(shù)與0進(jìn)行比較 JGE POSITIVE ;大于等于0時(shí)轉(zhuǎn)POSITIVE INC AH ;統(tǒng)計(jì)小于零的個(gè)數(shù)ADDWORDPTR[BX],1 ANDNEGTEVEN,[BX];和1與之后的結(jié)果加到負(fù)偶數(shù)中 JMP NEXTPOSITIVE: JZ ZERO ;等于0時(shí)轉(zhuǎn)ZERO INC DL ;統(tǒng)計(jì)大于零的個(gè)數(shù)ADDWORDPTR[BX],1 ANDPOSIEVEN,[BX];和1與之后的結(jié)果加到正偶數(shù)中 JMP NEXTZERO: INC DH;統(tǒng)計(jì)等于零的個(gè)數(shù)NEXT INC BX ;修改地址指針 INC BX LOOP AGAIN;循環(huán)判斷CX不為0MOV POSI,DL ;保存結(jié)果,正數(shù) MOV ZERO,DH;0 MOV NEGT,AH;負(fù)數(shù)MOVAH,POSI MOVAL,POSIEVEN SUBAH,AL;計(jì)算正奇數(shù)個(gè)數(shù) MOVPOSIODD,AH MOVAH,NEGT MOVAL,NEGTEVEN SUBAH,AL MOVNEGTODD,AH;計(jì)算負(fù)奇數(shù)個(gè)數(shù) PRINT:;打印正數(shù)提示符和正數(shù)(奇偶)個(gè)數(shù) MOVAH,09H MOVDX,OFFSETPOSICHAR INT21H MOVAH,02H MOVDL,POSI ADDDL,30H INT21H MOVAH,09H MOVDX,OFFSETEVENCHAR INT21H MOVAH,02H MOVDL,POSIEVEN ADDDL,30H INT21H MOVAH,09H MOVDX,OFFSETODDCHAR INT21H MOVAH,02H MOVDL,POSIODD ADDDL,30H INT21H MOVDX,OFFSETCR MOVAH,09H INT21H ;打印負(fù)數(shù)提示符和負(fù)數(shù)(奇偶)個(gè)數(shù) MOVAH,09H MOVDX,OFFSETNEGTCHAR INT21H MOVAH,02H MOVDL,NEGT ADDDL,30H INT21H MOVAH,09H MOVDX,OFFSETEVENCHAR INT21H MOVAH,02H MOVDL,NEGTEVEN ADDDL,30H INT21H MOVAH,09H MOVDX,OFFSETODDCHAR INT21H MOVAH,02H MOVDL,NEGTODD ADDDL,30H INT21H MOVDX,OFFSETCR MOVAH,09H INT21H MOVAH,09H MOVDX,OFFSETZEROCHAR INT21H MOVAH,02H MOVDL,ZERO ADDDL,30H INT21HCODE ENDS END BEGIN;代碼段結(jié)束結(jié)果分析:數(shù)據(jù)區(qū)待統(tǒng)計(jì)的數(shù)據(jù)為:4,0,37,99,-9,-2,-87,0,76,11,0,-34,-11,0,22實(shí)驗(yàn)結(jié)果如下圖所示:本實(shí)驗(yàn)意在練習(xí)基本的分支、循環(huán)結(jié)構(gòu)。關(guān)鍵的點(diǎn)在于和0比較,區(qū)分正負(fù)和零,然后在正數(shù)和負(fù)數(shù)中判斷奇偶,這里巧妙地使用了和1與之后結(jié)果加和到偶數(shù)中,最后利用統(tǒng)計(jì)的數(shù)的個(gè)數(shù)減去偶數(shù)得奇數(shù)的方法。使得程序更加流暢和簡(jiǎn)潔,思路也更清晰。五、實(shí)驗(yàn)總結(jié)匯編程序同高級(jí)語(yǔ)言一樣,在寫代碼前都要對(duì)實(shí)驗(yàn)做分析,設(shè)計(jì)好思路,這樣寫代碼時(shí)思路才比較清晰,代碼也比較容易寫和查找錯(cuò)誤。此次實(shí)驗(yàn)主要是循環(huán)和分支,也是用匯編語(yǔ)言編寫的第一個(gè)程序,讓我熟悉了匯編語(yǔ)言的基本寫法,對(duì)很多理論課學(xué)到的知識(shí)都有了更深的了解。了解了怎樣利用判別條件在不同的分支中跳轉(zhuǎn),循環(huán)的判別及循環(huán)過(guò)程。總而言之,此次實(shí)驗(yàn)收獲還是很多的,不但加深了對(duì)這兩種結(jié)構(gòu)的了解,提升了自己設(shè)計(jì)程序的能力,而且也提升了自己排除bug的能力,進(jìn)一步熟悉了第一個(gè)實(shí)驗(yàn)的整個(gè)流程。實(shí)驗(yàn)三代碼轉(zhuǎn)換程序設(shè)計(jì)一、實(shí)驗(yàn)?zāi)康?1.掌握幾種最基本的代碼轉(zhuǎn)換方法;2.運(yùn)用子程序進(jìn)行程序設(shè)計(jì).二、實(shí)驗(yàn)內(nèi)容:1.從鍵盤上輸入若干兩位十進(jìn)制數(shù),尋找其中的最小值,然后在屏幕上顯示出來(lái).2.兩個(gè)十進(jìn)制數(shù)之間的分隔符,輸入結(jié)束標(biāo)志自定,但要在報(bào)告中說(shuō)明.3.對(duì)輸入要有檢錯(cuò)措施,以防止非法字符輸入,并有適當(dāng)?shù)奶崾?4.將整個(gè)程序分解為若干模塊,分別用子程序?qū)崿F(xiàn).在報(bào)告中要給出模塊層次圖.三、預(yù)習(xí)題:1.如何將輸入的兩個(gè)字符(0--9)變?yōu)槭M(jìn)制或二進(jìn)制數(shù)?答:兩字符減去0的ASCII碼(30H)后,高位數(shù)乘以十加上低位數(shù),即變?yōu)槭M(jìn)制數(shù)。2.如何將選出的最小值(二進(jìn)制或十進(jìn)制)變?yōu)锳SCII碼再進(jìn)行顯示?答:本次實(shí)驗(yàn)是直接讀入并存儲(chǔ)數(shù)字的ASCII碼,比較其大小,然后直接輸出ASCII碼。3.你覺(jué)得采用二進(jìn)制運(yùn)算還是十進(jìn)制運(yùn)算更適合于這個(gè)實(shí)驗(yàn)?答:相比二進(jìn)制,采用十進(jìn)制運(yùn)算更簡(jiǎn)潔,但需要和ASCII碼進(jìn)行轉(zhuǎn)換??芍苯邮褂脭?shù)字對(duì)應(yīng)的ASCII比較,分別比較十位和個(gè)位,最后直接輸出字符即可。四、實(shí)驗(yàn)過(guò)程:模塊層次圖:主程序主程序BEGIN讀取輸入子程序輸出打印子程序找出最小數(shù)據(jù)子程序讀取輸入子程序輸出打印子程序找出最小數(shù)據(jù)子程序流程圖:代碼:DATASEGMENT;數(shù)據(jù)段INPUTDB100DUP(?)MINTMPDB'9'-30H,'9'-30H;置最小值的初始值為99COUNTDB0DIFERRORDB0D;用于判斷調(diào)用輸入子程序是否有錯(cuò)WELCOMEDB'Pleaseinputnumbers:','$';提示信息字符串OUTTIPDB'Minimumis:','$'CRDB0DH,0AH,'$';回車換行ERROR1DB'ERROR:Characterisnotvalid!','$';各種錯(cuò)誤輸入提示ERROR2DB'ERROR:Numbermustcontainstwodigits!','$'ERROR3DB'ERROR:Numberisempty!','$'ERROR4DB'ERROR:Needseparatechar!','$'DATAENDSSTACK SEGMENTSTACK'STACK';堆棧段 DB 100 DUP(?)STACK ENDSCODESEGMENT;代碼段 ASSUMECS:CODE,DS:DATA,SS:STACK,ES:DATABEGINPROCFARPUSHDS;返回DOSXORAX,AXPUSHAX MOVAX,DATA;真正給DS賦值 MOVDS,AX MOVDX,OFFSETWELCOME;調(diào)用歡迎提示 CALLPRINT;調(diào)用子程序 MOVDX,OFFSETCR;回車換行 CALLPRINT CALLMAIN;獲取用戶輸入 CMPIFERROR,0;判斷輸入過(guò)程是否有錯(cuò) JNZBACK;錯(cuò)誤則直接返回DOS MOVDX,OFFSETCR;回車換行 CALLPRINT CALLFINDMIN;查找最小數(shù) MOVDX,OFFSETOUTTIP;調(diào)用輸出提示 CALLPRINT MOVAH,02H MOVDL,MINTMP;輸出最小值的十位 ADDDL,30H INT21H MOVAH,02H MOVDL,MINTMP[1];輸出最小值的個(gè)位 ADDDL,30H INT21H BEGINENDP;獲取輸入,出口參數(shù)為IFERROR,表示是否有錯(cuò)MAINPROC PUSHAX;保存現(xiàn)場(chǎng) PUSHBX PUSHCX PUSHDX PUSHDI MOVDI,0;數(shù)組偏移地址 MOVCX,0;標(biāo)識(shí)數(shù)字的位數(shù)GETLOOP: MOVAH,01H;從鍵盤讀取一個(gè)字符 INT21H CMPAL,0DH;和回車比較 JEEXIT1;是回車則結(jié)束輸入 CMPCX,0;數(shù)字位數(shù)為空 JECMPSPACE0 CMPCX,1;數(shù)字位數(shù)為1 JECMPSPACE1 CMPCX,2;數(shù)字位數(shù)為2 JECMPSPACE2CMPSPACE0:CMPAL,20H JEGETLOOP;數(shù)字位數(shù)為0且輸入空格則忽略,繼續(xù)輸入 JMPASCBIN;不是空格就讀取該字符CMPSPACE1:CMPAL,20H JEERR2;數(shù)字位數(shù)為1且輸入空格則位數(shù)不是兩位數(shù)出錯(cuò) JMPASCBIN;否則讀取該字符CMPSPACE2:CMPAL,20H JNEERR4;數(shù)字位數(shù)為2后,不輸入空格則分隔符錯(cuò)誤 XORCX,CX;輸入空格則清零重新計(jì)數(shù) JMPGETLOOP ASCBIN: SUBAL,30H;化為二進(jìn)制數(shù)字 JLERR1;小于則無(wú)效字符 CMPAL,9;和9比較 JGERR1;大于9則是無(wú)效字符 MOVINPUT[DI],AL;保存輸入的數(shù) INCCOUNT;統(tǒng)計(jì)輸入的數(shù)字個(gè)數(shù),為判斷是否輸入為兩位數(shù) INCDI;向后移動(dòng)數(shù)組 INCCX JMPGETLOOPERR1: MOVIFERROR,1;輸出錯(cuò)誤1 MOVDX,OFFSETERROR1 CALLPRINT JMPRETURNERR2: MOVIFERROR,1;輸出錯(cuò)誤2 MOVDX,OFFSETERROR2 CALLPRINT JMPRETURN ERR3: MOVIFERROR,1;輸出錯(cuò)誤3 MOVDX,OFFSETERROR3 CALLPRINT JMPRETURN ERR4: MOVIFERROR,1;輸出錯(cuò)誤4 MOVDX,OFFSETERROR4 CALLPRINT JMPRETURN EXIT1: MOVBL,COUNT;判斷輸入數(shù)的個(gè)數(shù)是否為零 CMPBL,0 JEERR3;輸入數(shù)目為0則輸出錯(cuò)誤并退出 ANDBL,01H;判斷數(shù)字是否為兩位數(shù) CMPBL,0 JNEERR2;輸入數(shù)字個(gè)數(shù)為奇數(shù)則出錯(cuò)RETURN: POPDI;恢復(fù)現(xiàn)場(chǎng) POPDX POPCX POPBX POPAX RETMAINENDP;回車換行輸出字符串,入口參數(shù)為DXPRINTPROC PUSHAX MOVAH,09H INT21H POPAX RETPRINTENDP;查找最小的數(shù)子程序FINDMINPROC PUSHDI;保護(hù)現(xiàn)場(chǎng) PUSHAX PUSHCX MOVDI,-2;數(shù)組下標(biāo) MOVCL,COUNT;把數(shù)組長(zhǎng)度移入CX MOVAL,CL CBW MOVCX,AXLOP: ADDDI,2 CMPCX,DI;是否已經(jīng)比較完畢 JEEXIT2;如果比較完畢所有數(shù)則退出 MOVAH,INPUT[DI];否則接著比較,移入十位數(shù) MOVAL,INPUT[DI+1];移入個(gè)位數(shù) CMPAH,MINTMP;比較十位數(shù),MINTMP低地址為十位 JALOP;如果MINTMP小,則直接比較下一個(gè)數(shù) JEHIGHEQU ;如果十位數(shù)相等,比較個(gè)位數(shù),再否則十位大就直接存儲(chǔ)STOMIN: MOVMINTMP,AH MOVMINTMP[1],AL JMPLOPHIGHEQU: CMPAL,MINTMP[1];比較個(gè)位數(shù) JNBLOP;個(gè)位數(shù)比MINTMP大則跳到下一個(gè)數(shù) JMPSTOMIN;否則將當(dāng)前數(shù)寫入為MINTMPEXIT2: POPCX POPAX POPDI RETFINDMINENDPCODEENDS ENDBEGIN結(jié)果分析:實(shí)驗(yàn)以空格為分隔符,空格的個(gè)數(shù)不限制,以回車為輸入結(jié)束標(biāo)志符。對(duì)輸入的數(shù)字進(jìn)行了位數(shù)和范圍的嚴(yán)格限制,即必須是兩位數(shù)字,如果數(shù)字小于10,需要補(bǔ)齊零。第一次不輸入數(shù)字,直接回車后,提示錯(cuò)誤,輸入不能為空;第二次輸入數(shù)據(jù)1,提示錯(cuò)誤,要求輸入必須為2位數(shù)字;第三次輸入字符$,提示錯(cuò)誤,要求輸入為數(shù)字;第四次輸入123,提示錯(cuò)誤,所輸入數(shù)據(jù)兩位后必須有空隔;正確輸入待比較數(shù)據(jù):012366098256,找到最小數(shù)為01,結(jié)果正確。五、實(shí)驗(yàn)總結(jié)這次實(shí)驗(yàn)主要是如何分析、如何調(diào)用子程序,用子程序使得整個(gè)代碼思路比較清晰,代碼也不容易出錯(cuò),修改bug的時(shí)候比較好查找。在實(shí)驗(yàn)中,以數(shù)組方式進(jìn)行存儲(chǔ)數(shù)據(jù),每?jī)蓚€(gè)BYTE存儲(chǔ)一個(gè)輸入的兩位數(shù),存儲(chǔ)格式為字符ASCII碼,比較數(shù)字大小時(shí),采用分別比較高位ASCII碼和低位ASCII碼的方式,從而不用在輸入時(shí)將字符存儲(chǔ)為數(shù)字,輸出時(shí)也不用再進(jìn)行逆轉(zhuǎn)換,程序效率大為提高。實(shí)驗(yàn)中遇到了很多問(wèn)題,在同學(xué)的幫助下,解決了很多問(wèn)題,了解了主函數(shù)和子函數(shù)的調(diào)用,每次遇到bug時(shí),要是直接看代碼找不到問(wèn)題所在,就用debug查找,進(jìn)一步熟悉了debug的使用,也從DS、IP、CS、AX、BX等寄存器的變化更好的理解了代碼,更好的理解了匯編的過(guò)程,都是不小的進(jìn)步,對(duì)以后的實(shí)驗(yàn)也有幫助。實(shí)驗(yàn)四子程序設(shè)計(jì)一、實(shí)驗(yàn)?zāi)康?1.進(jìn)一步掌握子程序設(shè)計(jì)方法;2.進(jìn)一步掌握基本的DOS功能調(diào)用.二、實(shí)驗(yàn)內(nèi)容:1.從鍵盤上輸入某班學(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é)生在這門科目中的名次?答:有兩種基本思路:一是抽取每個(gè)學(xué)生的成績(jī)和其它所有學(xué)生的成績(jī)進(jìn)行比較,然后統(tǒng)計(jì)比其分?jǐn)?shù)高的學(xué)生,得出該學(xué)生的名次;二是把學(xué)生成績(jī)存入連續(xù)內(nèi)存區(qū)域,即數(shù)組方式,取得每個(gè)學(xué)生的成績(jī)偏移量,即成績(jī)偏移地址。然后比較偏移地址所指的成績(jī)的大小,交換數(shù)據(jù)區(qū)的值的位置,完成排序。2.你覺(jué)得輸入結(jié)束后,采用什么方法進(jìn)行比較以得到學(xué)生的名次最為簡(jiǎn)單?答:采用冒泡排序法可獲得較好的時(shí)間和空間性能。冒泡法平均時(shí)間性能O(N2)。相比于直接比較,性能有所改進(jìn)。但相對(duì)于快速排序、歸并排序等優(yōu)化的算法的時(shí)間復(fù)雜度O(N*log2N)還不夠好。但后兩者使用匯編實(shí)現(xiàn)代碼的復(fù)雜度和編程要求要高??紤]到學(xué)生人數(shù)比較少,使用冒泡法是比較簡(jiǎn)潔的,時(shí)間性能是能夠接受的。3.準(zhǔn)備好模塊層次圖.答:如下圖所示實(shí)驗(yàn)過(guò)程中的模塊層次圖4.給出輸出顯示的形式。答:以列表顯示輸出,依次為排名、學(xué)號(hào)、成績(jī)。四、實(shí)驗(yàn)過(guò)程:模塊層次圖:主函數(shù)BEGIN主函數(shù)BEGIN打印輸出子程序排序子程序讀取數(shù)據(jù)子程序打印輸出子程序排序子程序讀取數(shù)據(jù)子程序保存排序結(jié)果保存排序結(jié)果冒泡排序輸入數(shù)據(jù)存儲(chǔ)數(shù)據(jù)檢查數(shù)據(jù)輸入數(shù)據(jù)存儲(chǔ)數(shù)據(jù)檢查數(shù)據(jù)流程圖:代碼:DATASEGMENT;數(shù)據(jù)段IDDB400DUP(?);存儲(chǔ)學(xué)號(hào),每個(gè)16固定個(gè)BYTE,存儲(chǔ)為字符串 MARKDB20DUP(?);存儲(chǔ)分?jǐn)?shù),每個(gè)1BYTE,存儲(chǔ)為二進(jìn)制數(shù) RANKDB20DUP(?);存儲(chǔ)排名,每個(gè)1BYTE,存儲(chǔ)為二進(jìn)制數(shù) RANKTMPDB20DUP(?);排序時(shí)指針臨時(shí)區(qū) MTMPDB?;記錄成績(jī)的臨時(shí)區(qū) COUNTBDB?;記錄總的學(xué)生的個(gè)數(shù),存為8位 COUNTWDW?;記錄總的學(xué)生個(gè)數(shù),存為16位 CHEOKDB?;輸入檢查標(biāo)志位 ERRORDB?;記錄錯(cuò)誤號(hào) TMPDB2DUP(?);開(kāi)辟兩個(gè)內(nèi)存臨時(shí)存儲(chǔ)區(qū),用作判斷和計(jì)數(shù) CRDB0DH,0AH,'$';回車換行 TABDB09H,09H,'$';輸出TAB鍵 ERR0DB'Inputcannotbeempty!','$' ERR2DB'Characterisinvalid!','$' ERR4DB'Markisinvalid!','$' ERR6DB'Inputisinvalid!','$' ERRLISTDWERR0,ERR2,ERR4,ERR6 TIP0DB'Pleasere-input:','$' TIP1DB'Pleaseinputnumberofstudents:','$' TIP2DB'PleaseinputIDandMARK:','$' PRTIPDB'--------------RESULT---------------','$' PRINFODB'ID',09H,09H,'MARK',09H,09H,'RANK','$' PRPRE1DB'ID:','$' PRPRE2DB'MARK:','$' BUFFDB16;定義輸入緩沖區(qū),最長(zhǎng)的字符長(zhǎng)度 PRESDB?;存儲(chǔ)實(shí)際輸入了多少個(gè)字符 CHARDB16DUP(?);實(shí)際可存儲(chǔ)有效字符16個(gè)DATAENDSCODESEGMENT;代碼段;打印提示字信息的宏,形參為PARAPRINTTIPMACROPARA PUSHAX PUSHDX MOVAH,09H MOVDX,OFFSETPARA INT21H POPDX POPAXENDM;打印單個(gè)字符的宏,形參為ACHARPRINTCHARMACROACHAR PUSHAX PUSHDX MOVAH,02H MOVDL,ACHAR INT21H POPDX POPAXENDMBEGINPROCFAR ASSUMECS:CODE,DS:DATA,ES:DATA MOVAX,DATA MOVDS,AX MOVES,AX CALLGETNUMBER;獲得學(xué)生的人數(shù) CALLGETINFO;獲得學(xué)號(hào)分?jǐn)?shù)的輸入 CALLSORT;執(zhí)行排序活動(dòng)名次 CALLPRINT;把名次結(jié)果打印出來(lái)BACK: MOVAX,4C00H;返回DOS INT21HMAINENDP ;獲得將要輸入的學(xué)生的人數(shù)信息的子程序;每班的學(xué)生定義不超過(guò)100人GETNUMBERPROCNEAR PUSHAX PUSHBXHE: PRINTTIPTIP1GREP: CALLGETIN;獲取一個(gè)輸入緩沖 MOVCHEOK,0 CALLCHECK CMPCHEOK,0 JEGRETURN MOVERROR,6 CALLPRINTERR PRINTTIPTIP0 PRINTTIPCR JMPGREPERRHERE: PRINTTIPCR MOVERROR,6 CALLPRINTERR PRINTTIPTIP0 JMPGREPGRETURN: CALLCHANGE MOVAL,MTMP CMPAL,0 JEERRHERE MOVCOUNTB,AL;寫入人數(shù) CBW MOVCOUNTW,AX PRINTTIPCR POPBX POPAX RETGETNUMBERENDP;循環(huán)直到輸入人數(shù)滿時(shí)終止,獲得輸入的字符串GETINFOPROCNEAR PUSHAX PUSHBX PUSHCX PUSHDX PUSHSI PUSHDI PRINTTIPTIP2 MOVTMP,0;記錄是學(xué)號(hào)還是分?jǐn)?shù) XORBX,BX;記錄每個(gè)ID的偏移量 XORAX,AX;記錄學(xué)生數(shù)目MORE: PRINTTIPCR CMPCOUNTB,AL JNZHERE1 JMP RETURN;計(jì)數(shù)器為0則返回父程序HERE1: CMPTMP,0 JEPR1 CMPTMP,1 JEPR2PR1: PRINTTIPPRPRE1 JMPHERE2PR2: PRINTTIPPRPRE2HERE2: CALLGETIN;否則接受輸入 CALLCHECK;檢查輸入是否是數(shù)字且不為空 CMPCHEOK,0 JNECHEFAIL;不為零則不合法,需要重新輸入 CMPTMP,0 JEISID;輸入的是學(xué)號(hào) CMPTMP,1; JEISMARK;輸入的是分?jǐn)?shù)CHEFAIL: PRINTTIPTIP0 PRINTTIPCR MOVCHEOK,0;重新把返回判斷位置零 JMPMORE;寫入學(xué)號(hào),固定為16個(gè)字符ISID: MOVDL,PRES;抽取需要寫入字符的個(gè)數(shù) XORDH,DH MOVCX,DX MOVSI,CX INCCX MOVCHAR[SI],'$';把最后一個(gè)字符之后的位置填充為'$' ;開(kāi)始寫入ID MOVTMP,1;表示下一個(gè)是分?jǐn)?shù) CLD MOVSI,OFFSETCHAR MOVDI,OFFSETID ADDDI,BX REPMOVSB;寫入ID ;寫完則為接受下一個(gè)輸入BUFF作準(zhǔn)備 ADDBX,16;ID的偏移地址向后挪動(dòng)固定的16BYTE JMPMORE;跳回繼續(xù)輸入下一個(gè)BUFF;是學(xué)號(hào),檢查、轉(zhuǎn)換、寫入保存ISMARK: CALLCHANGE CMPCHEOK,0 JEWRITEMARK MOVERROR,4 JMPCHEFAILWRITEMARK: PUSHBX MOVBL,MTMP MOVDI,AX MOVMARK[DI],BL;實(shí)際寫入成績(jī) POPBX MOVTMP,0;計(jì)數(shù)清理,表明下一個(gè)輸入為學(xué)號(hào) INCAX;已接受的學(xué)生個(gè)數(shù)加一 JMPMORERETURN: POPDI POPSI POPDX POPCX POPBX POPAX RETGETINFOENDP;獲得一次BUFF輸入子程序;入口參數(shù)為BUFF的偏移地址,出口參數(shù)為BUFF中的字符串 GETINPROCNEAR PUSHAX PUSHDX PUSHDI MOVDX,OFFSETBUFF MOVAH,0AH INT21H POPDI POPDX POPAX RETGETINENDP;執(zhí)行輸入字符是否是數(shù)字的合法性檢查CHECKPROCNEAR PUSHDI PUSHCX PUSHAX XORDI,DI;記錄CHAR讀取的偏移量 MOVAL,PRES;讀取輸入的BUFF中的字符數(shù) CBW MOVCX,AX CMPCX,0;判斷是否輸入BUFF為空 JEISEMPTY;為空則重新輸入AGAIN: CMPCX,DI JERETURNCHECK MOVAH,CHAR[DI] CMPAH,30H; JLINVALID;小于則無(wú)效字符 CMPAH,39H; JGINVALID;大于則是無(wú)效字符 INCDI JMPAGAINISEMPTY: MOVERROR,0;輸入為空的處理代碼 PRINTTIPCR CALLPRINTERR PRINTTIPCR MOVCHEOK,1 JMPRETURNCHECKINVALID:MOVERROR,2;輸入不合法的處理代碼 PRINTTIPCR CALLPRINTERR PRINTTIPCR MOVCHEOK,1RETURNCHECK: POPAX POPCX POPDI RETCHECKENDP;處理成績(jī)輸入的子程序;檢查輸入成績(jī)是否在0-100之間的子程序并轉(zhuǎn)化為二進(jìn)制數(shù)CHANGEPROCNEAR ;把3位數(shù)字轉(zhuǎn)換為二進(jìn)制數(shù) PUSHAX PUSHBX PUSHCX MOVCL,PRES CMPCL,3 JAMINVALID;四位數(shù)或以上,溢出 JETHRDIG;三位數(shù) CMPCL,2 JETWODIG;兩位數(shù) CMPCL,1 JEONEDIG;一位數(shù)THRDIG: ;判斷是否是100,是則直接在臨時(shí)成績(jī)區(qū)寫入100 MOVBL,CHAR[0];百位 SUBBL,30H CMPBL,1 JNEMINVALID MOVBL,CHAR[1];十位 SUBBL,30H CMPBL,0 JNEMINVALID MOVBL,CHAR[2];個(gè)位 SUBBL,30H CMPBL,0 JNEMINVALID MOVMTMP,100;寫入100 JMPCRETURNTWODIG:;當(dāng)是兩位數(shù)時(shí)判斷十位是否是0,不是則進(jìn)行轉(zhuǎn)換,然后寫入臨時(shí)成績(jī)中 MOVBL,CHAR[0];十位 SUBBL,30H CMPBL,0 JEMINVALID MOVAL,10 MULBL;成10取得十位數(shù) MOVBL,CHAR[1];個(gè)位 SUBBL,30H ADDAL,BL;因?yàn)樾∮?00因此有效數(shù)在AL中, ;能夠直接加個(gè)位數(shù)得結(jié)果 MOVMTMP,AL;寫入轉(zhuǎn)換后的數(shù)字 JMPCRETURNONEDIG: ;一位數(shù)時(shí)直接寫入臨時(shí)成績(jī)區(qū)即可 MOVBL,CHAR[0];個(gè)位 SUBBL,30H MOVMTMP,BL JMPCRETURNMINVALID: MOVERROR,4 CALLPRINTERR MOVCHEOK,1 CRETURN: POPCX POPBX POPAX RETCHANGEENDP;打印錯(cuò)誤信息子程序PRINTERRPROCNEAR PUSHAX PUSHDX PUSHBX MOVAL,ERROR CBW MOVBX,AX MOVAH,09H MOVDX,ERRLIST[BX] INT21H POPBX POPDX POPAX RETPRINTERRENDP;排序子程序SORTPROCNEAR PUSHAX PUSHBX PUSHCX PUSHDX PUSHSI PUSHDI ;寫入偏移量作為分?jǐn)?shù)的指針 MOVAL,COUNTB;讀取學(xué)生數(shù)目 XORBX,BX;BX作為尋址計(jì)數(shù)器 ;順序?qū)懭氤煽?jī)偏移量SLOP: DECAL MOVRANKTMP[BX],AL INCBX CMPAL,0 JNESLOP ;排序名次,冒泡排序法 MOVCX,COUNTW;CX記錄了總的學(xué)生人數(shù) DECCX JZWRRAK;如果只有一個(gè)學(xué)生則直接寫入名次,否則排序異常LOP1: XORDI,DI;從第一個(gè)名次開(kāi)始LOP2: MOVAL,RANKTMP[DI];取出地址指針,即成績(jī)偏移量 XORAH,AH MOVSI,AX MOVDL,MARK[SI];取出成績(jī)1 MOVAL,RANKTMP[DI+1] XORAH,AH MOVSI,AX MOVDH,MARK[SI];同理取出成績(jī)2 CMPDL,DH JGENEXTCMP MOVAH,RANKTMP[DI];交換分?jǐn)?shù)指針 XCHGAH,RANKTMP[DI+1] MOVRANKTMP[DI],AH NEXTCMP:INCDI CMPDI,CX JNELOP2 LOOPLOP1 ;寫入最后的名次WRRAK: XORSI,SI MOVCX,COUNTW MOVBL,1;保存名次LOPSAVE: CMPSI,CX JEFINISH MOVAL,RANKTMP[SI];提取該名次學(xué)生的地址指針 XORAH,AH MOVDI,AX MOVRANK[DI],BL;寫入該學(xué)生的名次 INCBL INCSI JMPLOPSAVEFINISH: POPDI POPSI PO

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論