




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、2021-11-121第6章 子程序結構本章重點介紹子程序的調用與返回指令、子程序調用時參數(shù)傳遞方法和子程序的設計方法。2介紹 p139l子程序又叫過程,相當與高級語言的過程和函數(shù)。l子程序結構是模塊化程序設計的基礎。l結構: procname proc attribute . procname endp lattribute為near(段內調用) far(段間調用)3一.子程序的設計方法4l1.子程序的調用和返回子程序的調用和返回p140l calll 格式:call 目標地址l 功能:暫停正在執(zhí)行的程序,轉去執(zhí)行相應的子程序,目標地址給出調用于程序的入口地址。l 在子程序執(zhí)行完后,由子程序
2、中的ret指令返回至call指令的下一條指令繼續(xù)執(zhí)行。為此,call指令同時需要把斷點地址(即call指令的下條指令的cs和ip)入棧保護lcall指令不影響標志位,但應特別注意在于程序中對相關寄存器的保護。lcall指令實質上是一條特殊的、帶返回的無條件轉移指令。 5call指令目標地址的形成方式與jmp指令完全類似,即有段內直接調用、段內間接調用、段間直接調用與段間間接調用四種方式。直接調用其目標地址直接出現(xiàn)在call指令中,間接調用其目標地址存放在指令所指向的寄存器或內存單元中。6格式格式:call near ptr 標號功能功能:首先將斷點的ip值壓入推棧,再將從指令中得到的子程序相對
3、偏移量加到ip,然后根據(jù)ip轉相應子程序執(zhí)行。如:call output;段內直接調用子程序output7格式格式:call reg|mem功能功能:首先將斷點的ip值壓入堆棧,再將子程序的地址偏移量送入ip,然后根據(jù)ip轉相應子程序執(zhí)行。子程序的地址偏移量為指令中指定的16位通用寄存器或存儲單元值。 如:call bx call word ptr bx8格式格式:call far ptr 標號功能:功能:首先把斷點的cs值壓入堆棧,并將于程序的段地址送入cs再把斷點的ip值壓入堆棧,把子程序的地址偏移量送入ip。然后根據(jù)cs:ip轉相應于程序執(zhí)行。如:call far ptr output;
4、段間直接調用子程序output 9格式格式:call dword ptr mem功能功能:首先把斷點的cs壓入堆棧,并將指令中指定的雙字存儲器的第二個字的內容送入cs;再把斷點的ip壓入堆棧,再將雙字指針的第一個字的內容送入ip。然后根據(jù)cs:ip轉相應子程序執(zhí)行。 如:call dword ptr bx call dwrod ptr mem3210返回指令ret通常作為一個子程序的最后一條指令,用以返回到調用這個于程序的主程序斷點處繼續(xù)執(zhí)行。與調用指令相對應,返回指令ret也有段內返回與段間返回兩種形式。是段內返回,還是段間返回,匯編程序能自動確定,并形成相應的返回指令。返回指令有兩種格式:
5、11格式一:ret 格式一為不帶偏移量的返回。若是段內的ret指令(機器碼為c3hc2h),只返回主程序斷點處的ip值。即從堆棧彈出一個字送入ip,且sp加2。然后返回cs:ip處繼續(xù)執(zhí)行程序。此時的返回也稱近返回。若為段間的ret指令(機器碼為cbhcah),則要返回主程序斷點處的段地址和ip值。將從堆棧彈出一個字送cs, sp+2sp,再從堆棧彈出一個字送cs,同時sp加2。然后返回cs:ip處繼續(xù)執(zhí)行程序。此時ret也稱遠返回。12格式二:ret n格式二為帶偏移量的返回,與格式一完全類似,只是在修改堆棧指針時需增加spsp+n處理。n一般為偶數(shù),格式二適合主程序向于程序利用堆棧傳遞參數(shù)
6、的情況。在利用堆棧傳遞參數(shù)時,主程序先將參數(shù)壓入堆棧,在于程序中將參數(shù)取出,為找到正確的返回地址,保持堆棧平衡,應將堆棧指針修正。 返回指令ret對標志位無影響。13例7-3 求兩個數(shù)的最大公約數(shù)p144l用展轉相除法 在我們編程中用的最多方法就是展轉相除法了,展轉相除法是古希臘求兩個正整數(shù)的最大公約數(shù)的也叫歐幾里德算法,用較大的數(shù)除以較小的數(shù),結果的余數(shù)和被除數(shù)構成新的一對數(shù),繼續(xù)做上面的除法,直到大數(shù)被小數(shù)求盡 。14gysproc pushax pushbx pushdxg1:xor dx,dx divbx cmp dx,0 jzexit mov ax,bx mov bx,dx jmpg
7、1exit: mov cx,bx popdx popbx popax retgysendp15 調用程序和子程序之間的信息傳送叫參數(shù)傳送。la.通過寄存器傳送參數(shù)(約定寄存器法) p104 例1:十進制到十六進制數(shù)的轉換(bx)。流程圖 開始調用decibin調用crlf調用binihex調用crlf結束從鍵盤取得十進制數(shù),保存在bx中顯示回車和換行用十六進制形式顯示bx中的數(shù)3.子程序的參數(shù)傳送16;從鍵盤輸入十進制數(shù),然后按十六進制顯示data segmentdata ends ;同學們掌握各段的結構stack segment para stack stack db 100h dup(?)
8、stack endscode segment assume cs:code,ds:data,ss:stack ;分配段址,但不會給段寄存器付值17start: mov ax,data mov ds,ax ;給段寄存器ds付值 call decibin call binihex;子程序調用 call crlf mov ah,4ch int 21h ;主程序的返回方式一(dos功能調用返回)18decibin proc near push ax push cx pushf mov bx,0newchar: mov ah,1 ;鍵盤輸入 int 21h sub al,30h jl exit ; 9退
9、出 cbw xchg ax,bx mov cx,10 mul cx xchg ax,bx add bx,ax jmp newchar exit: popf pop cx pop ax ret decibin endp19binihex proc near push ax push cx push dx pushf mov ch,4rotate: mov cl,4 rol bx,cl mov al,bl and al,0fh add al,30h ; 09 cmp al,3ah jl printit add al,7h ; afprintit: mov dl,al mov ah,2 int 21
10、h dec ch jnz rotate mov dl,h mov ah,2 int 21h popf pop dx pop cx pop ax retbinihex endp20crlf proc near push ax push dx pushf mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h popf pop dx pop ax retcrlf endpcode ends end start21lb.如果過程和調用程序在同一模塊中,則過程可直接訪問模塊中的變量。(約定變量法)data segment ary dw 100 d
11、up(?) count dw 100 sum dw ? data endscode segment main proc far assume cs:code ,ds:data start: push ds sub ax,ax push ax mov ax,data mov ds,ax 22l l call near ptr proaddl l ret lmain endplproadd proc nearl push axl .lproadd endplcode endsl end start23lc.通過地址表傳送參數(shù)地址(約定存儲器法) 建立一個地址表,把要傳送的參數(shù)存在地址表中,然后把地
12、址表的首地址通過寄存器bx傳送到子程序。 mov table,offset num mov table+2,offset n mov table+4, offset total mov bx,offset table call proadd24ld.通過堆棧傳送參數(shù)或參數(shù)地址(堆棧法) 采用在主程序里把參數(shù)地址保存到堆棧中,在子程序里從堆棧中取出參數(shù)以達到傳送參數(shù)的目的。 注:用bp保存原來的sp的值,以便取得堆棧中的地址.25le.多個模塊之間的參數(shù)傳送問題 (1)外部符號 public symbol, 在一個模塊中定義的符號在提供給其他模塊使用時,必須用public定義. extrn sy
13、mbol name:type, 在另一模塊中定義而在本模塊中使用的符號必須用extern偽操作。如符號為變量,則類型為byte/word/dword;如符號為標號或過程名,則類型為near/far26二.子程序的嵌套p153主程序call proc-a子程序aproc_acall proc_bret子程序bproc-bret27子程序的代碼部分通常有如下結構: (1)保護現(xiàn)場: (2)根據(jù)入口參數(shù),獲取要處理的數(shù)據(jù); (3)進行數(shù)據(jù)的加工處理; (4)根據(jù)出口參數(shù),將處理后的數(shù)據(jù)送至指定區(qū)域; (5)恢復現(xiàn)場; (6)返回主程序。28子程序中往往還包含有該子程序調用的詳細說明,用以向使用考提供足夠的信息。子程序說明通常包括如下內容: (1)子程序名稱; (2)子程序功能; (3)入口參數(shù): (4)出口參數(shù); (5)使用的寄存器和存儲單元: (6)調用的其他子程序; (
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課題代寫申報書是什么
- 課題申報評審書范例范文
- 就業(yè)心理 課題申報書
- 河南小學課題申報書范例
- 兌換房子合同范本
- 公司外匯借款合同范本
- 益智課堂課題研究申報書
- 閱讀推廣 課題申報書
- 課題申報項目書推廣價值
- 同城工程勞務合同范例
- 幼兒園科學課件:《大肚子媽媽》
- 北師大版 數(shù)學 三年級下冊 單元作業(yè)設計 面積
- 智能農業(yè)除草機器人研究現(xiàn)狀與趨勢分析
- (完整版)200210號文-工程勘察設計收費標準(2002年修訂本)本月修正2023簡版
- 基于核心素養(yǎng)下小學英語單元整體作業(yè)設計實踐研究 論文
- 風電工作流程圖
- 社會救助公共基礎知識題庫及答案
- 《論文所用框架圖》課件
- 人教版三年級下冊說課標、說教材
- 2022版《義務教育科學課程標準》試題及答案
- 《民法典》背景下違約精神損害賠償制度適用問題
評論
0/150
提交評論