电气知识|子程序的嵌套

   更新日期:2017-03-26     来源:建材之家    作者:安防之家    浏览:43    评论:0    
核心提示:一、子程序的嵌套 一个子程序作为调用程序去调用另一个子程序的情况称为子程序的嵌套。 嵌套深度:嵌套的层数称为嵌套深度。不受限制。 嵌套子程序的设计:没有什么特殊要求,除子程序的调用和返回应正确使用CALL和RET指令外,要注意寄存器的保护和恢复。如用堆栈传送数据要避免因堆栈使用中的溢出问题而造成子程序不能正确返回的错误。有两种可能发生堆栈溢出的情况:

2017款较新中空玻璃设备已推进河北市场

推荐简介:感谢石家庄杨总和赵总对博因数控的支持与认可采购中空玻璃设备一套(1800内外合生产线,丁基胶涂布机,全自动中空玻璃封胶线,还有辅助设备铝条切割锯,砂带磨边机设备)由于客户订货周期较短,博因人也是在保证设备质量的前提下加班加点生产并连夜发货,下图为中空玻璃生产线发货照片山东博因数控机械有限公司  电话:***联系人:巩经理手机:***优质的产品, 良好的服务,为广大用户创造更大的价值★博因数控承......
安防之家讯:一、子程序的嵌套

一个子程序作为调用程序去调用另一个子程序的情况称为子程序的嵌套。

嵌套深度:嵌套的层数称为嵌套深度。不受限制。

嵌套子程序的设计:没有什么特殊要求,除子程序的调用和返回应正确使用CALL和RET指令外,要注意寄存器的保护和恢复。如用堆栈传送数据要避免因堆栈使用中的溢出问题而造成子程序不能正确返回的错误。有两种可能发生堆栈溢出的情况:

堆栈上溢:如堆栈已满,但还想再存入信息,这种情况称为堆栈上溢。

堆栈下溢:如堆栈已空,但还想再取出信息,这种情况称为堆栈下溢。

递归子程序:子程序自己调用自己的情况称为递归调用,这种子程序称为递归子程序

二、嵌套深度

图1表示了嵌套深度为2时的子程序嵌套情况。



例1两个6字节数相加。

分析:将一个字节相加的程序段设计为子程序。主程序分3次调用该子程序,但每次调用的参数不同。

程序如下:

DATASEGMENT

ADD1DBFEH,86H,7CH,35H,68H,77H

ADD2DB45H,BCH,7DH,6AH,87H,90H

SUMDB 6DUP(0)

COUNTDB6

DATAENDS

STACKSEGMENT

DB100DUP(?)

STACKENDS

CODESEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

MADD: MOV AX,DATA

MOV DS,AX

MOV AX,STACK

MOV SS,AX

MOV SI,OFFSET ADD1

MOV DI,OFFSET ADD2

MOV BX,OFFSETSUM

MOV CX,COUNT;循环初值为6

CLC

AGAIN:CALLSUBADD;调用子程序

LOOP AGAIN;循环调用6次

MOV AX,4C00H

INT21H

;子程序入口参数:SI,DI,BX出口参数:SI,DI,BX

SUBADD PROC;完成一个字节相加

PUSH AX ;保护AX的值

MOV AL,[SI];SI是一个源操作数指针

ADC AL,[DI];DI是另一个源操作数指针

MOV [BX],AL;BX是结果操作数指针

INCSI

INCDI

INCBX

POPAX ;恢复AX的值

RET

SUBADD ENDP

CODEENDS

ENDMADD

例2把内存中的字变量NUMBER的值,转换为4个ASCII码表示的十六进制数码串,串的起始地址为STRING。

分析:把内存中的字变量NUMBER的值,转换为4个ASCII码表示的十六进制数码串的工作设计成一个子程序,在这个子程序中再调用另一个子程序,由它完成从BCD码到ASCII码的转换。

程序如下:

DATASEGMENT

NUMBER DW25AFH

STRINGDB 4DUP(?),0DH,0AH,‘$’ 

DATAENDS

CODESEGMENT

