




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、計算機原理與匯編課程設計中南大學計算機原理與匯編語言課程設計報告題 目 匯編語言課程設計 學生姓名 指導教師 王磊 學 院 信息科學與工程 專業班級 信息安全1302 完成時間 2015/7/12 目錄第一章:反向輸出一個整數3一、需求分析3二、總體設計3三、詳細設計3四、調試分析6五、測試結果7六、總結7七、參考文獻7八、附錄8第二章:判斷年份是否是閏年10一、需求分析10二、總體設計10三、詳細設計10四、調試分析12五、測試結果12六、總結13七、參考文獻13八、附錄13第三章:輸出1000以內的素數17一、需求分析17二、總體設計17三、詳細設計17四、調試分析19五、測試結果20六、
2、總結20七、參考文獻20八、附錄2122計算機原理與匯編課程設計反向輸出一個整數第一章:反向輸出一個整數一、需求分析本實驗的功能是輸入一個整數,反向輸出,如輸入12345 輸出54321,但本實驗限定輸入整數最長的位數不超過10。如果想要實現10位以上整數的反向輸出,則需要修改程序的數據段定義。二、總體設計 提示輸入,輸入整數位數,輸入整數,定義用于輸入的函數input和用于輸出的循環函數output三、詳細設計1、兩個字符串用于輸入的提示,先輸入整數位數,再輸入整數: string1 db 'please the number of digit(less than 10):'
3、,13,10,'$' string2 db 13,10,'please input the digit:',13,10,'$' 用int 21h 進行輸出2、輸入的位數用作輸入整數時的循環次數3、定義用于輸入的函數 數據段定義: digit dw ?,?,?,?,?,?,?,?,?,? 這樣定義后最多存入10位mov cx,bx cx代表循環次數,可用戶輸入 lea si,digit ;si指向digit首地址input: mov ah,01h ;輸入 int 21h mov si,al ;將輸入的數存入數組 inc si ;si指向下一位 lo
4、op input 把輸入的整數存入digit中4、定義用于反向輸出的函數 output: mov dl,si mov ah,02h ;輸出 int 21h dec si ;si指向前一位 loop output5、整個程序順序執行 流程圖: 圖1-1 整體流程圖四、調試分析 在設計程序過程中,首先一個問題就是如何輸入一個多位的整數,因為用mov ah,01h,int 21h語句輸入時,只能輸入以為數字。在這個程序里相當于定義了一個數組來存放每一位數字。用數組也能方便反向輸出,但是最大的問題是尋址問題,實驗過程中出現了很多問題,所用尋址方式不當導致程序不能運行或者運行錯誤。 本實驗還可以進一步設
5、計,實現當輸入不當是提示出錯等功能五、測試結果 圖1-4 反向輸出測試結果六、總結本實驗總體來說比較簡單,只要輸入時存入數組,就可以方便地反向輸出,把一個整數分成每一位數字來實現。在這個過程中,我首先熟悉了循環體的使用,輸入輸出函數都是循環函數,用loop實現cx存儲循環次數。一個重點就是如何尋址。因為要把一個整數的每一位存入數組,那么存數和取數就是重點。這個實驗讓我加深了認識,也更熟練。不斷調試的過程中也可以熟練的用debug進行單步調試,觀察各個寄存器的變化??傮w來說,這個實驗讓我能夠簡單的熟悉匯編語言的編程過程,對他有了一些更加深刻的認識。也能夠簡單的看懂一些程序代碼,對我學習匯編有很大
6、的幫助。七、參考文獻【1】匯編語言程序設計第二版 沈美明 溫冬嬋【2】程序設計實驗指導 蔡啟先 王志文 黃曉璐八、附錄 源代碼:DATAS SEGMENT ;此處輸入數據段代碼 string1 db 'please the number of digit(less than 10):',13,10,'$' string2 db 13,10,'please input the digit:',13,10,'$' digit dw ?,?,?,?,?,?,?,?,?,? hc db 13,10,'output:',
7、39;$'DATAS ENDSSTACKS SEGMENTSTACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART: MOV AX,DATAS MOV DS,AX sub ax,ax lea dx,string1 ;輸出字符串1 mov ah,09h int 21h mov ah,01h ;輸入個數 int 21h sub al,30h ;轉換ascii碼 mov bl,al ;存入bx中 mov cx,bx ;循環次數 lea dx,string2 ;輸出字符串2 mov ah,09h int 21h lea s
8、i,digit ;si指向digit首地址input: mov ah,01h int 21h mov si,al inc si loop input lea dx,hc ;提示結果輸出 mov ah,09h int 21h mov cx,bx ;循環次數 dec si ;si指向最后一位output: mov dl,si ;取出數組值 mov ah,02h int 21h dec si ;si指向前一位 loop output MOV AH,4CH INT 21HCODES ENDS END START計算機原理與匯編課程設計閏年的判斷第二章:判斷年份是否是閏年一、需求分析本程序用于在鍵盤輸入
9、年份,判斷該年份是否是閏年,并輸出結果。本程序年份均為四位。二、總體設計 提示輸入年份,將年份調用input函數以每一位數字存入year1數組中,change函數將數組中的數轉換為16進制數存入year變量中。判斷是否為閏年,并輸出結果。三、詳細設計1、定義輸入函數,將年份的每一位存入數組year1中,循環4次,并將其ascii碼轉化 mov cx,4 lea si,year1input: ;輸入年份,存入year mov ah,01h int 21h sub al,30h mov bl,al mov si,bl inc si loop input2、定義轉換函數,將數組中的每一位數還原為一個
10、數,并將此年份數存入year中,一下為change函數的部分代碼,以此類推 change: lea si,year1 mov bx,0fh mov ax,si and ax,bx mov dx,1000 mul dx add year,ax inc si 共有四個類似的程序塊,用于將每一位數合在一起,還原原本年份值。3、判斷該年份能否被400整除,若能,則輸出yes,若不能則判斷能否被4整除,judge1函數為判斷能否被4整除,若能,則判斷能否被100整除,轉到judge2函數,若不能則輸出no。 mov ax,year cwd mov cx,190h div cx cmp dx,0 jz o
11、utput1 jnz judge1 jmp exit 流程圖: 圖2 整體流程圖四、調試分析 在完成這個程序過程中,怎樣將存入數組的每一位還原為年份值是一個重點,我沒有使用循環體,而是直接寫了四個程序塊,將每一位的值相加。用循環體可以讓程序更簡潔。用debug中的P語句進行單步執行,觀察每一次執行后各寄存器的變化,查找程序哪一步或者哪個值傳的不正確,最終完成程序編寫。五、測試結果 圖2.1 判斷閏年測試截圖1 圖2.2 判斷閏年測試結果2六、總結這個程序在寫的過程中出現了很多錯誤,開始的時候我直接把存在數組中的每個數以移位的方式存儲在了year中,調試后發現這樣的結果已經更改了原本輸入的值,后
12、來想用與循環實現change函數,但是由于對尋址方式還不是特別熟練因而沒能用循環體,而是直接寫了四個程序塊,將其轉化。雖然這個程序不難,但是由于我對匯編還不熟練,寄存器功能掌握不好,各種指令中隱含的寄存器的變化不是很清楚,所以花費了很多時間來調試,每一個函數功能的實現都是單獨調試好函數后才放在一起組合成完整的程序。判斷過程中,用除法如果不擴展的話就會出現溢出錯誤,通過這個程序我學會了如何用cwd擴展。在這個過程中,我由于有點地方思考方向錯誤因而浪費了很多時間,最后終于完成了程序,給了我信心,我也從中學到了很多。七、參考文獻【1】匯編語言程序設計第二版 沈美明 溫冬嬋【2】程序設計實驗指導 蔡啟
13、先 王志文 黃曉璐八、附錄DATAS SEGMENT ;此處輸入數據段代碼 year1 db ?,?,?,? string db 'please input year:',13,10,'$' year dw 0 string1 db 13,10,'yes',13,10,'$' string2 db 13,10,'no',13,10,'$'DATAS ENDSSTACKS SEGMENT ;此處輸入堆棧段代碼STACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DAT
14、AS,SS:STACKSSTART: MOV AX,DATAS MOV DS,AX ;此處輸入代碼段代碼 sub ax,ax lea dx,string mov ah,09h int 21h mov cx,4 lea si,year1input: ;輸入年份,存入year mov ah,01h int 21h sub al,30h mov bl,al mov si,bl inc si loop inputchange: ;轉換函數,將存在數組中的每一位還原為原本的數值 lea si,year1 mov bx,0fh ;取后四位 mov ax,si and ax,bx mov dx,1000 ;
15、將其每一位還原原本的十進制值 mul dx add year,ax ;year存儲單元最初為1,存放每一位還原十進制后的和 inc si ;si指向下一個單元 mov ax,si and ax,bx mov dx,100 mul dx add year,ax inc si mov ax,si and ax,bx mov dx,10 mul dx add year,ax inc si mov ax,si and ax,bx add year,ax;* mov ax,year ;判斷函數 cwd ;轉換為雙字,若不擴展則除法溢出 mov cx,190h div cx cmp dx,0 jz out
16、put1 jnz judge1 jmp exitjudge1: ;判斷能否被4整除 mov cx,4h mov ax,year cwd div cx cmp dx,0 jz judge2 jnz output2judge2: ;判斷能否被100整除 mov cx,64h mov ax,year cwd div cx cmp dx,0 jz output2 jnz output1output1: ;輸出yes lea dx,string1 mov ah,09h int 21h jmp exit output2: ;輸出no lea dx,string2 mov ah,09h int 21h jm
17、p exit exit: MOV AH,4CH INT 21HCODES ENDS END START計算機原理與匯編課程設計素數輸出第三章:輸出1000以內的素數一、需求分析使用子程序計算出1000 以內的素數,并以十進制形式輸出。二、總體設計 主函數用于初始化并調用子程序judge,子程序judge用于判斷從3到1000的數是否為素數并輸出三、詳細設計1、主函數main初始化,digit用于存儲需要判斷的數,digit4用于判斷過程中的除數,循環次數xunhuan為10002、判斷函數judge 主要判斷體,用于判斷一個數是否可以被整除,除數為小于該數的數 rotate: mov ax,d
18、igit cwd div digit4 ;從2開始除 cmp dx,0 ;是否能除盡 jnz judge1 ;不能整除 jz digit_add ret ;不是素數返回3、 判斷體除數的循環函數,用于給digit4賦值,讓他可以從2 開始取所有小于待檢測數的值judge1: mov ax,digit dec ax cmp digit4,ax ;比較兩個數 jns output ;相等時是素數 js jud_add ;除數小于要判定的數時,除數加1jud_add: inc digit4 jmp rotate4、待檢測數的循環,用于將digit賦值取從3開始所有小于1000的整數來判定digit_
19、add: mov ax,digit cmp ax,xunhuan ;判斷檢測的數是否到了1000 js d_add ;沒有,則繼續待檢測的數加1后繼續循環 jns exitd_add: add ax,1 mov digit,ax mov ax,digit3 ;digit3的作用是保持digit4可以還原為2 mov digit4,ax ;將digit4的值恢復成2,新的數從2開始檢測 jmp rotate5、定義輸出函數output,將數值以10進制形式輸出。流程圖:四、調試分析本程序只有一個子程序,可以直接輸出從給定數值(如本程序起始數值為3)開始所有小于1000的素數。也可以定義多個子程序
20、,一個用于待檢測數的循環,一個用于素數的判定,一個用于素數的輸出。但由于我在實現的時候待檢測數的循環沒能用子程序實現,所以將這三個合并成了一個子程序,主函數只需調用一次子程序就能輸出所有素數。由于檢測值是從3開始的,所以輸出沒有2。五、測試結果 圖3-3 輸出1000內素數測試結果六、總結 通過這個程序,我學會了子程序的設計方法和如何調用子程序,在編寫過程中,很多次由于調用不當和循環體設置不當的問題出現死循環,通過不斷調試,修改,運用debug中的p和t命令進行單步調試,終于弄清了循環體的函數跳轉次序,在這個程序中,我也進一步熟悉了lea和mov的區別。 在子程序設計時,我首先編寫的輸出函數,
21、測試成功后編寫了判斷的程序,由于判斷程序過程中跳轉很多,很多時候都有些混亂,在不斷調試后才完成了判斷過程的編寫,最后加上循環體,總是會出現死循環,或者輸出亂碼,是由于跳轉設置不當,還有比較值設置不當導致循環不斷進行。 雖然中途出現了各種錯誤,但最終還是完成了這個程序,讓我學會了很多,對匯編有了更深入的了解。七、參考文獻【1】匯編語言程序設計第二版 沈美明 溫冬嬋【2】程序設計實驗指導 蔡啟先 王志文 黃曉璐八、附錄源程序:DATAS SEGMENT ;此處輸入數據段代碼 digit dw ? d dw ? digit4 dw ? digit3 dw 2 xunhuan dw 1000 lop dw 1000,100,10,1DATAS ENDSSTACKS SEGMENT ;此處輸入堆棧段代碼STACKS ENDSCODES SEGMENTmain proc far ASSUME CS:CODES,DS:DATAS,SS:STACKSstart: MOV AX,DATAS MOV DS,AX ;此處輸入代碼段代碼 mov digit,3 ;從3開始檢測 mov digit4,2 call judge retmain endp;*judge proc nearrotate: mov ax,digit cwd div di
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年 曲靖市低壓電工證理論考試練習題附答案
- 云浮橡膠制品項目申請報告
- 2025年 湖南中醫藥大學湘杏學院招聘考試筆試試題附答案
- 2025年 東興市市級機關遴選考試筆試試題附答案
- 毛紗布項目投資可行性研究分析報告(2024-2030版)
- 中國杜松子油行業市場全景評估及發展趨勢研究預測報告
- 中國十二路保險盒行業市場發展前景及發展趨勢與投資戰略研究報告(2024-2030)
- 中國碳纖維行業市場全景調研調查
- 中國導電膠行業市場調查報告
- 中國恒壓消防泵行業市場發展現狀及投資戰略咨詢報告
- 校園食堂升級服務方案
- 中醫治療協議書范本(2篇)
- 沐足行業嚴禁黃賭毒承諾書
- 2024年初級招標采購從業人員《招標采購法律法規》考前通關必練題庫(含答案)
- 供應柴油月結算合同范本
- 2024年《風力發電原理》基礎技能及理論知識考試題庫與答案
- 2.10豐巢智能柜合作協議
- 電商平臺用戶使用手冊
- 2024秋國家開放大學《外國文學》形考任務1-4答案
- 房顫的規范化治療
- 分布式光伏發電項目EPC總承包投標方案(技術方案)
評論
0/150
提交評論