




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、精選優質文檔-傾情為你奉上匯編語言實驗報告學院:*班級:*姓名:*學號:*指導老師:*目 錄實驗一 斐波那契數列1. 設計要求用遞歸的方法求斐波那契的第24項(N=24),并將結果用十進制顯示出來輸出FIB(24)的值2. 設計思想和實施方案論述 FIB函數采用子程序遞歸調用方法,實現求斐波那契數列先寫出高級語言中的斐波那契遞歸函數:Int fib(int N)If(N=1|N=0) result=1;Else result=fib(n-1)+fib(n-2);Return result;其函數為高級語言的形式,其中result=fib(n-1)+fib(n-2)隱含了幾個操作可把它展開為:N
2、=N-1;注意到這里的N是形參(局部變量)與調用程序的實參不是同一個變量Int a=fib(N)N=N-1Int b=fib(N)Result = a+b;由此可知幾個重要實現地方:a) 保存現場:N在一個fib函數里面是局部變量,當系統調用子程序時需要保存這個局部變量,在返回時需要恢復:SUBT PROC NEARPUSH AXPUSH BX.POP BXPOP AX SUBT ENDP; 采用保存恢復寄存器的形式b) 參數傳遞:其中的N在調用fib傳參時是作為實參,在被調用函數中還需要被使用,這是參數的傳遞,這里采用通過數據區傳遞參數(同全局變量)c) 返回值:最后的result在高級語言
3、中是通過將result賦給一個臨時變量(調用該函數的程序)然后釋放result這個局部變量,在本程序中采用寄存器直接傳遞的方法,所以在Fib函數中將result賦給一個寄存器,然后不保存它,讓其傳遞到上層調用函數中去。3. 課程設計中遇到的問題及解決方案l 遇到的問題在編寫斐波那契函數的過程中主要遇到了問題是保存現場的問題,在高級語言中,對子程序調用時,系統會自動為我們保存當前程序的現場指令地址,局部變量。而在匯編中除了現場指令地址保存外,其他的工作都必須我們自己完成,所以在對子程序調用時,怎么保存當前的局部變量,怎么傳遞參數到將要調用的函數中去使用,都是很難理順思路的地方。l 解決方案第一:
4、明確哪些是局部變量,在調用完子程序返回時要恢復的。第二:局部變量作為實參,與被調用的子程序中的形參的區別。第三:確保有壓棧就必須對應出棧,且系統的中斷指令地址的保存與我們使用的棧是同一個棧解決方案在上面已經寫過,就沒有在復述了4. 程序流程圖 .NN-1N-2.21Fib(2)Fib(1)Fib(N-2)Fib(N-1)Fib(N)5. 源程序及注釋DATAS SEGMENT message1 db "input the number ","$" NUM=18h ;修改此處獲得第N項斐波那契數列值 N dw 0;用于傳參的NDATAS ENDSCODES
5、 SEGMENT ASSUME CS:CODES,DS:DATASMain proc farSTART: push ds sub ax,ax push ax mov ax,DATAS mov ds,ax mov byte ptr N,NUM call FIB;調用Fib子程序 mov dx,ax ;call Output_CTLF call PrintOX;將十進制轉換為十六進制輸出 mov ah,1 int 21h ;等待退出屏幕 retMain endp; output CTLFOutput_CTLF proc Nearpush ax push dxmov ah,02hmov dl,0dh
6、 int 21hmov dl,0ahint 21h pop dxpop axretOutput_CTLF endp ;input value in dxPrintOX proc nearmov cl,4loop1:push cxmov cl,4rol dx,clmov ax,dxpop cxand ax,000fh cmp ax,000ahjl LessThanAadd ax,07hLessThanA:add ax,30hpush dxmov dl,almov ah,2int 21hpop dxloop loop1retPrintOX endpFIB proc near;FIB子函數push
7、cx;cx與bx為局部變量push bxmov cx,N;使用N作為實參傳參,cx為形參cmp cx,1;相當于if(N=<1)jle less_equal_1dec cx;相當于N-1mov N,cx;使用N作為實參傳參call FIB;FIB(N-1)mov bx,axdec cx;相當于N-1mov N,cx;使用N作為實參傳參call FIB;FIB(N-1)add ax,bx;ax中保存FIB(N-1)+FIB(N-2),并且作為返回值jmp enderless_equal_1:mov ax,1;如果N<=1 result=1ender:pop bxpop cxretFI
8、B endpCODES ENDS end start實驗二 統計學生成績1. 設計要求設計10個學生的成績分別為56、69、84、82、73、88、99、63、100和80分。試編制程序分別統計低于60分、60-69分、70-79分、80-89分、90-99分及100分的人數,并存放到S5、S6、S7、S8、S9及S10單元中。2. 設計思想和實施方案論述定義以x為數組名的含10個單元的一維數組,分別存放10個學生的成績;定義變量S5、S6、S7、S8、S9及S10,初始化為0,以存放各成績階段的人數,以上均以字為存儲單元長度。建立子程序SEARCH,用以查找學生成績并進行各成績階段的人數統計
9、,并在主程序中調用。其中,統計應用公式 (成績)/10-5)*2根據成績相s5的相對地址變化量來進行存儲。3. 典型程序模塊及典型編程技巧分析子程序SEARCH(統計人數) SEARCH: MOV SI, 0 NEXT: MOV AX, xSI MOV BX, 10 DIV BL MOV BL,AL SUB BX,5 SAL BX, 1 INC S5BX ADD SI, 2 LOOP NEXT RET子程序PRINTMen 人數PRINTMen: MOV AH,02H INT 21H MOV DL,' ' MOV AH,02H INT 21H RET編程技巧:采用子程序方法,使
10、程序更易分析,模塊更清晰,利用循環和相對地址變化量來減少程序的冗余度,是其看起來精簡和更易分析。4. 課程設計中遇到的問題及解決方法1、對匯編語言編程的基本結構都不會 解決方法:看書,多看幾個程序,便熟悉了基本結構data segment,code segment等。2、數組的地址分配方式很糊涂,其存儲單元的長度與首地址的關系 解決方法:請教老師同學,在多次練習小習題后,進行畫圖分析3、子程序的使用方法 解決方法:多看程序4、公式的匯編語言轉換 解決方法:“心急吃不了”熱豆腐,將大化小,化繁為易,一步步計算5. 程序流程圖,程序清單和程序注釋子程序SEARCHCX=CX-1對應的存儲單元S5B
11、X的值加1將當前地址單元的值送到AX中否子程序返回進入NEXT循環利用公式(成績)/10-5)*2,計算出當前成績相對于首地址的變化量,送給BXCX等于0 ?初始化相對地址變化量SI=0子程序調用開始6. 程序清單和注釋DATA SEGMENT ;數據段開始x DW 56,69,84,82,73,88,99,63,100,80;定義數組,以存放學生成績S5s DW 0 ;定義變量s5,表示分數50-59分統計結果S6 DW 0 ;定義變量s6,表示分數60-69分統計結果S7 DW 0 ;定義變量s7,表示分數70-79分統計結果S8 DW 0 ;定義變量s8,表示分數80-89分統計結果S9
12、 DW 0 ;定義變量s9,表示分數90-99分統計結果S10 DW 0 ;定義變量s10,表示100分統計結果DATA ENDS ;數據段結束CODE SEGMENT ;代碼段開始 MAIN PROC FAR ;MAIN函數聲明ASSUME CS: CODE, DS: DATASTART: PUSH DS ;過程開始 SUB AX,AX PUSH AX MOV AX,DATA MOV DS, AX ;初始化BEGIN: MOV CX, 10 ;BEGIN函數開始 CALL SEARCH ;調用統計人數子程序 MOV DL,BYTE PTR S5 ADD DL,30H CALL PRINT ;
13、將分數50-59分統計結果賦值s5并輸出 MOV DL,BYTE PTR S6 ADD DL,30H CALL PRINT ;將分數60-69分統計結果賦值s6并輸出 MOV DL,BYTE PTR S7 ADD DL,30H CALL PRINT ;將分數70-79分統計結果賦值s7并輸出 MOV DL,BYTE PTR S8 ADD DL,30H CALL PRINT ;將分數80-89分統計結果賦值s8并輸出 MOV DL,BYTE PTR S9 ADD DL,30H CALL PRINT ;將分數90-99分統計結果賦值s9并輸出 MOV DL,BYTE PTR S10 ADD DL,
14、30H CALL PRINT ;將分數100分統計結果賦值s10并輸出 RET MAIN ENDP ;MAIN主程序結束SEARCH PROC NEAR ;SEARCH子程序開始 MOV SI, 0 ;初始化地址變化量為0NEXT: MOV AX, xSI MOV BX, 10 ;根據成績計算相對S5的地址變化量 DIV BL ;計算公式(成績)/10-5)*2送(BX) MOV BL,AL ;(BH)保持為0不變 SUB BX,5 ;只統計50分以上成績 SAL BX, 1;(BX)*2 INC S5BX ;S5是S5,S6,S7,S8,S9和S10單元的首地址 ADD SI, 2 LOOP
15、 NEXT RETSEARCH ENDP ;SEARCH子程序結束PRINT PROC NEAR ;輸出統計結果子程序 MOV AH,02H INT 21H MOV DL,' ' MOV AH,02H INT 21H RET PRINT ENDP ;PRINT子程序結束 CODE ENDS ;代碼段結束 END START 收獲與體會匯編語言是一門低級語言,所以在程序設計的過程中我明顯的感覺到一個詞:底層!如,輸入輸出時要對每一位數值位進行處理,加深了對高級語言中輸入輸出格式的理解;子程序調用時需要自己設計分析堆棧的空間的分配情況,讓我明白保存現場的意義及實現方式;使用變量時要仔細分配急度缺乏的寄存器資源,這也是程序優化的核心思想;甚至是要考慮到變量因為類型的不同儲存的方式也不同,以及使用很少的指令集,自己編寫出一些實用功能的函數,因為底層,指令不便于閱讀所以模塊化,規范化在這里體現的尤為的重要,注釋及程序文檔則是比不可少的,不然由幾條指令變化出來的這么多功能很難再短時間內讀懂。此外,對匯編程序的調試也是一大難點,由于其完全是DOS下的編譯環境,而且出錯時給出的提示信息也很單一,所以更加需
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 大豆膜下滴灌種植技術規程
- 第5課 三國兩晉南北朝的政權更迭與民族交融 課件 部編人教版高中歷史必修上冊
- 北師大版新版一年級下冊6.1《認識圖形》(課件)
- 2025年風險管理與控制知識考試試題及答案
- 2025年電氣工程及其自動化考試題及答案
- 2025年傳統文化推廣工作者資格考試試卷及答案
- 監理工作總結反思匯報
- 2025年財務審計知識考核考試卷及答案
- 2025年電力系統與能源管理能力測試題及答案
- 2025《四川省達州市市初中學業水平考試》數學
- 產品圖紙知識培訓課件
- 老舊小區改造項目施工組織設計方案
- 上海交通大學《環境儀器分析》2023-2024學年第一學期期末試卷
- 辦公室主任崗位職責
- 家電維修工勞動合同三篇
- 頂管施工安全要點
- 《品質管控》課件
- 飛機構造基礎(完整課件)
- 醫院培訓課件:《彈力襪相關知識》
- 《臨床技術操作規范-放射醫學檢查技術分冊》
- 展會后總結報告范文6篇
評論
0/150
提交評論