欢迎来到天天文库
浏览记录
ID:36263633
大小:2.05 MB
页数:184页
时间:2019-05-07
《汇编第5章-子程序设计》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、子程序设计第五章在汇编语言中,子程序又称为过程,是程序设计中的一种重要方法。在实际的程序中,常常会遇到在同一程序或多个程序中多次遇到同一任务的处理过程。如果每一次处理都编写一次程序,不仅加大了编程人员的工作量,也浪费存储空间。为了避免重复编程,人们将经常遇到的处理任务编写成一些独立的程序段,以供其他程序调用,这就是子程序设计。为了能更好地把握子程序的编写和使用方法,必须先掌握堆栈的有关概念。5.1堆栈5.2子程序的调用与返回5.3子程序设计5.4子程序设计案例习题55.1堆栈在汇编语言和机器语言中,
2、堆栈在物理结构上是一段存放数据的连续的内存区域,以及一个称为栈顶指针的专用存储单元。堆栈中只能存入16位的字型数据,存入数据的操作称为“进栈”或“压栈”,已存入的数据也可以取出,称为“出栈”或“弹出”,数据的存取操作由专用指令完成。从逻辑上说,堆栈是一种按“先进后出”或“后进先出”原则进行操作的数据结构,栈顶指针用于指出入栈操作和出栈操作的位置。5.1.1建立堆栈图5-1是堆栈的物理结构示意图.图中标出的SS和SP是与堆栈密切相关的寄存器,SS存放堆栈所占用内存区域的段地址,SP所指向的位置称为栈顶
3、。图5-1堆栈的逻辑结构图一个程序如果要使用堆栈,首先要建立堆栈。建立堆栈实际上就是在程序中定义一个堆栈段,并给SS和SP赋值即可。定义堆栈段的格式如下:段名SEGMENTSTACKDWnDUP(?)段名ENDS【说明】(1)保留字STACK是堆栈段的专用符号,SEGMENT后面的保留字STACK表明这个段专供堆栈使用。(2)段定义中用“DWnDUP(?)”说明堆栈所用内存区的大小为2n字节,其中n是一个常量。可根据程序需要,调节堆栈段的大小。因为堆栈只能存放字型数据,所以习惯上都是用DW伪指令来定
4、义栈的大小。这不并是说用其它伪指令不行。(3)按基本格式定义的栈是一个空栈,栈中没有存放有效数据。(4)为了使SS和SP在程序执行时取得正确的值,必须在源程序中写一条伪指令:ASSUMESS:堆栈段段名但不需要像DS和ES一样在程序中用指令进行赋值。对SS和SP的赋值是由操作系统在把执行程序调入内存时由DOS本身完成的,DOS将把SS赋值为堆栈段的段地址,把SP赋值为2n,这时用户使用的就是系统堆栈。当然,用户也可以根据程序的需要按自己的要求定义自己的堆栈,这时,用户不仅要定义堆栈段,而且还要用指令
5、给SS和SP赋值。5.1.2堆栈操作指令栈操作指令以它特有的方式存取数据,属于数据传送类指令,但又与MOV等指令有很大的区别。1.进栈指令【指令格式】PUSH S【功能】先把SP的值减去2,然后把操作数S指明的字型数据放入以SS为段地址、SP为偏移地址所对应的字内存单元中。【说明】(1)这是单操作数指令,操作数S可以是包括段寄存器在内的任何字型寄存器,或者内存型寻址方式,但不能是立即寻址。(2)PUSH指令的功能包括移动栈顶和存入数据两部分,两部分连续完成,密不可分。(3)操作数S进栈是以减2以后的
6、SP的值作为偏移地址,但程序中不允许出现[SP]的写法。不要与基地址寄存器或变址寄存器用作偏移地址时的写法相混淆,也就是说,把PUSH指令理解成下面两条指令的组合是不正确的:SUBSP,2MOV[SP],S因为指令“MOV[SP],S”存在语法错误。(4)PUSH指令会导致栈顶指针的移动,如果用PUSH指令把很多数据进栈,使SP不断减2,就有可能超出栈的有效范围。在一些高级语言中这种现象会导致堆栈溢出错误,但8086对此并不做任何检测和警告。因此要求编程人员自己注意控制堆栈的大小,估计可能进栈的数据
7、量,以免由于栈溢出导致一些不可预测的后果。假设:SS=3000H,SP=0200H,AX=1234H,则CPU执行PUSHAX指令后:SS的内容不变,SP=01FEH,栈顶字单元(301FEH)=1234H,AX的内容不变。2.出栈指令【指令格式】POP D【功能】从SS为段地址、SP为偏移地址的栈顶单元中取出一个字型数据,送到操作数D指定的位置,然后把SP的值加2。对操作数D的寻址方式要求与PUSH指令相同。堆栈通常用于临时保存数据。一般做法是先用PUSH指令把需要保存的数据入栈,然后完成一定的指
8、令序列,再用POP指令把原先保存的数据出栈。用堆栈保存数据的特点是不用定义变量,不必关心被保存的数据到底在栈的什么位置,只要保证出栈和进栈的对应关系即可。当CPU中的寄存器不够使用时经常用堆栈临时保存数据。假设:SS=3000H,SP=0200H,栈顶单元的数据为1234H,即(30200H)=1234H,则CPU执行POPAX指令后,SS的内容不变,SP=0202H,AX=1234H。栈顶所指位置以上的部分是堆栈的空闲区,以下部分是已入栈的数据存放区(见图5-1),
此文档下载收益归作者所有