子程序与宏指令设计

上传人:206****923 文档编号:56816725 上传时间:2018-10-16 格式:PPT 页数:129 大小:627KB
返回 下载 相关 举报
 子程序与宏指令设计_第1页
第1页 / 共129页
 子程序与宏指令设计_第2页
第2页 / 共129页
 子程序与宏指令设计_第3页
第3页 / 共129页
 子程序与宏指令设计_第4页
第4页 / 共129页
 子程序与宏指令设计_第5页
第5页 / 共129页
点击查看更多>>
资源描述

《 子程序与宏指令设计》由会员分享,可在线阅读,更多相关《 子程序与宏指令设计(129页珍藏版)》请在金锄头文库上搜索。

1、第六章 子程序与宏指令设计,为了程序共享或模块化设计的需要,可以把一段公共语句序列设计成子程序或宏指令的形式。,6.1 子程序结构及设计方法 6.2 子程序参数传递 6.3 嵌套与递归子程序 6.4 宏 指 令 6.5 宏指令库 6.6 重复伪指令 6.7 条件伪指令,6.1 子程序结构及设计方法,6.1.1 含有子程序的程序结构在汇编语言中用过程定义伪指令定义子程序。过程定义伪指令格式:过程名 PROC 属型过程名 ENDP,1调用程序和子程序在同一个代码段的程序结构(子程序类型可缺省,注意END后必须跟主程序名)CODE SEGMENTMAIN PROC FARCALL SUB1RETMA

2、IN ENDPSUB1 PROC RETSUB1 ENDPCODE ENDSEND MAIN,2调用程序和子程序在不同段的程序结构 (SUB2既被段间调用又被段内调用,必须是FAR属性。CALL要显式说明是FAR属性)CODE1 SEGMENT MAIN PROC FARCALL FAR PTR SUB2RETMAIN ENDPCODE1 ENDSCODE2 SEGMENTSUB1 PROC FAR CALL FAR PTR SUB2RETSUB1 ENDPSUB2 PROC FAR RETSUB2 ENDPCODE2 ENDSEND MAIN,6.1.2 设计子程序时应注意的问题1子程序说明

3、 2寄存器的保存与恢复 3密切注意堆栈状态,6.2 子程序参数传递,可以通过给子程序传递参数使其更通用。常用的参数传递方法如下:通过寄存器传递;若调用程序和子程序在同模块(源程序)中,子程序可以直接访问模块中的变量;通过地址表传递参数地址;通过堆栈传递参数或参数地址。,6.2.1 通过寄存器传递这种传递方式使用方便,适用于参数较少的情况。例1把BX中的16位二进制数转换成十进制并显示在屏幕上。,STASG SEGMENTDW 32 DUP(?) STASG ENDS CODE SEGMENTASSUME CS:CODE MAIN PROC FARMOV BX,162EHCALL TERN MO

4、V AX,4C00HINT 21H MAIN ENDP,程序6.3,TERN PROC ;二十并显示。MOV CX,10000CALL DEC_DIV ;转换万位数MOV CX,1000CALL DEC_DIV ;转换千位数MOV CX,100CALL DEC_DIV ;转换百位数MOV CX,10CALL DEC_DIV ;转换十位数MOV CX,1CALL DEC_DIV ;转换个位数RET TERN ENDP,DEC_DIV PROC ;CX中为十进制的位权MOV AX,BXMOV DX,0DIV CX ;商为转换后的一位十进制数MOV BX,DXMOV DL,ALADD DL,30H

5、;转换成ASCII码MOV AH,2 ;显示INT 21HRET DEC_DIV ENDP CODE ENDSEND MAIN,6.2.2 同模块中的子程序可直接访问模块中的变量若调用程序和子程序在同模块中,子程序可以直接访问模块中的变量。例2实现数组求和功能。要求数组求和(不考虑溢出情况)由子程序实现,其数组元素及结果均为字型数据。见程序6.4。,STACKSG SEGMENT STACK STKDW 32 DUP(S)STACKSG ENDSDATA SEGMENTARY DW 1,2,3,4,5,6,7,8,9,10COUNT DW ($-ARY)/2 ;数组元素个数SUM DW ? ;

6、数组和的地址DATA ENDS,程序6.4,CODE1 SEGMENT MAIN PROC FARASSUME CS:CODE1,DS:DATAPUSH DSXOR AX,AXPUSH AXMOV AX,DATAMOV DS,AXCALL FAR PTR ARY_SUMRET MAIN ENDP CODE1 ENDS,CODE2 SEGMENTASSUME CS:CODE2 ARY_SUM PROC FAR ;数组求和子程序PUSH AX ;保存寄存器PUSH CXPUSH SILEA SI,ARY ;取数组起始地址MOV CX,COUNT ;取元素个数XOR AX,AX ;清0累加器,NEX

7、T: ADD AX,SI ;累加和ADD SI,TYPE ARY ;修改地址指针LOOP NEXTMOV SUM,AX ;存和POP SI ;恢复寄存器POP CXPOP AXRET ARY_SUM ENDP CODE2 ENDSEND MAIN,6.2.3 通过地址表传递参数地址适用于参数较多的情况。具体方法是先建立一个地址表,该表由参数地址构成。然后把表的首地址通过寄存器或堆栈传递给子程序。例3编写一个数组求和子程序,其数组元素及结果均为字型数据。另定义两个数组,并编写一个主程序,通过调用数组求和子程序分别求出两个数组的和。见程序6.5。,程序6.5,STACKSG SEGMENT STA

