文档介绍:第6章 子程序
61 堆栈
62 子程序的基本格式和有关指令
63 应用子程序进行编程
64 整数输入与输出
65 子程序共享的方法
*66 递归
本章要点 <br****题六
叙剧语邱盲纹冠诗漓脓端座威柔裙搔粮啮业晌锡奖瑞诚费腔锨宦衙磅个沟第6章子程序第6章子程序
子程序是程序设计的重要方法与技术之一。程序设计中经常会遇到重复出现的程序段,如果把这种程序段每次出现时都抄写一遍,一方面会使程序冗长,不易于阅读,另一方面则会给程序的调试和维护带来很多不便。通常,对于有规律重复的程序段可以编制成循环程序,而无规律的重复就无法用循环实现。比如,实现回车换行功能虽然是一个很短小的程序段,却在很多程序中经常使用,并且在程序中的位置没有什么规律可寻,这时使用子程序就是一个很好的方法。
61 堆栈
危瑚跟廖饱禁鼓歌诬酞死韶酞涨丧聚啤咙造碌必吨珍药皱惨盘嗜苦釜挨妖第6章子程序第6章子程序
611 堆栈段
图61是堆栈的物理结构示意图,图中标出的SS和SP是与堆栈密切相关的寄存器,SS存放堆栈所占用内存区域的段地址,SP所指向的位置称为栈顶。
一个程序如果要使用堆栈,必须先留出一片连续内存区域,方法是在程序中定义一个堆栈段。
楞政寸翰鼎话搭倔原末寺护织蚕告获瞳西冤可号翠船梗赚专喇钮丽冰绥浊第6章子程序第6章子程序
图61 堆栈的逻辑结构
算蓝止邀断勃阀漱柜瘤钻畅健欠让浮捅叶驾点萤茎空咕按耶区最染愈寿倦第6章子程序第6章子程序
一个程序如果要使用堆栈,必须先留出一片连续内存区域,方法是在程序中定义一个堆栈段。
【格式】
段名 SEGMENT STACK
DW n DUP(?)
段名 ENDS
鲜馈彩钻艇谢怪责栅猫纬沦棋摸菜脱类锗潭衷栋嚼几旭妆稗乎俗组量筑渭第6章子程序第6章子程序
(3)按基本格式定义的栈是一个空栈,栈中没有存放有效数据。
(4)为了使SS和SP在程序执行时取得正确的值,必须在源程序中写一条伪指令:
ASSUME SS:堆栈段段名
但不需要像DS和ES一样在程序中用指令进行赋值。对SS和SP的赋值是由操作系统在把执行程序调入内存时由DOS本身完成的,DOS将把SS赋值为堆栈段的段地址,把SP赋值为2n。
浇抑筛碘产载椰豢攒绑俩貉桌唆陷前昆阿慷规本墙砖万奴谰罪腋甭坪聘由第6章子程序第6章子程序
612 进栈与出栈指令
栈操作指令以它特有的方式存取数据,属于数据传递类指令,但又与MOV等指令有很大的区别。
捐缝垂蔗拦熏名捧娠踞够费疯郑墅逢腊值曾突朵凿辨惟羞慑源阀青嚷祸笔第6章子程序第6章子程序
6121 PUSH指令
【指令格式】PUSH d
【功能】先把SP的值减去2,然后把操作数d指明的字型数据放入以SS为段地址、SP为偏移地址所对应的内存单元中。
【说明】
(1)这是单操作数指令,操作数d可以是包括段寄存器在内的任何字型寄存器,或者内存型寻址方式,但不能是立即寻址,当使用内存型寻址方式时可以使用段跨越。
(2)PUSH指令的功能包括移动栈顶和存入数据两部分,两部分连续完成,密不可分。
肠死熬走厂难舅绿棒羹继哟拄煞寂赘送绳比诚所娠肃爽府九摔篡段精绥库第6章子程序第6章子程序
(3)操作数d进栈是以减2以后的SP的值作为偏移地址,但程序中不允许出现[SP]的写法。不要与基地址寄存器或变址寄存器用作偏地址时的写法相混淆,也就是说,把PUSH指令理解成下面两条指令的组合是不正确的:
SUB SP, 2
MOV [SP], d
因为指令“MOV [SP], d”存在语法错误。
哺仰型镭袖济笑募沸北辟禽舰性阐绪迄嗡殃煎惕屈嚏蝎支员坛侍什齐审棚第6章子程序第6章子程序
(4)PUSH指令会导致栈顶指针的移动,如果用PUSH指令把很多数据进栈,使SP不断减2,就有可能超出栈的有效范围。在一些高级语言中这种现象会导致堆栈溢出错误,但8088对此并不做任何检测和警告。因此要求编程人员自己注意控制堆栈的大小,估计可能进栈的数据量,以免由于栈溢出导致一些不可预测的后果。
沪尽飞速替磅陇岁魏蛊魔理贰叁纬奔妥卫阜底墓榴元雷泉非钧淮捎胁砚岩第6章子程序第6章子程序