




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 匯編語(yǔ)言課程設(shè)計(jì)任務(wù)書一、題目1簡(jiǎn)單的計(jì)算器2字典3“Pc”鋼琴二、目的:本次課程設(shè)計(jì)的目的是提高學(xué)生分析問(wèn)題、解決問(wèn)題的能力以及實(shí)際動(dòng)手能力,進(jìn)一步加深學(xué)生對(duì)匯編語(yǔ)言程序設(shè)計(jì)基本理論的理解,使學(xué)生熟練掌握匯編語(yǔ)言程序上機(jī)調(diào)試的方法技巧、結(jié)構(gòu)化程序設(shè)計(jì)技術(shù)及高級(jí)匯編語(yǔ)言技術(shù),能編寫較復(fù)雜的應(yīng)用程序,為學(xué)習(xí)后繼課程打下扎實(shí)的基礎(chǔ)。三、已知技術(shù)參數(shù)和設(shè)計(jì)要求:1編寫一個(gè)有符號(hào)多位十進(jìn)制數(shù)的四則運(yùn)算計(jì)算器程序,所輸入的算式如下例所示:27832132121132123418要求程序能接收鍵入的算式,在接收到號(hào)時(shí),計(jì)算并以有符號(hào)十進(jìn)制數(shù)的形式顯示結(jié)果,然后允許用戶繼續(xù)鍵入算式。如果鍵入算式后再鍵入.
2、,則顯示結(jié)果并結(jié)束整個(gè)程序。(為整除)2已知一個(gè)由英語(yǔ)單詞組成的字符串已按字典序排好,每個(gè)單詞以空格符為結(jié)束,該串的首二字節(jié)為16位無(wú)符號(hào)二進(jìn)制數(shù),用以說(shuō)明串的長(zhǎng)度。試編程能從鍵盤上輸入單詞(以空格字符為結(jié)束),若字符串中沒(méi)有該單詞,則將該單詞插入該串適當(dāng)?shù)奈恢?,使其仍保持字典序,并修改串長(zhǎng)度,顯示單詞在串中位置及串長(zhǎng)度;若字符串中有該單詞,則顯示字符串中所有包含該單詞的單詞,及其在字符串中的位置。3編寫程序,程序運(yùn)行時(shí)使PC機(jī)成為一架可彈奏的“鋼琴”。當(dāng)按下數(shù)字鍵09時(shí),發(fā)出6,7,1,2,3,4,5,6,7,i,十個(gè)音調(diào),按.則退出“鋼琴”狀態(tài)??傮w要求1)程序結(jié)構(gòu)清晰,相對(duì)獨(dú)立的功能應(yīng)盡
3、量用子程序?qū)崿F(xiàn)2)有較多提示信息,以方便用戶使用3)能檢測(cè)用戶輸入的錯(cuò)誤,并作相應(yīng)處理4)每個(gè)程序應(yīng)作較多測(cè)試,以證明程序的正確性實(shí)驗(yàn)一:源代碼:DATA SEGMENTSIG DB 00H;用來(lái)記錄要進(jìn)行的運(yùn)算NUM1 DW 0;用來(lái)記錄輸入的第一個(gè)數(shù)NUM2 DW 0;用來(lái)記錄輸入的第二個(gè)數(shù)X DB 10 ;當(dāng)輸入的下一個(gè)數(shù)字時(shí),大小為前一個(gè)數(shù)需要乘10DATA ENDS;再加上當(dāng)前的數(shù)CODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DATASTART:MAINT1:MOV AH,1 ;輸入要運(yùn)算的算式INT 21HMAINT3:CMP AL,30H;
4、和0作比較JL L1;小于0時(shí)轉(zhuǎn)去L1CMP AL,3DHJZ MAINT2;當(dāng)輸入”=”時(shí)轉(zhuǎn)去MAINT2進(jìn)行計(jì)算結(jié)果CALL BIN;調(diào)用子程序BIN,計(jì)算數(shù)值真實(shí)大小CMP DX,1JNZ L5NEG BX;當(dāng)DX為1使需對(duì)BX進(jìn)行取反MOV DX,0;恢復(fù)DXL5:CMP CX,1JZ L3MOV NUM2,BX;CX不等于1時(shí)記錄當(dāng)前輸入的第二個(gè)數(shù)JMP MAINT3L3:MOV NUM1,BX;記錄當(dāng)前輸入的第一個(gè)數(shù)JMP MAINT3L1:CMP AL,2EHJZ quit;當(dāng)輸入的字符為”.”時(shí)轉(zhuǎn)去quit,即程序運(yùn)行結(jié)束CMP CX,1JNZ L2MOV SIG,AL;當(dāng)CX
5、不等于1時(shí),即為當(dāng)前要進(jìn)行的運(yùn)算MOV CX,2JMP MAINT1;返回MINT1繼續(xù)輸入算式L2:CMP AL,2DHJNZ MAINT1MOV DX,1JMP MAINT1quit:MOV AH,4CH;程序運(yùn)行結(jié)束INT 21HMAINT2:CMP SIG,'+'SIG為”+”時(shí)進(jìn)行加法操作JNZ S1MOV AX,NUM1MOV BX,NUM2ADD AX,BXJMP MAINT4S1:CMP SIG,'-'SIG為”-”時(shí)進(jìn)行減法操作JNZ S2MOV AX,NUM1SUB AX,NUM2JMP MAINT4S2:CMP SIG,'*'
6、;SIG為”*”時(shí)進(jìn)行乘法操作JNZ S3MOV AX,NUM1MOV DX,0IMUL NUM2JMP MAINT4S3:MOV AX,NUM1;否則進(jìn)行除法運(yùn)算MOV BX,NUM2IDIV BLCBWMAINT4:MOV BP,SP;當(dāng)數(shù)為負(fù)數(shù)時(shí)進(jìn)行取反操作TEST AX,8000HJZ OUT2MOV BX,AXMOV DL,'-'MOV AH,2INT 21HMOV AX,BXNEG AX;取AX的反OUT2:DIV X;不斷乘以10MOV BL,AHMOV BH,0PUSH BXMOV AH,0CMP AL,0JNZ OUT2OUT3:POP DX;輸出所求的結(jié)果A
7、DD DL,30H;因?yàn)轱@示的是ascall碼,所以需加上30HMOV AH,2INT 21HCMP BP,SP;當(dāng)bp和sp指向同一位置時(shí)輸出結(jié)束JNZ OUT3MOV DL,0AHMOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HJMP START;返回START進(jìn)行下一輪計(jì)算MAIN ENDPBIN PROC NEAR ;子程序BIN用來(lái)轉(zhuǎn)換輸入的數(shù)字大小,即計(jì)算數(shù)值;的真實(shí)大小PUSH DXMOV BX,0INC CXSUB AL,30HCBWXCHG AX,BXMOV DX,10MUL DXXCHG AX,BXADD BX,AXBINT1:MOV AH,
8、1INT 21HCMP AL,30H;判斷輸入的字符是否為數(shù)值JL EXITCMP AL,3DHJZ EXIT;當(dāng)輸入的字符不為字符時(shí)退出子程序BINSUB AL,30HCBWXCHG AX,BXMOV DX,10;同過(guò)乘10相加得到真實(shí)數(shù)值MUL DXXCHG AX,BXADD BX,AXJMP BINT1EXIT:POP DXRETBIN ENDPCODE ENDSEND START運(yùn)行結(jié)果:實(shí)驗(yàn)二:源代碼:DATA SEGMENT ; DICTIONARY 字典字符串,首兩個(gè)字節(jié)為 16 位無(wú)符號(hào)二進(jìn)制數(shù),說(shuō)明字符串長(zhǎng)度。DICTIONARY DB00,19H,"apple b
9、ird good happy " DB100HDUP(20H) ; 空的緩沖區(qū)。MSG_INTRO DB"Input the Word to Search : ","$"MSG_NOTFOUNDDB"Not Found, Now Insert it . ",0AH,0DH,"$"MSG_NEWDICTDB0AH,0DH,"New Dictionary : ","$"MSG_FOUNDDB0AH,0DH,"Found Word in Dictionary :
10、 ","$"MSG_POSITIONDB0AH,0DH,"Position : ","$" MSG_DICTLENGTHDB0AH,0DH,"New Dictionary Length : ","$"MSG_NEWLINEDB0AH,0DH,"$"BUFFERDB10HDUP(20H); BUFFER 用于保存需要查詢的單詞。WORD_LENGTHDB0HCHAR_SPACEEQU20H;默認(rèn)的單詞間隔為空格。DATA ENDSCODE SEGMENTASSUMEC
11、S:CODE, DS:DATAstart:MOV AX,DATAMOV DS,AXLEABX,BUFFER;把buffer有效地址送BXMOV DX,OFFSET MSG_INTRO;把偏移地址送DX通用寄存器MOV AH,09H ;調(diào)用9號(hào)中斷,輸出MSG_INTROINT 21HGET_WORD:; 獲取用戶輸入的需要查找的單詞字符串。MOVAH,01HINT21HCMPAL,0DH; 輸入以回車結(jié)束。JEINPUT_FINISH;如果是回車,跳轉(zhuǎn)輸入結(jié)束MOVBX,ALINCBX ;BX加1,下一步修改字符長(zhǎng)度INCWORD_LENGTHJMPGET_WORDINPUT_FINISH:M
12、OVDX,OFFSET MSG_NEWLINE;把偏移地址送DX通用寄存器MOVAH,09HINT21HSUBBX,WORD PTR WORD_LENGTHMOVCX,00HMOV SI,02HSEARCH:MOVDL,BX;把輸入的字符放到DLCMPDL,DICTIONARYSI ; 比較BX和DICTIONARYSI內(nèi)容是否匹配。JEMATCH; 結(jié)果匹配。JNLUNMATCH_NEXT; 需要查找下一個(gè)單詞。JLUNMATCH_INSERT; 找到了輸入單詞的插入位置,將要插入這個(gè)單詞。MATCH:MOVDL,DICTIONARYSI+1CMPDL,CHAR_SPACE; 如果DICTI
13、ONARY下一位字符為空格,查找成功。JNENOFOUND JMP FOUNDNOFOUND:INCBX; 匹配了 1 位字符,繼續(xù)比較下一位。INCSIINCCX; 匹配計(jì)數(shù)器增加一位。JMPSEARCHUNMATCH_NEXT:; 如果當(dāng)前字典中的單詞不匹配,BUFFER 回到首地址,DICTIONARYSI到下一個(gè)單詞。SUBBX,CX; 將 BX 恢復(fù)初始位置。MOVCX,0H; 匹配計(jì)數(shù)器 CX 清零。; 找到下一個(gè)單詞的起始位置。TO_NEW_WORD:MOVDH,DICTIONARY0MOVDL,DICTIONARY1INCDXCMPDX,SIJEINSERT_LASTMOVDL
14、,DICTIONARYSIINCSICMPDL,CHAR_SPACEJNETO_NEW_WORDJMP SEARCH; 新的匹配查找。; 已經(jīng)到了字典字符串的最后。UNMATCH_INSERT:; 字典中的下一個(gè)單詞比輸入查詢的單詞"小",將在這個(gè)單詞前面插入新單詞。; 將DICTIONARYSI-CX后面的單詞向后移動(dòng)WORD_LENGTH字節(jié),為新的單詞空出。; 最后修改串的長(zhǎng)度。MOVAX,SISUBAX,CXSUBBX,CXMOVDH,DICTIONARY0; 獲得串長(zhǎng)度。MOVDL,DICTIONARY1MOVSI,DX; 從最后一個(gè)字符開始,向后移動(dòng)字典字符串。
15、RIGHT_MOVE:DECSIMOVDL,DICTIONARYSIADDSI,WORD PTR WORD_LENGTHINCSIMOVDICTIONARYSI,DLSUBSI,WORD PTR WORD_LENGTHDECSICMPSI,AXJNERIGHT_MOVEMOVSI,AXMOVCX,WORD PTR WORD_LENGTH; 在新的位置插入新單詞。INSERT:MOVDL,BXMOVDICTIONARYSI,DLINCBXINCSILOOPINSERT; 在新添加的單詞后面補(bǔ)充一個(gè)空格。MOVDICTIONARYSI,CHAR_SPACE; 修改字符串長(zhǎng)度。MOVDH,DICTI
16、ONARY0MOVDL,DICTIONARY1ADDDX,WORD PTR WORD_LENGTHMOVDICTIONARY0,DHMOVDICTIONARY1,DLSHOW_NEWINSERT:; 顯示插入新單詞的位置和新的字符串。MOVDX,OFFSET MSG_NEWLINEMOVAH,09HINT21HMOVDX,OFFSET MSG_NOTFOUNDMOVAH,09HINT21HJMPSHOW_DICTINSERT_LAST:; 在字典字符串的最后面插入新單詞。SUBBX,CXDECSIMOVCX,WORD PTR WORD_LENGTHINSERTWORD:MOVDL,BXMOVD
17、ICTIONARYSI,DLINCBXINCSILOOPINSERTWORD; 在新添加的單詞后面補(bǔ)充一個(gè)空格。MOVDICTIONARYSI,CHAR_SPACE; 修改字符串長(zhǎng)度。MOVDH,DICTIONARY0MOVDL,DICTIONARY1ADDDX,WORD PTR WORD_LENGTHMOVDICTIONARY0,DHMOVDICTIONARY1,DLJMPSHOW_NEWINSERTFOUND:; 如果新的單詞和字典中的某一個(gè)單詞前面部分相同,; 新單詞為: and ,字典里的單詞為 an,則將新單詞插入到 an 的后面。MOVDX,WORD PTR WORD_LENGTH
18、DECDXCMPCX,DXJEMATCH_NEXT JMP UNMATCH_NEXT; 顯示找到的該單詞在字典字符串中的位置。MATCH_NEXT:MOVDX,OFFSET MSG_POSITIONMOVAH,09HINT21HSUBSI,WORD PTR WORD_LENGTHCALLBINIDECMOV DX,OFFSET MSG_FOUNDMOV AH,09HINT 21HMOVCX,WORD PTR WORD_LENGTH; CX 用于循環(huán)輸出匹配單元的信息計(jì)數(shù)器。SUBBX,WORD PTR WORD_LENGTH; 循環(huán) 7 次,輸出數(shù)據(jù)表中的信息。SHOW:INCBXMOVDL,
19、BXMOV AH,02HINT21HLOOPSHOWJMPQUITSHOW_DICT:; 顯示新插入的單詞在字典字符串中的位置。MOVDX,OFFSET MSG_POSITIONMOVAH,09HINT21HSUBSI,WORD PTR WORD_LENGTHDECSICALLBINIDEC; 顯示新的字典字符串長(zhǎng)度。MOVDX,OFFSET MSG_DICTLENGTHMOVAH,09HINT21HMOVDH,DICTIONARY0MOVDL,DICTIONARY1SUBDX,02HMOVSI,DXCALLBINIDEC; 循環(huán)輸出,顯示新的字典字符串。MOVDX,OFFSET MSG_NE
20、WDICTMOVAH,09HINT21HMOVCH,DICTIONARY0MOVCL,DICTIONARY1MOVSI,02HRT:MOVDL,DICTIONARYSIINCSIMOVAH,02HINT21HLOOPRTQUIT:MOVAH,4CH; Return to DOS.INT21H; BINIDEC 子程序,將 SI 寄存器中的數(shù)據(jù)轉(zhuǎn)化為十進(jìn)制數(shù)字輸出在屏幕上。BINIDECPROCNEARMOVCX,100DCALLDEC_DIVMOVCX,10DCALLDEC_DIVMOVCX,1DCALLDEC_DIVRETDEC_DIVPROCNEARMOVAX,SIMOVDX,0DIVCX
21、MOVSI,DXMOVDL,ALADDDL,30HMOVAH,2HINT21HRETDEC_DIVENDPBINIDECENDPCODE ENDSEND START運(yùn)行結(jié)果:實(shí)驗(yàn)三:源代碼:STACK SEGMENT PARA 'STACK' DB 64 DUP('STACK.')STACK ENDSDSEG SEGMENT PARA 'DATA'TABLE DW 440;對(duì)應(yīng)6音調(diào) DW 494;對(duì)應(yīng)7音調(diào) DW 524;對(duì)應(yīng)1音調(diào) DW 588;對(duì)應(yīng)2音調(diào) DW 660;對(duì)應(yīng)3音調(diào) DW 698;對(duì)應(yīng)4音調(diào) DW 784;對(duì)應(yīng)5音調(diào) DW 8
22、80;對(duì)應(yīng)6音調(diào) DW 988;對(duì)應(yīng)7音調(diào) DW 1048;對(duì)應(yīng)i音調(diào)DSEG ENDSCSEG SEGMENT PARA 'CODE'ASSUME CS:CSEG,DS:DSEG,SS:STACKMAIN PROC FAR MOV AX,DSEG MOV DS,AXNEW_NOTE: MOV AH,0;讀出鍵盤輸入 INT 16H CMP AL,'.'當(dāng)輸入為“,”時(shí)程序運(yùn)行結(jié)束 JE EXIT MOV BX,OFFSET TABLE;得到TABLE的首地址 CMP AL,'1'判斷是否為18 JB DOWN CMP AL,'8'
23、; JA DOWN AND AX,0FH;ax的高4位清零 SHL AX,1;ax乘以2 SUB AX,2;轉(zhuǎn)換ASCLL碼 MOV SI,AX ADD SI,4NEXT: MOV DI,BXSI MOV BX,10;等待0.1秒 CALL SOUNDF;執(zhí)行子程序SOUNDF JMP NEW_NOTEDOWN: CMP AL,'0' JE DOWN1 CMP AL,'9' JE DOWN2 JMP NEW_NOTE;當(dāng)輸入的數(shù)不為09時(shí)重新輸入DOWN1: MOV SI,2 JMP NEXTDOWN2: MOV SI,0 JMP NEXT EXIT: MOV AX,4C00H;退出程序 INT 21HMAIN ENDPWAIT
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度老房子二手房買賣中介服務(wù)協(xié)議
- 二零二五年度精密儀器吊裝作業(yè)安全協(xié)議
- 2025年度石灰行業(yè)安全生產(chǎn)風(fēng)險(xiǎn)管控合同
- 二零二五年度安全生產(chǎn)免責(zé)協(xié)議書模板
- 2025年度海外人文與社會(huì)科學(xué)留學(xué)合同
- 二零二五年度集體勞動(dòng)合同在文化創(chuàng)意產(chǎn)業(yè)中的實(shí)踐
- 二零二五年度公司員工綠色環(huán)保項(xiàng)目借款協(xié)議
- 二零二五年度租賃地產(chǎn)租賃合同終止條件合同
- 2025年度股票代持業(yè)務(wù)合作協(xié)議書
- 二零二五年度旅游度假區(qū)物業(yè)管理權(quán)交接書
- 氣管鏡進(jìn)修個(gè)人總結(jié)
- 酸堿平衡和酸堿平衡紊亂課件
- 有限空間作業(yè)專項(xiàng)施工方案
- 電力安全生產(chǎn)“十項(xiàng)嚴(yán)禁”【系列漫畫】
- 升壓站設(shè)備安裝調(diào)試工程施工質(zhì)量驗(yàn)收及評(píng)定范圍劃分表
- Unit 2 My family Part A Let's talk(教學(xué)設(shè)計(jì))人教PEP版英語(yǔ)三年級(jí)下冊(cè)
- 輔酶Q10-課件-課件
- 道德與法治賽課一等獎(jiǎng):《有多少浪費(fèi)可以避免(第一課時(shí))》教學(xué)課件(四下)
- 好習(xí)慣成就好人生
- NB∕T 10209-2019 風(fēng)電場(chǎng)工程道路設(shè)計(jì)規(guī)范
- GB/T 34440-2017硬質(zhì)聚氯乙烯地板
評(píng)論
0/150
提交評(píng)論