[詳細講解]匯編語言 完全數(shù) 課程設計報告書
《[詳細講解]匯編語言 完全數(shù) 課程設計報告書》由會員分享,可在線閱讀,更多相關《[詳細講解]匯編語言 完全數(shù) 課程設計報告書(12頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 課程設計任務書 學生姓名 王 麗 專業(yè)班級 軟件0302班 指導老師 陳天祥 工作單位 武漢理工大學 題 目:打印完全數(shù) 一個數(shù),若約數(shù)(不含它本身)的和恰好等于它本身就稱為完全數(shù) 初始條件: 理論:學完匯編課程,掌握匯編語言的使用。 實踐:計算機實驗室提供計算機及軟件環(huán)境。如果自己有計算機可以在其上進行設計。 要求完成的主要任務: 1. 本次課程設計著重于理論設計,同時培養(yǎng)動手能力。要求運用自己所學知識進行設計實現(xiàn),體現(xiàn)自己的知識掌握水
2、平。所作設計需進行論證,一方面是從理論上進行推理驗證,另一方面是實驗論證。 2. 閱讀有關的參考資料,熟悉開發(fā)工具,運用軟件工程設計方法,進行系統(tǒng)總體分析與設計, 規(guī)劃出系統(tǒng)的總體機構(gòu),每個功能的分布情況,以形成系統(tǒng)的框架設計。 3. 程序用匯編語言開發(fā)完成, 嚴禁抄襲(發(fā)現(xiàn)后抄襲者和被抄襲者一律不及格)。 4.完成整個程序的設計及調(diào)試、測試工作后,應提供相應的課程設計報告書及程序總體分析與算法設計和源程序代碼等。 5.課程設計報告書內(nèi)容:(1) 設計題目 (2) 設計要求 (3) 設計思路及程序清單 (5) 運行結(jié)果 (6) 心得體會 6.要求按格式規(guī)范撰寫課程設計報告文檔, 文檔
3、中包括系統(tǒng)結(jié)構(gòu)圖,代碼設計說明以及各功能模塊程序的設計說明和各功能選項的使用要求及條件,各輸入輸出數(shù)據(jù)的約束條件及代碼的使用等。 7.課程設計報告格式應盡可能規(guī)范,易讀易懂,說明問題;學生自己排版、打印全部課程設計報告書內(nèi)容;學生要按指定時間上交課程設計報告書。 時間安排: 1、12月26日至12月27日 接受課程設計, 閱讀有關的參考資料,熟悉開發(fā)工具,運用軟件工程設計方法,對設計題目進行總體分析與算法設計。. 2、12月28日至12月29日 編寫程序, 到實驗室進行程序調(diào)試。 3、12月30日至12月31日 繼續(xù)到實驗室進行程序調(diào)試、完善。撰寫課程設計報告書,到實驗室進行編
4、緝排版, 交課程設計報告書。 指導教師簽名: 年 月 日 系主任(或責任教師)簽名: 年 月 日 1. 設計題目 打印完全數(shù) 2. 設計要求 用匯編程序MASM,編寫一個程序,打印10000以內(nèi)的完全數(shù)。若一個數(shù)的約數(shù)(不含它本身)的和恰好等于它本身,則該數(shù)是完全數(shù)。用循環(huán)除法(除數(shù)從2到被檢測數(shù))循環(huán)判斷2――10000的數(shù)是否是完全數(shù)。 根據(jù)題目,運用所學的匯編知識和程序設計知識,完善設計思路,盡量使程序完整,具有模塊化,易懂;熟悉匯編程序環(huán)境,掌握匯編命令和匯編語言,增強動
5、手能力;增強獨立解決問題的能力。 3. 設計思路 3.1原始條件及參數(shù): 被除數(shù)以雙字為單位,高16位保存在DX中,低16位保存在AX中,初始值為2; 檢測范圍用n 來限定 除數(shù)以字位單位,用count表示,保存在BX中,初始值為2 約數(shù)和保存在CX中,初始值為1 3.2算法設計及流程圖: 3.2.1 主程序算法及流程圖: 初始條件:設i為被除數(shù),j為除數(shù),t為余數(shù),c為約數(shù)和 Int i=2 ; //被除數(shù)從2開始 循環(huán)體:While (i<=10000) //求10000以內(nèi)的完全數(shù) { int j=
6、2 , c=1; //除數(shù)從2開始,約數(shù)和初始為1 While ( j<=i ) //除數(shù)小于被除數(shù) { t = i mod j ; //求模 If ( t==0) { c=j+c;} //如果能夠整除,保存約數(shù)和 j++ ;} //除數(shù)自增 if (c==i) print i ; //打印完數(shù) i++ ; }
7、 //被除數(shù)自增 退出:Exit 開始 2—>n 1—>cx , 2—>count n—>ax , 0—>dx ax/bx—>dx, bx==ax Print i cx=ax dx=0 cx+bx—>cx , Inc count N N N 結(jié)束 Inc n n ==10000 3.2.2 print子程序算法及流程圖 初始條件:被除數(shù)保存在AX中,將除數(shù)設置為10 將BX,CX壓入堆棧,保護現(xiàn)場 循 環(huán) 體:被除數(shù)除以10, 將余數(shù)壓入堆棧,堆棧中數(shù)目加1 繼續(xù)除以10
8、,直到被除數(shù)不可以再除 彈出堆棧中的內(nèi)容 退 出:Exit 初始值:n—>ax 將bx,cx壓入堆棧,保存數(shù)據(jù) 0ah—>cx,0—>dx 0—>dx div cx 將dx 壓入堆棧 bx +1—>bx cmp ax,0 ax==0 dx以ASCII碼形式輸出 結(jié)束 N Y 4. 程序清單 data segment n dw 10000 ;求10000以內(nèi)的完數(shù) count dw ? ;作為除數(shù) data ends code segme
9、nt assume cs:code,ds:data start: mov ax,data mov ds,ax mov n,2 ;從2開始判斷是否視完數(shù) l1: mov count,2 ;cx保留約數(shù)和,初始值為1 mov cx,1 ;bx作為除數(shù),從2開始 l2: mov ax,n push ax ;保存現(xiàn)場,保留a
10、x的值 mov dx,0 ;被除數(shù)的高16位置0 div bx cmp dx,0 jnz l3 ;dx保存余數(shù),若余數(shù)不為0,則轉(zhuǎn)向l3,繼續(xù)除下一個除數(shù) add cx,bx ;若余數(shù)為0,則把除數(shù)相加 l3: inc count ;除數(shù)加1 pop ax ;a
11、x出棧 cmp ax,count jnz l2 ;比較被除數(shù)和除數(shù),若相等,則轉(zhuǎn)向l2, cmp n,cx jnz l4 ;比較約數(shù)和與被除數(shù)是否相等,若相等,轉(zhuǎn)向l4,測試下一個數(shù) mov dx,0 mov ax,n call print ;調(diào)用子程序,打印完數(shù),每顯示一個完數(shù),緊跟一個空格 mo
12、v dl,' ' mov ah,02h int 21h l4: inc n ;測試2――10000的完數(shù) cmp n,10000 jnz l1 mov ah,4ch int 21h print proc ;打印子程序 push cx ;保護現(xiàn)場 push bx mov cx,0ah ;cx作除數(shù),
13、以10為基數(shù) mov bx,0 ;bx作計數(shù)器,計算壓入堆棧的完數(shù)個數(shù) print_l1: mov dx,0 div cx push dx ;將余數(shù)壓入堆棧保留 inc bx ;壓入數(shù)目增加1 cmp ax,0 jnz print_l1 ;反復調(diào)用print_11,直到被除數(shù)不能
14、再除 print_l2: pop dx ;循環(huán)彈出余數(shù) add dl,30h ;余數(shù)以ASCII碼的表示 mov ah,02h int 21h ;輸出調(diào)用 dec bx ;堆棧中數(shù)的個數(shù)減1 jnz print_l2 ;彈出堆棧中所有的數(shù) pop bx
15、 ;還原現(xiàn)場 pop cx ret print endp ;子程序結(jié)束 code ends end start ;程序結(jié)束 5. 運行結(jié)果 該程序是:查找10000以內(nèi)的完全數(shù),文件名為wanshu.asm,執(zhí)行結(jié)果如下: 6. 心得體會 在程序設計的過程中,我體會到了一些程序設計的基本方法和設計技巧,這些有助于拓寬我的解題思路,一定程度上幫助我解決設計上存在的問題。 在此過程中,除數(shù),
16、被除數(shù),約數(shù)和的初始值的定義至關重要。由于本程序要反復除以除數(shù),并把余數(shù)與0比較,把約數(shù)進行相加,因此應該盡量控制程序作除法運算的次數(shù),達到最快的運行速度。在此程序中,我把除數(shù)的初始值設置為2,約數(shù)和的初始值設置為1,避免了被除數(shù)屢次除以1以及約數(shù)屢次從1開始相加。每測試一個數(shù)字,除數(shù)都從2開始,循環(huán)除,直至達到被除數(shù)本身(根據(jù)題目要求,除數(shù)達到”被除數(shù)/2”即可滿足循環(huán)條件)。這影響了程序的運行速度,是這個程序的一個缺陷。 編寫程序要注意格式的規(guī)范性。在此過程中,我的程序出現(xiàn)了前后不對應的情況,系統(tǒng)提示程序沒有結(jié)束,經(jīng)過檢查才發(fā)現(xiàn),最后缺少一個結(jié)束語句。匯編的每一段都應該有開始和結(jié)束的
17、標志;同時,使用匯編的語句時要注意簡潔和清晰,當一種操作可以用不同的語句表示時(如loop 相當于dec 和jnz兩個語句的組合),要比較不同代碼的優(yōu)缺點,被選擇使用的語句應該能表現(xiàn)程序的結(jié)構(gòu)性。 由于要求打印10000以內(nèi)的完數(shù),理論上除數(shù)至少應該到達5000,用8位二進制表示此數(shù)是遠遠不夠的。但如果除數(shù)用16位表示,被除數(shù)將占用32位。受到機器及運行環(huán)境的限制,無法使用386以上機型中的EBX,EAX,ECX,EDX等寄存器,因此,我采用DX,AX分別保存被除數(shù)的高16位和低16位,對于除法運算的結(jié)果,使用系統(tǒng)默認處理。商保存在AX中,余數(shù)保存在DX中;同時,利用累加器CX的特殊功能
18、,用其保存約數(shù)和,以方便計算。 在編寫程序的過程中,我明顯的感覺到寄存器不夠用。因此,我利用堆棧保護現(xiàn)場,保存相關的數(shù)據(jù)。雖然入棧,出棧的操作頻繁,可能會一定程度上延緩了程序的執(zhí)行速度,但它解決了寄存器數(shù)量上的限制。另外,由于除法計算的余數(shù)和商分別保存到DX和AX中,而AX在后續(xù)的程序中要使用到,因此要著重注意對AX的數(shù)據(jù)保存。 AX既要用來存放被除數(shù),也需要存放除法所得的商,因此,我設置了變量n,通過”mov ax, n ” 語句可以把待檢測的數(shù)在需要時臨時送入AX,沖掉AX內(nèi)原來的值。另外,我還設置了變量count,用寄存器BX保存除數(shù),利用count的自增來實現(xiàn)除數(shù)的改變,
19、通過 ” mov bx, count “語句把除數(shù)送入BX。變量與堆棧聯(lián)合使用,可以方便的改變和保存所需要的數(shù)據(jù),使程序簡單易懂。 在程序編譯的過程中,遇到了一些令我措手不及的錯誤.由于初次遇到此類問題,我花費了大量的時間閱讀代碼,瀏覽程序,并查找課本和資料,找出指令的差別尤其是中斷指令部分的差別. 6.2.1 結(jié)束命令錯誤 最初的編譯,遇到該問題,仔細檢查源代碼,才發(fā)現(xiàn)l4段的退出部分出現(xiàn)問題.我將顯示命令 ” mov ah, 09h int 21h ” 誤當作結(jié)束命令.改為 ” mov ah, 4ch int 21h “ 后,順利結(jié)束了該程序,也
20、解決了運行時出現(xiàn)的該問題。 6.2.2 除數(shù)溢出錯誤 除數(shù)溢出問題是本次課程設計中我遇到的最困難的問題. 開始時我把除數(shù)定義在2——“被除數(shù)/2” 方案一:“被除數(shù)/2”用右移一位AX實現(xiàn) 當AX中為1時,右移一位則AX為0,除數(shù)為0 , 出現(xiàn)邏輯錯誤;當AX為奇數(shù)時,右移一位則結(jié)果不精確,運行結(jié)果同樣出現(xiàn)錯誤. 方案二:“被除數(shù)/2”用除2的除法實現(xiàn) 由于程序由兩層循環(huán)嵌套組成,又調(diào)用了一個輸出完全數(shù)的子程序,寄存器在各段中使用頻繁,數(shù)據(jù)的保存和恢復頻繁,容易破壞程序的條理性.而增加一次除法大大增加了寄存器的負荷,因此該方案也不是一種好的方案. 于是,我把除數(shù)定義在2——
21、被除數(shù)的范圍內(nèi),解決了除數(shù)溢出的問題和寄存器的限制,但同時也給程序的計算增加了“被除數(shù)/2”的復雜度。 我設計和編寫的程序完成了題目的要求,可以查找出任意正數(shù)范圍內(nèi)的完全數(shù),但它存在兩個不足: 第一: 現(xiàn)在的程序,如果要修改完全數(shù)的查找范圍,就必須在源程序中改動,重新定義n的值.但如果在程序之初給出提示,讓用戶輸入所要查找的范圍,并把該數(shù)賦值給n,從而通過n重新定義被除數(shù)就更完善了. 第二: 考慮到寄存器數(shù)量上的限制和程序的可讀性和條理性的要求,我擴大了除數(shù)的范圍,使除數(shù)不再溢出.但這在一定程度上延遲了程序的執(zhí)行速度.如果能找出協(xié)調(diào)這二者的方法,程序就更完善了. 在本次
22、的課程設計過程中,我最大的收獲就是學到了不少新的知識,同時可以把自己學到的匯編語言的知識和以前學的程序設計的知識應用到實踐中, 熟悉了開發(fā)環(huán)境 ,提高了自己的動手能力, 并順利地完成了此次的任務.課程設計讓我從中得到莫大的信心,鼓勵,快樂和成就感. 編程過程中,我遇到了一些困難.這時,我通過上網(wǎng)查詢和去圖書館查找資料解決問題,有效地利用網(wǎng)絡資源和學校圖書資源,同時也了解了更多的知識獲取的途徑,擴大了自己的知識面. 遇到問題時,多數(shù)情況下我是自己獨立解決的,這鍛煉我獨立思考問題和獨立解決問題的能力;如果自己通過查找資料無法解決,我就向老師和同學尋求幫助,不但學到了新的,更完善解決問題的方法,
23、還學會了與人溝通,與人交流.我認識到有時候,其他人的一點提示,就會令自己茅塞頓開,得到靈感.因此,在作課程設計時,不要吝惜自己的思路和想法,盡可能多的與大家的交流.許多時候,我們都能從中得到進步,得到提示,甚至得到更好的方案. 同時,我也發(fā)現(xiàn)了自己的一些問題.例如,編寫程序不夠規(guī)范,總是在出現(xiàn)問題時,才意識到格式和編程習慣的重要性,然后手忙腳亂的去修改,給自己的自信和成就感帶來很大的挑戰(zhàn).另外,為了圖方便,我把在實驗室和寢室修改過的程序直接運行,結(jié)果卻不能導入MASM環(huán)境,不能出現(xiàn)編譯,連接和運行的結(jié)果,經(jīng)過同學的提示,我才知道在進行程序的編譯前,要將程序在EDIT下打開.由此,我意識到,許多工作都像這樣,要一步一步的來,不能耍小聰明,圖省事. 本次課程設計,對我?guī)椭艽?它提高了我的理論知識和和實踐動手能力;提高了我獨立思考問題和解決問題的能力;同時,增強了我與人探討問題,交流思路的意識;此外,它還讓我發(fā)現(xiàn)了自己在編程習慣上的許多不足,對以后的編寫程序和設計解題思路有很大的啟發(fā). 在以后的學習和實踐中,我會不斷督促自己,不斷提高,不斷進步.
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- C語言課件第十三章
- 三年級數(shù)學上冊-3-測量第4課時-千米的認識(2)課件-新人教版
- 三年級下冊課件用估算解決問題人教版
- 細胞的能量轉(zhuǎn)換──線粒體和葉綠體課件
- 施耐德培訓ModiconM340串行通訊課件
- 《余角和補角》課件-(高效課堂)獲獎-人教數(shù)學2022--
- 余光中《鄉(xiāng)愁》課件
- 一元二次方程 (2)(教育精品)
- 八年級語文下冊-第2單元-情鑄詩魂-5《大堰河——我的保姆》作業(yè)課件-(新版)語文版
- 小學英語五年級上冊-(牛津譯林版)--Unit-6-My-e-friend-Story-time公開課ppt課件
- 譯林牛津一年級下Unit5-What's-this第三課時課件
- 第十八章第3節(jié) 測量小燈泡的電功率
- 第十五講 山地的形成 課件34
- 人教部編版語文一年級上冊《識字2-金木水火土》教學課件小學優(yōu)秀公開課
- 八年級語文上冊現(xiàn)代文閱讀教學課件:說明文閱讀-考點十三---辨別說明方法及其作用-答題模板及模板示例(共44