ASSUME CS:CODE,DS:DATA

BEGIN: MOV AX,DATA

MOV DS,AX

MOV ES,AX

LEA BX,STRING

PUSH BX ;将参数(结果地址指针)压入堆栈

PUSH NUMBER;将源数据压入堆栈

CALL BINHEX ;调用子程序

LEA DI,STRING

MOV AH,9

INT21H

BINHEXPROC 

PUSH BP

MOV BP,SP

PUSH AX

PUSH DI

PUSH CX

PUSH DX

PUSHF;以上为保护现场

MOV AX,[BP+4] ;取出NUMBER

MOV DI,[BP+6];取出STRING的偏移地址

ADD DI,LENGTH STRING-1 ;使DI指向转换数据

MOV DX,AX;保护原始数据

MOV CX,4

AGAIN: AND AX,0FH ;取低4位

CALL HEXD;调子程序

STD

STOSB;保护转换数据

PUSH CX ;保护CX的值

MOV CL,4

SHRDX,CL

MOV AX,DX

POPCX

LOOP AGAIN

POPF

POPDX

POPCX

POPDI

POPAX

POPBP

RET4

BINHEXENDP

HEXDPROC ;将AL中的BCD码转换成ASCII码

CMP AL,0AH

JLADDZ

ADD AL,’a’-‘0’-0AH ;小写字母转换成ASCII码,若为大写

ADDZ: ADD AL,‘0’ ;字母,则再加ADDAL,7

RET

HEXDENDP

CODEENDS

EDN BEGIN

例6.3 数的阶乘 1

按照阶乘的定义 n!=n*(n-1)!

这是一个递归定义式,可采用子程序的的递归调用形式。程序如下:

DATASEGMENT

NUMDB5

FNUMDW?

DATAENDS

STACKSEGMENT

DB 100DUP(?)

STACKENDS

CODESEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK

BEGIN: PUSH DS

MOV AX,0

PUSH AX

MOV CX,1

PUSH CX

MOV AH,0

MOV AL,NUM

CALL FACTOR

MOV FNUM,AX

POPCX

MOV AX,4C00H

INT21H

FACTORPROC

CMP AX,0

JNZIIA

MOV DL,1

RET

IIA:PUSH AX

DEC AL

CALL FACT

IIA1:POPCX

MUL CL ;CALLMULT

IIA2:MOV DX,AX

RET

FACTORENDP

CODEENDS

END BEGIN

安防之家专注于各种家居的安防,监控,防盗,安防监控,安防器材,安防设备的新闻资讯和O2O电商导购服务,敬请登陆安防之家:http://anfang.jc68.com/
小程序码
 
打赏
 
更多>文章标签:监控
更多>同类安防监控资讯
0相关评论

推荐图文更多...
点击排行更多...
安防监控商机更多...
安防监控圈更多...
最新视频更多...
推荐产品更多...
陶瓷头条 | 空调头条 | 卫浴头条 | 洁具头条 | 油漆头条 | 涂料头条 | 地板头条 | 吊顶头条 | 衣柜头条 | 家居头条 | 博一建材 | 博一建材 | 建材群站 | 建材资讯 | 建材商机 | 建材产品 | 水泥头条 | 楼梯之家 | 门窗之家 | 老姚之家 | 灯饰之家 | 电气之家 | 全景头条 | 照明之家 | 防水之家 | 防盗之家 | 区快洞察 | 漳州建材 | 泉州建材 | 三明建材 | 莆田建材 | 合肥建材 | 宣城建材 | 池州建材 | 亳州建材 | 六安建材 | 巢湖建材 | 宿州建材 | 阜阳建材 | 滁州建材 | 黄山建材 | 安庆建材 | 铜陵建材 | 淮北建材 | 马鞍山建材 |
建材 | 双碳之家 | 企业之家 | 移动社区 | 关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图 | 排名推广 | 广告服务 | 积分换礼 | RSS订阅 | sitemap | 粤ICP备14017808号
(c)2015-2017 Bybc.cn SYSTEM All Rights Reserved
Powered by 安防之家