安防监控知识
电气知识|子程序的嵌套
2017-02-17  浏览:61
安防之家讯:一、子程序的嵌套

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

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

嵌套子程序的设计:没有什么特殊要求,除子程序的调用和返回应正确使用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评
  • 评论登陆
  • 移动社区 天花之家 木门之家 灯具之家 铁艺之家 幕墙之家 五金头条 楼梯头条 墙纸头条 壁纸头条 玻璃头条 老姚之家 灯饰之家 电气之家 全景头条 照明之家 防水之家 防盗之家 区快洞察 建材 枣庄建材 临沂建材 南昌建材 上饶建材 抚州建材 宜春建材 吉安建材 赣州建材 鹰潭建材 新余建材 九江建材 萍乡建材 景德镇陶瓷 石家庄建材 衡水建材 廊坊建材 沧州建材 承德建材 建材之家 企业之家 720全景
    (c)2015-2017 Bybc.cn SYSTEM All Rights Reserved