匯編課程設(shè)計(jì)-約瑟夫環(huán)程序設(shè)計(jì).doc_第1頁(yè)
匯編課程設(shè)計(jì)-約瑟夫環(huán)程序設(shè)計(jì).doc_第2頁(yè)
匯編課程設(shè)計(jì)-約瑟夫環(huán)程序設(shè)計(jì).doc_第3頁(yè)
匯編課程設(shè)計(jì)-約瑟夫環(huán)程序設(shè)計(jì).doc_第4頁(yè)
匯編課程設(shè)計(jì)-約瑟夫環(huán)程序設(shè)計(jì).doc_第5頁(yè)
已閱讀5頁(yè),還剩16頁(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)介

此文檔收集于網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系網(wǎng)站刪除學(xué) 號(hào): 0120910340228匯編課程設(shè)計(jì)題 目約瑟夫環(huán)程序設(shè)計(jì)學(xué) 院計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院專(zhuān) 業(yè)計(jì)算機(jī)科學(xué)與技術(shù)專(zhuān)業(yè)班 級(jí)計(jì)算機(jī)科學(xué)與技術(shù)0902班姓 名 XX指導(dǎo)教師 XX2011年12月30日課程設(shè)計(jì)任務(wù)書(shū)學(xué)生姓名: XX 專(zhuān)業(yè)班級(jí) XX 指導(dǎo)教師: XX 工作單位:計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 _題目: 約瑟夫環(huán)程序設(shè)計(jì)初始條件:理論:完成了匯編語(yǔ)言程序設(shè)計(jì)課程,對(duì)微機(jī)系統(tǒng)結(jié)構(gòu)和80系列指令系統(tǒng)有了較深入的理解,已掌握了匯編語(yǔ)言程序設(shè)計(jì)的基本方法和技巧。實(shí)踐:完成了匯編語(yǔ)言程序設(shè)計(jì)的4個(gè)實(shí)驗(yàn),熟悉了匯編語(yǔ)言程序的設(shè)計(jì)環(huán)境并掌握了匯編語(yǔ)言程序的調(diào)試方法。要求完成的主要任務(wù): (包括課程設(shè)計(jì)工作量及其技術(shù)要求,以及說(shuō)明書(shū)撰寫(xiě)等具體要求)進(jìn)一步理解和掌握較復(fù)雜程序的設(shè)計(jì)方法,掌握子程序結(jié)構(gòu)的設(shè)計(jì)和友好用戶界面的設(shè)計(jì)。具體的設(shè)計(jì)任務(wù)及要求:1) 有 n個(gè)人圍成一圈,他們的編號(hào)為1到n。第一個(gè)人從1開(kāi)始順序報(bào)數(shù),凡報(bào)到m時(shí),該人退出圈子。其后的人再?gòu)?開(kāi)始順序報(bào)數(shù),直到最后的一個(gè)人退出圈子為止。輸出依次退出圈子人的序號(hào)。n和m的值從鍵盤(pán)輸入,且均小于200。2) 程序采用子程序結(jié)構(gòu),結(jié)構(gòu)清晰;3) 友好清晰的用戶界面,能識(shí)別輸入錯(cuò)誤并控制錯(cuò)誤的修改。在完成設(shè)計(jì)任務(wù)后,按要求撰寫(xiě)課程設(shè)計(jì)說(shuō)明書(shū);對(duì)課程設(shè)計(jì)說(shuō)明書(shū)的具體要求請(qǐng)見(jiàn)課程設(shè)計(jì)指導(dǎo)書(shū)。閱讀資料:1)IBMPC匯編語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)教程實(shí)驗(yàn)2.42)IBMPC匯編語(yǔ)言程序設(shè)計(jì)(第2版)例6.11時(shí)間安排:設(shè)計(jì)安排一周:周1、周2:完成系統(tǒng)分析及設(shè)計(jì)。周3、周4:完成程序調(diào)試,和驗(yàn)收。周5:撰寫(xiě)課程設(shè)計(jì)報(bào)告。指導(dǎo)教師簽名: 年 月 日系主任(或責(zé)任教師)簽名: 年 月 日目 錄1.需求說(shuō)明 42.設(shè)計(jì)說(shuō)明 4 2.1 簡(jiǎn)要分析 4 2.2 概要設(shè)計(jì) 4 2.2.1 主要模塊 4 2.2.2 主函數(shù)結(jié)構(gòu).73.算法描述. 8 3.1 算法描述. 8 3.2 流程框圖 94.源程序與執(zhí)行結(jié)果 10 4.1 源程序 10 4.2 執(zhí)行結(jié)果15 4.2.1 測(cè)試方法15 4.2.2 測(cè)試結(jié)果.15 4.3 調(diào)試結(jié)果 185.使用說(shuō)明.196.總結(jié)20約瑟夫環(huán)程序設(shè)計(jì)1.需求說(shuō)明4) 有 n個(gè)人圍成一圈,他們的編號(hào)為1到n。第一個(gè)人從1開(kāi)始順序報(bào)數(shù),凡報(bào)到m時(shí),該人退出圈子。其后的人再?gòu)?開(kāi)始順序報(bào)數(shù),直到最后的一個(gè)人退出圈子為止。輸出依次退出圈子人的序號(hào)。n和m的值從鍵盤(pán)輸入,且均小于200。5) 程序采用子程序結(jié)構(gòu),結(jié)構(gòu)清晰;6) 友好清晰的用戶界面,能識(shí)別輸入錯(cuò)誤并控制錯(cuò)誤的修改。2.設(shè)計(jì)說(shuō)明2.1 簡(jiǎn)要分析 要正確、友好地完成用匯編語(yǔ)言設(shè)計(jì)約瑟夫環(huán),我們應(yīng)該完成以下幾個(gè)功能:(1) 相關(guān)的交互提示用語(yǔ)(2) 定義的數(shù)據(jù)段中包含0-200(3) 編號(hào)數(shù)n的輸入(4) 標(biāo)志數(shù)m的輸入(5) 輸入設(shè)置為只允許輸入三位數(shù)字,其余均不顯示(6) 顯示的結(jié)果是所有的退出序列,并使用箭標(biāo)連接2.2 概要設(shè)計(jì)2.2.1 主要模塊(1)變量的定義DATA SEGMENT TABLE LABEL WORD COUNT = 1 REPT 200 DW COUNT COUNT = COUNT + 1 ENDM PRINT1 DB Please input the number of the people(less than 200):$PRINT2 DB Please the flag:$ MESS DB -$ DATA ENDS(2)編號(hào)數(shù)n輸入的處理n1:MOV AH,07H INT 21H CMP AL,0 JB n1 CMP AL,9 JA n1 MOV DL,AL MOV AH,02H INT 21H MOV AH,0 SUB AL,30H MOV CX,AX MOV BX,CX n2:MOV AH,07H INT 21H CMP AL,0 JB n2 CMP AL,9 JA n2 MOV DL,AL MOV AH,02H INT 21H MOV AH,0 SUB AL,30H MOV DX,10 MUL DX MOV CX,AX MOV AX,BX MOV BX,100 MUL BX ADD CX,AX n3:MOV AH,07H INT 21H CMP AL,0 JB n3 CMP AL,9 JA n3 MOV DL,AL MOV AH,02H INT 21H MOV AH,0 SUB AL,30H MOV DX,AX ADD CX,DX PUSH CX MOV AX,CX MOV CX,2 MUL CX MOV BP,AX MOV AX,SI+BP MOV AX,0FFH MOV SI+BP,AX CALL CTRL LEA DX,PRINT2 MOV AH,09H INT 21H CALL CTRL (3)標(biāo)志數(shù)m的輸入處理n4:MOV AH,07H INT 21H CMP AL,0JB n4CMP AL,9JA n4MOV DL,ALMOV AH,02HINT 21HMOV AH,0 SUB AL,30H MOV CX,AX MOV BX,CX n5:MOV AH,07H INT 21HCMP AL,0JB n5CMP AL,9JA n5MOV DL,ALMOV AH,02HINT 21H MOV AH,0 SUB AL,30H MOV DX,10MUL DXMOV CX,AXMOV AX,BX MOV BX,100 MUL BX ADD CX,AX n6:MOV AH,07HINT 21HCMP AL,0JB n6CMP AL,9JA n6MOV DL,ALMOV AH,02HINT 21HMOV AH,0SUB AL,30HMOV DX,AXADD CX,DX MOV DI,CX 2.2.2 主函數(shù)結(jié)構(gòu)START: MOV AX,DATA MOV DS,AX LEA SI,TABLE MOV BX,0 MOV DX,0; CALL PRINT 3.算法描述【求解思路】我們知道第一個(gè)人(編號(hào)一定是m%n-1) 出列之后,剩下的n-1個(gè)人組成了一個(gè)新的約瑟夫環(huán)(以編號(hào)為k=m%n的人開(kāi)始):k k+1 k+2 . n-2, n-1, 0, 1, 2, . k-2并且從k開(kāi)始報(bào)0。現(xiàn)在我們把他們的編號(hào)做一下轉(zhuǎn)換:k - 0k+1 - 1k+2 - 2.k-2 - n-2k-1 - n-1變換后就完完全全成為了(n-1)個(gè)人報(bào)數(shù)的子問(wèn)題.假如我們知道這個(gè)子問(wèn)題的解:例如x是最終的勝利者,那么根據(jù)上面這個(gè)表把這個(gè)x變回去不剛好就是n個(gè)人情況的解嗎?!變回去的公式很簡(jiǎn)單,可以推出來(lái)為:x =(x+k)%n如何知道(n-1)個(gè)人報(bào)數(shù)的問(wèn)題的解?對(duì),只要知道(n-2)個(gè)人的解就行了。(n-2)個(gè)人的解呢?當(dāng)然是先求(n-3)的情況 - 這顯然就是一個(gè)倒推問(wèn)題!下面寫(xiě)遞推公式:令fi表示i個(gè)人玩游戲報(bào)m退出最后勝利者的編號(hào),最后的結(jié)果自然是fnf1=0;fi=(fi-1+m)%i; (i1)有了這個(gè)公式,我們要做的就是從1-n順序算出fi的數(shù)值,最后結(jié)果是fn。因?yàn)閷?shí)際生活中編號(hào)總是從1開(kāi)始,我們輸出fn+1由于是逐級(jí)遞推,不需要保存每個(gè)fi,程序也是異常簡(jiǎn)單:翻譯成C語(yǔ)言如下代碼所示int main() int n, m, i, s=0; scanf(%d%d, &n, &m); for (i=2; i $ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA SI,TABLE ;SI指向首地址,BX作為移動(dòng)指針 MOV BX,0 MOV DX,0 ;DX作為計(jì)數(shù)器 CALL PRINT ;執(zhí)行該子程序后返回輸入的編號(hào)數(shù)和標(biāo)志值,分別為CX和DIL0:MOV AX,0 L1:MOV AX,SI+BX ;依次取出TABLE中的數(shù)據(jù) CMP AX,0 JZ L2 ;AX等于0的時(shí)候跳轉(zhuǎn) CMP AX,0FFH JZ L3 ;AX等于201的時(shí)候跳轉(zhuǎn) ADD DX,1 ;計(jì)數(shù)器加1 CMP DX,DI ;比較與標(biāo)志值是否一致 JZ L4 ;一致則跳轉(zhuǎn)L2:ADD BX,2 ;取下一個(gè)數(shù)據(jù) JMP L1 L3:MOV BX,0 ;重置 JMP L1 L4:MOV AX,SI+BX ;取出數(shù)值 CALL OUTDEC MOV AX,0 MOV SI+BX,AX MOV DX,0 LOOP L0 MOV AH,4CH INT 21H OUTDEC PROC PUSH AX PUSH DX PUSH CX PUSH BX MOV CL,100 DIV CL ;AX=AX/100,AL保存商,AH保存余數(shù) MOV BL,AH MOV DL,AL OR DL,30H ;轉(zhuǎn)換成字符輸出 MOV AH,02H ;顯示輸出 DL=輸出字符 INT 21H MOV CL,10 MOV BH,0 MOV AX,BX DIV CL MOV DL,AL MOV BL,AH OR DL,30H MOV AH,02H ;顯示輸出 DL=輸出字符 INT 21H MOV DL,BL OR DL,30H MOV AH,02H ;顯示輸出 DL=輸出字符 INT 21H POP BX POP CX CMP CX,1 JZ L5 LEA DX,MESS ;顯示箭標(biāo) MOV AH,09H INT 21H L5:POP DX POP AX RET OUTDEC ENDP PRINT PROC PUSH AX PUSH DX PUSH BX LEA DX,PRINT1 MOV AH,09H ;顯示字符串 INT 21H CALL CTRL n1:MOV AH,07H ;輸入編號(hào)數(shù)n不回顯 INT 21H CMP AL,0 ;每次輸入均驗(yàn)證是否為0-9,否則輸入無(wú)效 JB n1 CMP AL,9 JA n1 MOV DL,AL MOV AH,02H INT 21H MOV AH,0 SUB AL,30H ;轉(zhuǎn)換成實(shí)際數(shù)值 MOV CX,AX MOV BX,CX ;將最高位數(shù)值存入BX n2:MOV AH,07H INT 21H CMP AL,0 JB n2 CMP AL,9 JA n2 MOV DL,AL MOV AH,02H INT 21H MOV AH,0 SUB AL,30H ;轉(zhuǎn)換成實(shí)際數(shù)值 MOV DX,10 MUL DX MOV CX,AX MOV AX,BX ;將最高位數(shù)值存入AX MOV BX,100 MUL BX ;將最高位數(shù)乘以100,作為百位 ADD CX,AX ;把百位數(shù)存入CX n3:MOV AH,07H INT 21H CMP AL,0 JB n3 CMP AL,9 JA n3 MOV DL,AL MOV AH,02H INT 21H MOV AH,0 SUB AL,30H MOV DX,AX ADD CX,DX ;把個(gè)位數(shù)存入CX,并入棧保存 PUSH CX MOV AX,CX MOV CX,2 MUL CX ;計(jì)算在TABLE中所對(duì)應(yīng)的偏移字節(jié) MOV BP,AX MOV AX,SI+BP ;取出TABLE中對(duì)應(yīng)的數(shù)值 MOV AX,0FFH MOV SI+BP,AX CALL CTRL ;換行 LEA DX,PRINT2 MOV AH,09H ;顯示字符串 INT 21H CALL CTRL ;換行 n4:MOV AH,07H ;輸入標(biāo)志數(shù)m不回顯 INT 21H CMP AL,0 JB n4 CMP AL,9 JA n4 MOV DL,AL MOV AH,02H INT 21H MOV AH,0 SUB AL,30H ;轉(zhuǎn)換成實(shí)際數(shù)值 MOV CX,AX MOV BX,CX ;將最高位數(shù)值存入BX n5:MOV AH,07H INT 21H CMP AL,0 JB n5 CMP AL,9 JA n5 MOV DL,AL MOV AH,02H INT 21H MOV AH,0 SUB AL,30H ;轉(zhuǎn)換成實(shí)際數(shù)值 MOV DX,10 MUL DX MOV CX,AX MOV AX,BX ;將最高位數(shù)值存入AX MOV BX,100 MUL BX ;將最高位數(shù)乘以100,作為百位 ADD CX,AX ;把百位數(shù)存入CX n6:MOV AH,07H INT 21H CMP AL,0 JB n6 CMP AL,9 JA n6 MOV DL,AL MOV AH,02H INT 21H MOV AH,0 SUB AL,30H MOV DX,AX ADD CX,DX ;把個(gè)位數(shù)存入CX MOV DI,CX ;存入DI CALL CTRL POP CX POP BX POP DX POP AX RET PRINT ENDP CTRL PROC PUSH AX PUSH DX MOV AH,02H MOV DL,0AH ;打印換行符 INT 21H MOV DL,0DH ;打印回車(chē)符 INT 21H POP DX POP AX RET CTRL ENDP CODE ENDS END START 4.2 執(zhí)行結(jié)果4.2.1 測(cè)試方法 本次測(cè)試我們采用的是通過(guò)提示用語(yǔ),依次輸入編號(hào)數(shù)和標(biāo)志數(shù),都為三位數(shù),未滿100的數(shù)高位為0. 輸入的測(cè)試數(shù)據(jù)n與m均小于200,測(cè)試類(lèi)型3種 (1)nm 測(cè)試?yán)?n=100 m=10 (2) nm 測(cè)試?yán)?n=50 m=100(3)n=m 測(cè)試?yán)?n=100 m=100 (4) 大于200的錯(cuò)誤測(cè)試另外測(cè)試過(guò)程中嘗試輸入除數(shù)字以外的字符是無(wú)法顯示的,這點(diǎn)無(wú)法截圖顯示4.2.2 測(cè)試結(jié)果測(cè)試1測(cè)試2測(cè)試3 測(cè)試4錯(cuò)誤結(jié)果分析:數(shù)據(jù)段之定義到200,事實(shí)上可以擴(kuò)展定義到200-999如下圖所示:4.3調(diào)試結(jié)果 使用debug命令檢查程序的數(shù)據(jù)段是否出錯(cuò)5.使用說(shuō)明 本次課程設(shè)計(jì)使用第三方的匯編IDE-WinMasm配合MASM 5.0進(jìn)行實(shí)驗(yàn),IDE截圖如下:操作過(guò)程為:先編寫(xiě)源代碼保存為Joseph.asm,然后在IDE中新建工程,經(jīng)過(guò)編譯后在x86系統(tǒng)環(huán)境下運(yùn)行編譯的程序即可得出結(jié)果.6.總結(jié) 本次匯編語(yǔ)言課程設(shè)計(jì)是約瑟夫環(huán)的程序設(shè)計(jì),之前在C+語(yǔ)言以及數(shù)據(jù)結(jié)構(gòu)的課程中均有過(guò)了解,所以這次上手還算比較容易,但是中途也遇到了匯編程序特有的難題,那就是輸入的問(wèn)題。課程設(shè)計(jì)的要求是輸入兩個(gè)小于200的整數(shù),然而匯編語(yǔ)言中規(guī)定的中斷功能一次只能輸入一個(gè)字符,這與題目要求相悖甚遠(yuǎn),一時(shí)竟陷入了編程困惑中,最后經(jīng)過(guò)簡(jiǎn)單的思考發(fā)現(xiàn)只需要多次使用07H或01H中斷就可以完成這個(gè)

溫馨提示

  • 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)論