8、CK STKDW 32 DUP(S) STACKSG ENDS DATA SEGMENT ARY DW 1,2,3,4,5,6,7,8,9,10 ;数组1 COUNT DW ($-ARY)/2 ;数组1的元素个数 SUM DW ? ;数组1的和地址 NUM DW 10,20,30,40,50 ;数组2 CT DW ($-NUM)/2 ;数组2的元素个数 TOTAL DW ? ;数组2的和地址 TABLE DW 3 DUP(?) ;地址表 DATA ENDS,CODE1 SEGMENTMAIN PROC FARASSUME CS:CODE1,DS:DATAPUSH DSXOR AX,AXPUSH

9、 AXMOV AX,DATAMOV DS,AX ;构造数组1的地址表MOV TABLE,OFFSET ARYMOV TABLE+2,OFFSET COUNTMOV TABLE+4,OFFSET SUMLEA BX,TABLE ;传递地址表首地址CALL FAR PTR ARY_SUM,;构造数组2的地址表MOV TABLE,OFFSET NUMMOV TABLE+2,OFFSET CTMOV TABLE+4,OFFSET TOTALLEA BX,TABLE;传递地址表的首地址CALL FAR PTR ARY_SUM;段间调用调用数组求和子程序RET MAIN ENDP CODE1 ENDS,C

10、ODE2 SEGMENTASSUME CS:CODE2 ARY_SUM PROC FAR ;数组求和子程序PUSH AX ;保存寄存器PUSH CXPUSH SIPUSH DI MOV SI,BX ;取数组起始地址MOV DI,BX+2 ;取元素个数地址MOV CX,DI ;取元素个数MOV DI,BX+4 ;取结果地址XOR AX,AX ;清0累加器,NEXT: ADD AX,SI ;累加和ADD SI,TYPE ARY ;修改地址指针LOOP NEXTMOV DI,AX ;存和POP DI ;恢复寄存器POP SIPOP CXPOP AXRET ARY_SUM ENDP CODE2 END

11、SEND MAIN,6.2.4 通过堆栈传递参数或参数地址这种方式适用于参数较多,或子程序有多层嵌套、递归调用的情况。 步骤: 主程序把参数或参数地址压入堆栈; 子程序使用堆栈中的参数或通过栈中参数地址取到参数; 子程序返回时使用RET n指令调整SP指针,以便删除堆栈中已用过 的参数,保持堆栈平衡,保证程序的正确返回。,例4完成数组求和功能,求和由子程序实现,要求通过堆栈传递参数地址。STACKSG SEGMENT STACK STKDW 16 DUP(?)STACKSG ENDSDATA SEGMENTARY DW 1,2,3,4,5,6,7,8,9,10COUNT DW ($-ARY)/

12、2SUM DW ?DATA ENDS,程序6.6,CODE1 SEGMENT MAIN PROC FARASSUME CS:CODE1,DS:DATAPUSH DS ;XOR AX,AXPUSH AX ;MOV AX,DATAMOV DS,AX,LEA BX,ARYPUSH BX ;压入数组起始地址LEA BX,COUNTPUSH BX ;压入元素个数地址LEA BX,SUMPUSH BX ;压入和地址CALL FAR PTR ARY_SUM;调用求和子程序RET ; MAIN ENDP CODE1 ENDS,CODE2 SEGMENTASSUME CS:CODE2 ARY_SUM PROC

13、FAR ;数组求和子程序PUSH BP ;保存BP值MOV BP,SP ;BP是堆栈数据的地址指针PUSH AX ;保存寄存器内容PUSH CX ;PUSH SI ;PUSH DI ;MOV SI,BP+10 ;得到数组起始地址MOV DI,BP+8 ;得到元素个数地址MOV CX,DI ;得到元素个数MOV DI,BP+6 ;得到和地址XOR AX,AX,NEXT: ADD AX,SI ;累加ADD SI,TYPE ARY ;修改地址指针LOOP NEXTMOV DI,AX ;存和POP DI ;恢复寄存器内容POP SI ;POP CX ; POP AX ;POP BP ;RET 6 ;返

14、回并调整SP指针 ARY_SUM ENDP CODE2 ENDSEND MAIN,返回,程序6.6中所有入栈操作对堆栈的影响,返回,程序6.6中主程序的RET执行前堆栈状态,例5完成数组求和功能,其中求和由子程序实现,要求使用结构访问堆栈中的参数。编码见程序6.7。,返回,SS,SP,BP,程序6.7的堆栈及结构数据示意图,结构,程序6.7,STACKSG SEGMENT STACK STKDW 16 DUP(S) STACKSG ENDS DATA SEGMENT ARY DW 1,2,3,4,5,6,7,8,9,10 COUNT DW ($-ARY)/2 SUM DW ? DATA END

15、S,CODE1 SEGMENT MAIN PROC FARASSUME CS:CODE1,DS:DATAPUSH DSXOR AX,AXPUSH AXMOV AX,DATAMOV DS,AX,LEA BX,ARYPUSH BX ;压入数组起始地址LEA BX,COUNTPUSH BX ;压入元素个数地址LEA BX,SUMPUSH BX ;压入和地址CALL FAR PTR ARY_SUMRET MAIN ENDP CODE1 ENDS,CODE2 SEGMENTASSUME CS:CODE2 STACK_STRC STRUC ;定义结构 SAVE_BP DW ? SAVE_CS_IP DW 2 DUP(?) SUM_ADDR DW ? COUNT_ADDR DW ? ARY_ADDR DW ? STACK_STRC ENDS,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号