匯編語言參數(shù)傳遞ppt課件.ppt_第1頁
匯編語言參數(shù)傳遞ppt課件.ppt_第2頁
匯編語言參數(shù)傳遞ppt課件.ppt_第3頁
匯編語言參數(shù)傳遞ppt課件.ppt_第4頁
匯編語言參數(shù)傳遞ppt課件.ppt_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、1,第6章 子程序設(shè)計,2,子程序又稱為過程,是完成特定功能的程序段。本身不能被單獨執(zhí)行,必須通過調(diào)用的程序來執(zhí)行才有意義。子程序結(jié)構(gòu)是模塊化程序設(shè)計的基礎(chǔ)。 一、過程定義偽指令 格式: 過程名 PROC ATTRIBUTE RET 過程名 ENDP,過程入口的符號地址, NEAR / FAR ,3,用戶對過程屬性的確定原則: (1)若調(diào)用程序和過程在同一個代碼段中,則使用 NEAR屬性; (2)若調(diào)用程序和過程不在同一個代碼段中,則使用FAR屬性。 二、子程序的調(diào)用和返回 為方便用戶的工作,80 x86的匯編程序用PROC偽操作的類型 屬性來確定CALL和RET指令的屬性,即CALL和RET

2、的屬性由匯 編程序確定,用戶只需正確選擇PROC的屬性就可以了。 子程序的調(diào)用采用指令CALL,其格式為: CALL 過程名 段內(nèi)調(diào)用,4,CSEG SEGMENT MAIN PROC FAR CALL SUBT RET MAIN ENDP SUBT PROC NEAR RET SUBT ENDP CSEG ENDS, 段間調(diào)用 SEGX SEGMENT SUBT PROC FAR RET SUBT ENDP CALL SUBT ;第一次調(diào)用 SEGX ENDS SEGY SEGMENT CALL SUBT ;第二次調(diào)用 SEGY ENDS,CALL far ptr SUBT(8086),5,

3、(3) 子程序的返回 由RET指令實現(xiàn)過程的返回功能,由于CALL時,已使返回地址如棧,所以RET時應(yīng)使返回地址出棧。因此,在執(zhí)行RET前,SP應(yīng)指向進(jìn)入子程序時的返回地址,這樣,才能使返回地址出棧,正確返回到主程序。,6,三、保存與恢復(fù)寄存器(現(xiàn)場保護(hù)與恢復(fù)) 通常主程序和過程的設(shè)計是分開的,因而他們所使用的寄存器往往會發(fā)生沖突。為解決這一沖突,一般地,應(yīng)該在子程序入口處將子程序中用到的寄存器內(nèi)容壓入堆棧保存,而在返回到調(diào)用程序之前再恢復(fù)這些寄存器。如: SUB1 PROC NEAR PUSH AX ;進(jìn)入后,壓棧保護(hù)現(xiàn)場 PUSH BX ;處理部分 POP BX ;反序彈出,恢復(fù)現(xiàn)場 PO

4、P AX RET SUB1 ENDP 但是,如果是用來向主程序回送結(jié)果的寄存器,則不應(yīng)該保存其內(nèi)容,否則會因為保存和恢復(fù)寄存器而破壞了應(yīng)該向主程序傳送的信息。,7,四、主、子程序間的參數(shù)傳遞方法 主程序 子程序 子程序 主程序,原始數(shù)據(jù)、地址,處理結(jié)果,參數(shù)傳遞,入口參數(shù):主程序調(diào)用子程序時,必須先將子程序所需要的初始數(shù)據(jù)設(shè)置好,這些初始數(shù)據(jù)稱為過程的入口參數(shù)。 出口參數(shù):子程序執(zhí)行完畢返回主程序時也必須將子程序運行所得的結(jié)果送給主程序,這些回送的結(jié)果稱為過程的出口參數(shù)。 參數(shù)傳遞:過程入口參數(shù)的送入和出口參數(shù)的送出稱為主程序和過程間的參數(shù)傳遞,也稱過程通信。過程通信通常有四種方法:,8,1、

