版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1,第六章 子程序結(jié)構(gòu), 過(guò)程定義偽操作 子程序的調(diào)用與返回 子程序的參數(shù)傳送 子程序的嵌套與遞歸,一、 過(guò)程定義、過(guò)程調(diào)用,過(guò)程名 PROC 類(lèi)型 RET 過(guò)程名 ENDP,1. 定義,2. 調(diào) 用,CALL 過(guò)程名,3,過(guò)程定義偽操作,4,5,子程序調(diào)用:隱含使用堆棧保存返回地址 call near ptr subp (1) 保存返回地址 (2) 轉(zhuǎn)子程序 call far ptr subp (1) 保存返回地址 (2) 轉(zhuǎn)子程序 子程序返回:ret,二. 子程序的調(diào)用與返回,調(diào) 用 圖 示, CALL SUB1 , CALL SUB2 RET, RET,主程序,子程序SUB1,子程序SU
2、B2,CALL指令-段內(nèi)調(diào)用,直接尋址,間接尋址,CALL proc-name,CALL disp16, IP IP + 偏移量 IP入棧;,例:CALL SUB1,尋址方式,格 式,操 作,注:段內(nèi)調(diào)用,CS不變,CALL r16 / m16,IP入棧; IP(r16)/(m16),例:CALL BX CALL BX,CALL指令-段間調(diào)用,直接尋址,間接尋址,CALL FAR proc-name, CS入棧; IP入棧; CS 過(guò)程的段地址; IP 過(guò)程的偏移地址。,例:CALL far SUB1,尋址方式,格 式,操 作,注:DWORD PTR表明內(nèi)存操作數(shù)屬性為雙字,用于段間調(diào)用,CA
3、LL far mem32, CS入棧; IP入棧; IP (EA+1,EA) CS (EA+3,EA+2),例:CALL far BX,遠(yuǎn)過(guò)程名,RET 指令,段內(nèi):,RET,RET exp,IP出棧, IP出棧 SP SP + exp,段間 :,RET,RET exp, IP出棧 CS出棧, IP出棧 CS出棧 SP SP + exp,返回類(lèi)型,格 式,操 作,注:返回類(lèi)型由調(diào)用類(lèi)型定,三、子程序參數(shù)傳遞,參數(shù):,入口參數(shù),出口參數(shù),在子程序中被處理的數(shù)據(jù),表示子程序處理結(jié)果的數(shù)據(jù),(1) 通過(guò)寄存器傳送參數(shù) (2) 通過(guò)存儲(chǔ)器傳送參數(shù) (3) 通過(guò)堆棧傳送參數(shù)或參數(shù)地址 (4)*多個(gè)模塊之
4、間的參數(shù)傳送,軟延時(shí):指利用CPU執(zhí)行指令需要耗費(fèi)一定時(shí)間的特點(diǎn)實(shí)施的延時(shí),常用減1循環(huán)來(lái)實(shí)現(xiàn)。,例:8088CPU,主頻4.77M,每個(gè)時(shí)鐘周期為:1/4.77M = 0.21s。循環(huán)指令LOOP,當(dāng)CX不為零時(shí),執(zhí)行循環(huán)轉(zhuǎn)移分支,占用17個(gè)時(shí)鐘周期;當(dāng)CX為零時(shí),退出循環(huán),占用5個(gè)時(shí)鐘周期。如果CX初值是2801時(shí),執(zhí)行指令WAIT1:LOOP WAIT1,所需時(shí)間為:,(0.212801)17 + 0.21 5 10ms,10ms延時(shí)子程序,;子程序:DELAY ;功能:實(shí)現(xiàn)軟件延時(shí),延時(shí)單位時(shí)間為10ms ;入口參數(shù):BX,延時(shí)常數(shù),實(shí)際延時(shí)時(shí)間為:10* BX (ms) ;出口參數(shù):
5、無(wú),DELAY PROC NEAR PUSH BX ;現(xiàn)場(chǎng)保護(hù) PUSH CX WAIT0: MOV CX,2801 ;內(nèi)循環(huán)次數(shù),大小由單位時(shí)間定 WAIT1: LOOP WAIT1 ;延時(shí)10ms DEC BX JNZ WAIT0 POP CX POP BX RET DELAY ENDP,子程序說(shuō)明,子程序調(diào)用,實(shí)現(xiàn)100ms、550延時(shí),CSEG SEGMENT ASSUME CS:CSEG, MAIN PROC FAR PUSH DS SUB AX,AX PUSH AX MOV BX,10 ;延時(shí)100ms,參數(shù)賦值 CALL DELAY ;調(diào)用延時(shí)子程序 MOV BX,55 ;延時(shí)5
6、50ms,參數(shù)賦值 CALL DELAY ;調(diào)用延時(shí)子程序 RET MAIN ENDP,14,例:十六進(jìn)制到十進(jìn)制的轉(zhuǎn)換(通過(guò)寄存器傳送參數(shù)) hexidec segment ; 1610 assume cs: hexidec main proc far start: push ds sub ax, ax push ax repeat: call hexibin ; 162 call crlf call binidec ; 210 call crlf jmp repeat ret main endp hexidec ends end start,15,1 a b 5 31 61 62 35,1
7、6,例:累加數(shù)組中的元素(通過(guò)存儲(chǔ)器傳送參數(shù)) data segment ary dw 1,2,3,4,5,6,7,8,9,10 count dw 10 sum dw ? data ends code segment main proc far assume cs:code,ds:data mov ax, data mov ds, ax call proadd mov ax,4c00h int 21h main endp code ends end main,proadd proc near push ax push cx push si lea si, ary mov cx, count x
8、or ax, ax next: add ax, si add si, 2 loop next mov sum,ax pop si pop cx pop ax ret proadd endp,17,如果數(shù)據(jù)段定義如下: data segment ary dw 1,2,3,4,5,6,7,8,9,10 count dw 10 sum dw ? ary1 dw 10,20,30,40,50,60,70,80,90,100 count1 dw 10 sum1 dw ? data ends,如果直接訪問(wèn)內(nèi)存變量,那么累加數(shù)組ary 和數(shù)組ary1中的元素不能用同一個(gè)子程序 proadd。,18,例:累加
9、數(shù)組中的元素(通過(guò)地址表傳送參數(shù)地址) data segment ary dw 10,20,30,40,50,60,70,80,90,100 count dw 10 sum dw ? table dw 3 dup (?) ; 地址表 data ends code segment main proc far assume cs:code, ds:data push ds sub ax, ax push ax mov ax, data mov ds, ax mov table, offset ary mov table+2, offset count mov table+4, offset sum
10、 mov bx, offset table call proadd ret main endp,19,proadd proc near push ax push cx push si push di mov si, bx mov di, bx+2 mov cx, di mov di, bx+4 xor ax, ax next: add ax, si add si, 2 loop next mov di,ax pop di pop si pop cx pop ax ret proadd endp code ends end main,550d,20,例:累加數(shù)組中的元素(通過(guò)堆棧傳送參數(shù)地址)
11、data segment ary dw 10,20,30,40,50,60,70,80,90,100 count dw 10 sum dw ? data ends stack segment dw 100 dup (?) tos label word stack ends,21,code1 segment main proc far assume cs:code1, ds:data, ss:stack start: mov ax, stack mov ss, ax mov sp, offset tos mov ax, data mov ds, ax mov bx, offset ary pus
12、h bx mov bx, offset count push bx mov bx, offset sum push bx call far ptr proadd mov ax, 4c00h int 21h main endp code1 ends,22,(ip) (cs) sum count array,(bp)+0ah,23,多個(gè)模塊之間的參數(shù)傳送: 局部符號(hào):在本模塊中定義,在本模塊中引用的符號(hào) 外部符號(hào):在某一模塊中定義,在另一模塊中引用的符號(hào) PUBLIC 符號(hào) EXTRN 符號(hào):類(lèi)型,24,例:,; proadd1.asm extrn proadd : far data segmen
13、t common ary dw 1,2,3,4,5,6,7,8,9,10 count dw 10 sum dw ? data ends code1 segment main proc far assume cs:code1, ds:data start: mov ax, data mov ds, ax call far ptr proadd mov ah, 4ch int 21h main endp code1 ends end start,25,; proadd2.asm public proadd data segment common ary dw 1,2,3,4,5,6,7,8,9,1
14、0 count dw 10 sum dw ? data ends code2 segment proadd proc far assume cs:code2,ds:data mov ax, data mov ds, ax push ax push cx push si lea si, ary mov cx, count xor ax, ax,next: add ax, si add si, 2 loop next mov sum,ax pop si pop cx pop ax ret proadd endp code2 ends end,26,子程序的嵌套: 主程序 子程序A 子程序B,遞歸子
15、程序:n! n ( n - 1 ) ( n - 2 ) 1 3! 3 21= 6,5. 子程序的嵌套與遞歸調(diào)用,27,例:計(jì)算 n! frame struc save_bp dw ? save_cs_ip dw 2 dup(?) n dw ? result_addr dw ? frame ends ;- data segment n_v dw 3 result dw ? data ends ;- stack segment dw 128 dup (?) tos label word stack ends,0!=1 n!=n(n-1)!,28,code segment main proc far
16、 assume cs:code, ds:data, ss:stack start: mov ax, stack ;用戶堆棧地址 mov ss, ax mov sp, offset tos push ds ;保存返回DOS地址 sub ax, ax push ax mov ax, data ;數(shù)據(jù)段地址 mov ds, ax mov bx, offset result ; 結(jié)構(gòu)數(shù)據(jù)入棧 push bx mov bx, n_v push bx call far ptr fact ret main endp code ends,29,code1 segment assume cs:code1 fac
17、t proc far push bp mov bp, sp push bx push ax mov bx, bp.result_addr mov ax, bp.n cmp ax, 0 je done push bx dec ax push ax call far ptr fact mov bx, bp.result_addr mov ax, bx mul bp.n jmp short return done: mov ax,1 return: mov bx, ax pop ax pop bx pop bp ret 4 fact endp code1 ends,30,fact proc near
18、 push ax push bp mov bp, sp mov ax, bp+6 cmp ax, 0 jne fact1 inc ax jmp exit fact1: dec ax push ax call fact pop ax mul word ptrbp+6 exit: mov bp+6, ax pop bp pop ax ret fact endp,例:計(jì)算n!,主程序:,31,例:將字符串反序輸出,revers proc near push ax push bx push dx push bp mov bp,sp mov bx,bp+10 mov al,bx cmp al,$ jne
19、 re_call jmp return re_call: inc bx push bx call revers pop bx mov dl,bx mov ah,2 int 21h return: pop bp pop dx pop bx pop ax ret revers endp,mov bx, offset str push bx call revers pop bx mov dl, bx mov ah, 2 int 21h,主程序:,str db happy!,$,32,第六章作業(yè),Page 240 6.1 6.7 6.3 6.4 6.8,三、 系統(tǒng)功能調(diào)用,PC-DOS系統(tǒng)中設(shè)置兩層內(nèi)
20、部子程序供用戶使用,即DOS功能模塊和基本輸入輸出子程序BIOS。,1.DOS功能調(diào)用( DOS中斷調(diào)用) 磁盤(pán)操作系統(tǒng)DOS (disk operating system )共提供了近80個(gè)功能調(diào)用,大致分為:設(shè)備管理、文件管理和目錄管理等幾類(lèi)。一般,調(diào)用系統(tǒng)功能時(shí)總是先采用DOS層功能模塊,如果這層模塊內(nèi)容達(dá)不到要求,再進(jìn)一步調(diào)用BIOS層的子程序。DOS功能調(diào)用通過(guò)INT 21H指令來(lái)實(shí)現(xiàn)。(而不是用CALL),BIOS中斷調(diào)用,BIOS(Basic Input/Output System)是IBM-PC機(jī)的監(jiān)控程序,它固化在微型機(jī)主板的ROM中,其內(nèi)容主要有系統(tǒng)測(cè)試程序(Post)、初
21、始化引導(dǎo)程序(Boot)、I/O設(shè)備的基本驅(qū)動(dòng)程序和許多常用程序模塊,它們一般以中斷服務(wù)程序的形式存在。例如,負(fù)責(zé)顯示輸出的顯示I/O程序?yàn)?0H號(hào)中斷服務(wù)程序;負(fù)責(zé)打印輸出的打印I/O程序?yàn)?7H中斷服務(wù)程序等。,圖8.5 用戶程序和操作系統(tǒng)關(guān)系示意圖,上圖是用戶程序和操作系統(tǒng)關(guān)系示意圖,由圖可見(jiàn)BIOS程序直接建立在硬件基礎(chǔ)上,磁盤(pán)操作系統(tǒng)(disk operating system DOS)建立在BIOS基礎(chǔ)上,各種高級(jí)語(yǔ)言則建立在操作系統(tǒng)基礎(chǔ)上。用戶程序可以使用高級(jí)語(yǔ)言,也可以調(diào)用DOS或其他操作系統(tǒng),還可以調(diào)用BIOS,甚至直接指揮硬件設(shè)備。 通常應(yīng)用程序調(diào)用DOS提供的系統(tǒng)功能,完成輸入/輸出或其他操作,這樣做用戶可以少考慮硬件,實(shí)現(xiàn)起來(lái)容易。,DOS功能調(diào)用,如何用DOS功能調(diào)用實(shí)現(xiàn): 通過(guò)顯示器輸出一個(gè)字符; DOS顯示功能調(diào)用 通過(guò)鍵盤(pán)輸入一個(gè)字符; DOS鍵盤(pán)功能調(diào)用 通過(guò)顯示器輸出一個(gè)字符串;DOS顯示功能調(diào)用
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年電力調(diào)度員考試題電力負(fù)荷預(yù)測(cè)與調(diào)度決策
- 2026年項(xiàng)目管理師面試實(shí)操題及答案參考
- 2026年區(qū)塊鏈技術(shù)與應(yīng)用考試題庫(kù)前沿知識(shí)全解析
- 2026年股票投資基礎(chǔ)與實(shí)戰(zhàn)技巧模擬試題
- 2026年醫(yī)學(xué)專(zhuān)業(yè)研究生入學(xué)考試生物化學(xué)題庫(kù)
- 2026年旅游策劃師培訓(xùn)題庫(kù)與答案解析
- 水電站備用電源設(shè)計(jì)方案
- 工地施工現(xiàn)場(chǎng)自動(dòng)化管理系統(tǒng)方案
- 建筑垃圾再生骨料生產(chǎn)技術(shù)方案
- 幕墻系統(tǒng)集成設(shè)計(jì)方案
- 社保專(zhuān)員工作述職報(bào)告
- DB15∕T 2385-2021 草原退化評(píng)價(jià)技術(shù)規(guī)程
- 焦化廠儀表工崗位考試試卷及答案
- 餐廳充值服務(wù)合同范本
- 2025年汽車(chē)洗滌器總成行業(yè)分析報(bào)告及未來(lái)發(fā)展趨勢(shì)預(yù)測(cè)
- 麻疹知識(shí)培訓(xùn)內(nèi)容總結(jié)
- 2025年低空經(jīng)濟(jì)無(wú)人機(jī)災(zāi)害預(yù)警行業(yè)報(bào)告
- 高考語(yǔ)文強(qiáng)基試卷及答案
- 五岳課件教學(xué)課件
- 2025年國(guó)家公務(wù)員考試公共基礎(chǔ)知識(shí)模擬試卷及答案(共五套)
- 雨污分流監(jiān)理工作總結(jié)報(bào)告
評(píng)論
0/150
提交評(píng)論