




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第7章 子程序設計,7.1子程序設計方法,7.1.1 子程序的定義、調(diào)用與返回 1. 子程序的定義 子程序的定義是由子程序(過程)定義偽指令PROC和ENDP來完成的。其格式如下: 過程名 PROC NEAR/FAR 過程名 ENDP 其中PROC表示過程定義開始,ENDP表示過程定義結束。過程名是過程入口地址的符號表示。,2. 子程序的調(diào)用和返回指令 (1)子程序的調(diào)用指令CALL CALL指令實現(xiàn)調(diào)用子程序的功能。根據(jù)主程序與子程序在內(nèi)存中所處的位置關系和使用不同的尋址方式,可以分為段內(nèi)直接、段內(nèi)間接、段間直接、段間間接4種調(diào)用方式。 段內(nèi)直接調(diào)用 格式:CALL子程序名 功能:程序轉(zhuǎn)到子
2、程序處執(zhí)行。SP SP-2,SS:SP IP(保存16位返回地址),IP 子程序入口的偏移地址 例如:CALLPROC1 ,其中PROC1就是一個子程序名。, 段內(nèi)間接調(diào)用 格式:CALLREG16/MEM16 功能:子程序的目標地址存放在16位的寄存器或者存儲單元中。SP SP-2,SS:SP IP(保護16位返回地址),IP REG16/MEM16。 例如:LEA CX,PROC1 CALL CX 或 ADDR_PROC1 DW PROC1;子程序偏移地址放入存儲器字變量 CALLADDR_PROC1;調(diào)用子程序PROC1, 段間直接調(diào)用 格式:CALL 子程序名 功能:子程序和主程序在不
3、同的段中。SP SP-2,SS:SP CS,SP SP-2,SS:SP IP(保存32位返回地址,偏移地址保存在較小地址處),IP 子程序入口的偏移地址,CS 子程序入口的段基址。 例如:CALL PROC2, 段間間接調(diào)用 格式:CALLMEM32 功能:SP SP-2,SS:SP CS,SP SP-2,SS:SP IP,IP MEM32,CSMEM32+2。目標地址必須為雙字存儲單元,高地址字的內(nèi)容為子程序所在段的段基地址,低地址字的內(nèi)容為相應段的偏移地址。 例如:ADD_PROC2 DD PROC2;子程序入口地址放入存儲器雙字變量 CALLADD_PROC2 ;調(diào)用子程序PROC2,(
4、2)子程序返回指令RET RET指令用于實現(xiàn)結束子程序的執(zhí)行返回主程序,一般放在子程序的末尾。 無參數(shù)段內(nèi)返回 格式:RET 功能:IP SS: SP,SP SP+2。 有參數(shù)段內(nèi)返回 格式:RET N 功能:IP SS:SP,SP SP+2,SP SP+N。 無參數(shù)段間返回 格式:RET 功能:IP SS:SP,SP SP+2,CS SS:SP,SP SP+2。 有參數(shù)段間返回 格式:RET N 功能:IP SS:SP,SP SP+2,CS SS:SP,SP SP+2,SP SP+N。,(3)現(xiàn)場保護 CPU中的寄存器是大家共有的,如果主程序和子程序使用了同一個寄存器,那么該寄存器進入子程序
5、前和從子程序返回后,其內(nèi)容可能會發(fā)生變化,進而可能造成程序運行錯誤。 所以,我們在子程序的一開始就應該將子程序中有可能用到的寄存器的值壓入堆棧保護起來(保護現(xiàn)場),在子程序返回之前再將這些值從堆棧中彈出到相應的寄存器中(恢復現(xiàn)場)。以保證寄存器的內(nèi)容在子程序調(diào)用前后不會發(fā)生變化。,于是,子程序的基本格式如下: 子程序名 PROCNEAR/FAR PUSH;保護現(xiàn)場(寄存器/存儲器) PUSH;個數(shù)根據(jù)具體情況決定 ;子程序主體 POP ;恢復現(xiàn)場,注意出棧次序 POP ; 先進棧的寄存器后出棧 RET;返回 子程序名 ENDP,例如,一個子程序SUB中要用到AX、BX、CX寄存器,則應該按如下
6、方式來編寫子程序: SUBPROC PUSHAX PUSHBX PUSHCX POPCX POPBX POPAX RET SUBENDP,7.1.2 子程序的參數(shù)傳遞方法及應用舉例 1用寄存器傳遞參數(shù) 把參數(shù)的值放在約定的寄存器傳遞給子程序,或者,由子程序返回給主程序。寄存器傳遞參數(shù)是匯編語言中最常見的也是最簡單的方法。由于寄存器個數(shù)有限,這種方法對少量數(shù)據(jù)可以直接傳遞數(shù)值,而對大量數(shù)據(jù)只能傳遞地址。 例7.1 已知兩個數(shù)組:ARRRAY1和ARRAY2,要求對兩個數(shù)組分別求和,結果存入SUM1和SUM2中。 在本例中,可以把指定數(shù)組的符號地址存入寄存器SI中帶入子程序中,結果由AX寄存器帶回
7、并存入SUM1和SUM2中。,DATASEGMENT ARRAY1DW1,3,4,5,7,9 LEN1EQU$-ARRAY1;定義數(shù)組ARRAY1所占的存儲單元數(shù) ARRAY2DW2,4,6,8 LEN2EQU$-ARRAY2;定義數(shù)組ARRAY2所占的存儲單元數(shù) SUM1DW? SUM2DW? DATAENDS CODESEGMENT ASSUMECS:CODE,DS:DATA MAINPROCNEAR MOVAX,DATA MOVDS,AX MOVCX,LEN1/2;將數(shù)組ARRAY1的長度(字數(shù))存入CX LEASI,ARRAY1;將數(shù)組ARRAY1的首地址存入SI MOVAX,0;累加
8、器清0 CALLSUM;調(diào)用子程序SUM MOVSUM1,AX;將數(shù)組ARRAY1的元素之和存入SUM1 MOVCX,LEN2/2;將數(shù)組ARRAY2的長度(字數(shù))存入CX LEASI,ARRAY2;將數(shù)組ARRAY2的首地址存入SI,MOVAX,0;累加器清0 CALLSUM;調(diào)用子程序SUM MOVSUM2,AX;將數(shù)組ARRAY2的元素之和存入SUM2 MOVAH,4CH INT21H MAINENDP SUMPROCNEAR LOOP1:ADDAX,SI ADDSI,2 LOOPLOOP1 RET SUMENDP CODE ENDS ENDMAIN,2用內(nèi)存單元傳遞參數(shù) 這種方法是在主
9、程序中建立存儲區(qū)域,把要傳送給子程序的參數(shù)都存放其中,子程序從中取出參數(shù),再將運算結果放入主程序指定的存儲單元中。 例7.2 字符串的屏幕顯示。 STACK SEGMENTSTACK DW100H DUP (?) STACK ENDS DATA SEGMENT STRING DBABCDEFG,00H ADDR1 DW? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MAINPROCNEAR MOVAX,DATA MOVDS,AX MOVAX,OFFSETSTRING MOVADDR1,AX;用內(nèi)存單元ADDR1傳遞參數(shù) CALL
10、DISPLAY;調(diào)用顯示子程序DISPLAY MOVAH,4CH INT21H MAINENDP,DISPLAYPROC PUSHAX PUSHDX PUSHSI;保護現(xiàn)場 MOVSI,ADDR1 DISP1: MOVAL,SI;取字符串中的數(shù)據(jù) CMPAL,0 JZDISPEXIT;已經(jīng)到串最后 MOVDL,AL;顯示一個ASCII字符 MOVAH,2 INT21H INCSI;指向下一個字符 JMPDISP1 DISPEXIT:MOVDL,0DH;顯示回車換行 MOVAH,2 INT21H MOVDL,0AH MOVAH,2 INT21H POPSI;恢復現(xiàn)場 POPDX POPAX RE
11、T DISPLAYENDP CODEENDS ENDMAIN,3. 用堆棧傳遞參數(shù) 使用堆棧傳遞參數(shù)時,首先在調(diào)用子程序之前將參數(shù)壓入堆棧,在子程序中通過基址尋址獲得壓入堆棧的參數(shù),子程序處理后的結果也送入堆棧保存。返回主程序后,再通過堆棧彈出指令取出結果。它特別適合于不同模塊之間過程的參數(shù)傳遞。 例7.3 同例題7.2,但通過堆棧來傳送字符串的首地址。 STACK SEGMENTSTACK DW100H DUP (?) STACK ENDS DATASEGMENT STRING DBABCDEFG,00H ADDR1 DW? DATAENDS CODESEGMENT ASSUME CS:CO
12、DE,DS:DATA,SS:STACK MAIN PROCNEAR MOVAX,DATA MOVDS,AX MOVAX,OFFSETSTRING PUSHAX;將字符串首地址壓入堆棧 CALLDISPLAY;調(diào)用顯示子程序DISPLAY MOVAH,4CH INT21H MAIN ENDP,DISPLAYPROC PUSHAX;保護現(xiàn)場 PUSHBP PUSHDX PUSHSI MOVBP,SP MOVSI,BP+8;字符串的首地址送入SI DISP1: MOVAL,SI;取字符串中的數(shù)據(jù) CMPAL,0 JZDISPEXIT;已經(jīng)到串最后 MOVDL,AL;顯示一個ASCII字符 MOVAH
13、,2 INT21H INCSI;指向下一個字符 JMPDISP1 DISPEXIT: MOVDL,0DH;顯示回車換行 MOVAH,2 INT21H MOVDL,0AH MOVAH,2 INT21H POPSI POPDX POPBP;恢復現(xiàn)場 POPAX RET DISPLAYENDP CODEENDS ENDMAIN,7.2 宏 7.2.1 宏定義與宏結束指令 1.定義宏 (1)不帶參數(shù)的宏定義 MNAME MACRO 宏體 ENDM (2)帶參數(shù)的宏定義 MNAME MACRO DUMPAR1,DUMPAR2 宏體 ENDM,2.宏調(diào)用與宏展開 一個具有獨立功能的程序段被定義為宏以后,就
14、可以在源程序中調(diào)用了。在操作碼段寫上宏名,也就是使用宏指令,稱為宏調(diào)用。 對于帶參數(shù)的宏調(diào)用,PAR1,PAR2,是實參。實參與形參的意義和出現(xiàn)次序必須一致,但參數(shù)的個數(shù)不一定相等。當實參多于形參時,多余的實參被忽略。當實參少于形參時,則多余的形參被忽略。,例7.4字變量加法 DSEGSEGMENT V1 DW 1234H V2 DW 1111H V3 DW ? DSEG ENDS SSEG SEGMENT STACK STK DB 20 DUP(0) SSEG ENDS CSEG SEGMENT ASSUME DS:DSEG,SS:SSEG,CS:CSEG DADD MACRO X,Y,Z
15、;宏定義 PUSH AX MOVAX,X ADDAX,Y MOV Z,AX POPAX ENDM,START:MOVAX,DSEG MOVDS,AX MOVAX,SSEG MOV SS,AX MOV SP,LENGTH STK DADD V1,V2,V3 ;宏調(diào)用 MOV AH,4CH INT21H CSEGENDS ENDSTART,宏展開: +PUSH AX +MOV AX,V1 +ADD AX,V2 +MOV V3,AX +POP AX,3.宏指令的有效范圍 宏指令的優(yōu)先級最高??梢远x與指令助記符、偽操作同名的宏,此時,同名機器指令或偽操作失效。只有用PURGE偽操作取消宏定義,才能恢
16、復同名機器指令或偽操作的原始含義。PURGE偽操作可同時取消多個宏定義,被取消的宏名之間用逗號分隔。 格式為:PURGE MNAME1 ,MNAME2,MNAME3 其中:MNAME1,MNAME2,MNAME3,是宏定義名,多個將被取消的宏定義名用逗號分開。,4.宏庫 如果希望某些宏定義能被多個程序調(diào)用,可以將這些宏定義放在一起以庫文件的形式存放起來,這個庫文件就是宏庫。當一個源程序需要使用這些宏定義時,可以在程序中使用INCLUDE偽指令,其語句格式為:INCLUDE HNAME。其中HNAME是庫文件名,其擴展名為.LIB。 宏匯編程序在匯編源程序時,如遇到INCLUDE偽指令,就將它指
17、定的庫文件的內(nèi)容掃描一遍,如同在源程序中進行庫中的宏定義一樣,因而其后的程序可以直接調(diào)用庫中的宏定義。,7.2.2 參數(shù)的使用 (1)在宏定義、宏調(diào)用的參數(shù)中,經(jīng)常使用的宏操作符有4個: 連接操作符& &操作符在宏定義體中可以作為形參的前綴,宏展開時將&前后兩個符號連接形成一個符號。這個連接后的符號可以是指令助記符、操作數(shù)或是一個字符串。 文本操作符 在宏調(diào)用時,有的實參含空格或逗號,這時就必須使用文本操作符把一個完整的實參括起來,作為一個單一的實參。 表達式操作符% %操作符在宏調(diào)用時用在實參的前面,格式是:%表達式 匯編語言用%后表達式的值而不是表達式文本來取代對應的形參。 字符操作符!
18、!操作符用在宏調(diào)用中,格式是:!宏操作符 !操作符告訴宏匯編程序,其后的字符不作操作符使用,而是以字符本身的意義進行處理。如“!%”表示“%”不是表達式操作符,而是一個百分號。,(2)與宏中形參字符串對應的實參可以是數(shù)值、指令、寄存器名、存儲單元名以及用尋址方式能找到的地址或表達式等。 如例7.4中的V1、V2可能是存儲數(shù)值的內(nèi)存單元地址,也可能是用等價定義偽指令定義的數(shù)值;V3可能是內(nèi)存單元地址。 例7.5加減法運算。參數(shù)OP代表指令。,宏定義: MOP MACROOP,X,Y,Z PUSHAX MOVAX,X OP AX,Y MOV Z,AX POP AX ENDM,宏調(diào)用及宏展開: MO
19、P ADD,DA1,DA2, +PUSH AX +MOV AX,DA1 +ADD AX,DA2 +MOVWORD PTR RES,AX +POP AX MOP SUB,DA1+2,DA2+2, +PUSH AX +MOV AX,DA1+2 +SUB AX,DA2+2 +MOV WORD PTR RES+2,AX +POP AX,例7.6 寄存器循環(huán)移位。參數(shù)DIR代表指令的一部分,參數(shù)REG代表寄存器。 宏定義: REGROL MACRODIR,REG,CNT MOV CL,CNT RO&DIR REG,CL ENDM 宏調(diào)用及宏展開: REGROL L,AX,8 +MOV CL,8 +ROL AX,CL REGROL R,BL,4 +MOV CL,4 +ROR BL,CL,7.2.3 宏中的標號處理 在一個源程序中使用的標號必須惟一,這是編寫匯編語言源
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 藝術培訓學校課程研發(fā)工作總結范文
- 污水管網(wǎng)工程施工分階段計劃
- 快遞分揀中心夏季防暑降溫措施指南他
- 滿分之路:分離定律中特殊遺傳現(xiàn)象分析(含解析)
- 房地產(chǎn)開發(fā)施工風險管理措施
- 教師科研與師德師風心得體會
- 2025年小學語文線上教師成長計劃
- 九年級數(shù)學實踐活動教學計劃
- 四年級上冊數(shù)學教研組校園文化建設計劃
- 城市交通綜合體2025年工作總結及規(guī)劃計劃
- 銀行貿(mào)易融資業(yè)務介紹
- 弱電簡單維修方案
- AutoCAD 2020中文版從入門到精通(標準版)
- gkg全自動印刷機評估報告
- 隆基樂葉光伏板560檢測報告
- 學校財務人員述職報告范文
- 履帶式微耕機的結構設計說明書
- 一種鰭狀結型場效應晶體管及其制備方法、芯片與流程
- 設備安裝施工方案完整版
- 基于PLC的智能車庫門系統(tǒng)設計
- 【2023有效教學設計原理、策略與評價讀書報告3600字】
評論
0/150
提交評論