5、通過寄存器傳遞參數(shù) 2、通過變量傳遞參數(shù) 3、通過地址表傳遞參數(shù) 4、通過堆棧傳遞參數(shù),1、通過寄存器傳送參數(shù) 最常用,但參數(shù)多時不宜使用。 (1)主、子程序之間通過寄存器傳遞參數(shù) (2) 子程序之間通過寄存器傳遞參數(shù),9,例6.1:從鍵盤輸入一個十進(jìn)制數(shù)并將其以十六進(jìn)制形式在屏幕上顯示出來。 十進(jìn)制 二進(jìn)制數(shù) 十六進(jìn)制數(shù) decibin子程序 binihex子程序 功能:從鍵盤取得十進(jìn)制數(shù) 把BX中的二進(jìn)制數(shù)轉(zhuǎn)換成十六進(jìn)制數(shù) 轉(zhuǎn)換,結(jié)果放BX 并顯示 入口參數(shù):鍵盤取得的十進(jìn) 要轉(zhuǎn)換的二進(jìn)制數(shù)在BX中 制數(shù)放AL 出口參數(shù): 轉(zhuǎn)換結(jié)果放入BX 轉(zhuǎn)換結(jié)果放入AL(以備顯示),BX在子程序之間傳

6、遞參數(shù),10,鍵盤輸入的十進(jìn)制數(shù) 二進(jìn)制數(shù)的轉(zhuǎn)換算法:從最高位起,每個數(shù)位先將ASCII字符轉(zhuǎn)換為數(shù)字,然后乘以該位的權(quán),累加后就成為所要求的二進(jìn)制數(shù)。例:從鍵盤輸入數(shù)12345的計算步驟為: 步驟 成績 5X1 = 5 4X10 = 40 3X100 = 300 2X1000 = 2000 1X10000 = 10000 求和 = 12345,11,鍵盤輸入的十進(jìn)制數(shù) 二進(jìn)制數(shù)的轉(zhuǎn)換算法步驟: (1) (bx)=0; (2) 十進(jìn)制數(shù)中的高位ASCII碼轉(zhuǎn)換為二進(jìn)制數(shù),并放于ax中; (3) (bx) (bx)x10+(ax); (4) 重復(fù)(2)、(3)步,直到各位十進(jìn)制數(shù)都轉(zhuǎn)換為止,結(jié)果

7、放bx中。,12,開始,調(diào)用DECIBIN,調(diào)用CRLF,調(diào)用BINIHEX,調(diào)用CRLF,結(jié)束,程序結(jié)構(gòu):,13,主程序: decihex segment main proc far assume cs:decihex start: push ds sub ax,ax push ax call decibin ; keyboard to binary call crlf ; print cr and lf call binihex ; binary to screen call crlf ; print cr and lf jmp start ret ;在補(bǔ)充教材中補(bǔ)上 main endp,

8、14,decibin proc near mov bx, 0 ;clear BX for number newchar: mov ah, 1 int 21h sub al, 30h ; ASCII to binary jl exit ; jump if 9 ? jg exit ; yes, not dec digit cbw ; byte in AL to word in AX push ax ; save ax mov ax,bx mov cx, 10 ; put 10d dec in cx mul cx ; number times 10d mov bx,ax ; (bx)*10 to (

9、bx) pop ax add bx, ax ; add digit to number jmp newchar ; get next digit exit: ret decibin endp,;get digit from keyboard, and convert to binary ,result is left in BX,15,; PROCEDURE TO CONVERT BINARY IN BX TO HEX ON CONSOLE SCREEN binihex proc near mov ch, 4 ; count of loop rotate: mov cl, 4 ; set co

10、unt to 4 bits rol bx, cl ; left digit to right mov al, bl ; move to AL and al, 0fh ; mask off left digit add al, 30h ; convert hex to ASCII cmp al, 3ah ; jl print ; jump if digit = 0 to 9 add al, 7h ; digit is A to F print: mov dl, al ;put ASCII char in DL mov ah, 2 ;Display output function int 21h

11、dec ch ;done 4 digits ? jnz rotate ;not yet ret binihex endp,16,; PROCEDURE TO PRINT CARRIAGE RETURN AND LINEFEED crlfproc near mov dl, 0dh ; carriage return mov ah, 2 ; display function int 21h ; call DOS mov dl, 0ah ; line feed mov ah, 2 int 21h ret crlfendp ; - decihex ends ; end of code segment

12、end start ; end of program,17,2、通過變量傳遞參數(shù) 如果過程和調(diào)用程序在同一程序模塊(同一代碼段)中,則過程可直接訪問模塊中的變量。 例6.2 主程序main和過程proadd在同一源文件中,要求用過程proadd累加數(shù)組中的所有元素,并把和送到指定的存儲單元中。(不考慮溢出的可能性) data segment ; define data segment array dw 1111h, 2222h, 3333h count dw ($-array)/2 ; 3d sum dw ? data ends,18,code segment main proc far as

13、sume cs: code, ds: data start: push ds sub ax,ax push ax mov ax, data ;initialize ds segment mov ds, ax call proadd ret main endp ; end main part of prog.,19,proadd proc near; define subprocedure push ax ; save registers push cx push si lea si,array ;過程直接訪問模塊中的變量 mov cx,count xor ax,ax ;clear ax nex

14、t: add ax, si ; result of adding to ax add si, 2 ; point to next element loop next mov sum,ax pop si pop cx pop ax ret proadd endp code ends end start,20,3、通過堆棧傳送參數(shù)地址 方法:在主程序里把參數(shù)地址保存到堆棧中,在子程序 里從堆棧中取出參數(shù)以達(dá)到傳送參數(shù)的目的。 注意:為了在返回主程序后,堆棧能恢復(fù)原始狀態(tài)不變, 子程序結(jié)束時應(yīng)使用帶常數(shù)的返回指令ret n。 例6.3 主程序main和過程proadd不在同一代碼段中,要求用過程pr

15、oadd累加數(shù)組中的所有元素,并把和送到指定的存儲單元中。采用通過堆棧傳送參數(shù)地址的方法編寫程序。(不考慮溢出的可能性) data segment ; define data segment array dw 1,2,3,4,5,6 count dw ($-array)/2 sum dw ? data ends,21,code1 segment main proc far assume cs: code1, ds: data start: push ds sub ax,ax push ax mov ax, data mov ds, ax mov bx, offset array push bx

16、 mov bx, offset count push bx mov bx, offset sum push bx call far ptr proadd ret main endp code1 ends,; initialize DS ; push address of array ; onto stack ; push address of count ; onto stack ; push address of sum ; onto stack ; end main part of prog ; code1 ends,22,code2 segment assume cs:code2 pro

17、add proc far ;子程序定義開始 push bp ;??蚣苤羔?mov bp, sp push ax push cx push si push di mov si, bp+0ah ;標(biāo)準(zhǔn)的讀棧內(nèi)參數(shù)的方法 mov di, bp+8 mov cx, di ; put count in CX mov di, bp+6 xor ax, ax ; 累加器清0,(sp),(ds),0000h,ary的偏移地址,count的偏移地址,sum的偏移地址,(cs),(ip),(sp),(bp),(ax),(cx),(si),(bp),(di),(sp),(bp)+0ah,(bp)+8h,返回地址,2

18、3,next: add ax, si ; 計算和 add si, 2 ; 指向下一個元素 loop next mov di, ax ; 返回結(jié)果到sum單元 pop di ; 恢復(fù)寄存器 pop si pop cx pop ax pop bp ret 6 ; 調(diào)整堆棧并返回調(diào)用程序 proadd endp code2 ends end start ;結(jié)束匯編,(sp),(ds),0000h,ary的偏移地址,sum的偏移地址,(cs),(ip),(sp),(bp),(ax),(cx),(si),(bp),(di),(sp),count的偏移地址,執(zhí)行ret 6后(sp),返回地址,24,五、子程序的嵌套與遞歸調(diào)用 一個子程序調(diào)用另一個子程序叫子程序嵌套,如下圖 所示:,C

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論