子程序设计
子程序的概念及功能
结构化程序设计就是将一个复杂问题或模块分解为若干简单的子问题或子模块,再进一步分解逐步细为具体的足够小的问题,最后用一段小的、功能单一的程序来解决这些具体的小问题。
这些小的、功能单一的程序就是子程序。
子程序的要素
输入要素
输出要素
返回到上层子程序
子程序的定义方法
汇编提供了过程定义,来方便的实现子程序,定义格式如下:
过程名 PROC [NEAR/FAR]
……;子程序体
过程名 ENDP
定义注意事项:
子程序名必须是一个合法的标识符,并前后二者要一致;
PROC和ENDP必须是成对出现的关键字,表示子程序定义开始和结束;
子程序的类型有NEAR、FAR之分,其缺省的类型是NEAR,NEAR类型的子程序只能被与其同段的程序所调用,FAR类型的子程序可被不同段的程序所调用;
子程序至少要有一条返回指令。返回指令是子程序的出口语句,但它不一定是子程序的最后一条语句;
子程序名有三个属性:段值、偏移量和类型。其段值和偏移量对应于子程序的入口地址,其类型就是该子程序的类型。
子程序的调用
调用子程序指令格式如下:
CALL 子程序名/Reg/Mem
子程序调用指令执行步骤:
先将CALL指令后面的指令地址进栈;
再跳转到子程序名/Reg/Mem指定的地址处去执行。
子程序的调用指令分为近(near)调用和远(far)调用。如果被调用子程序的属性是近的,那么,CALL指令将产生一个近调用,它把该指令之后地址的偏移量(用一个字来表示的)压栈,把被调用子程序入口地址的偏移量送给指令指针寄存器IP即可实现执行程序的转移。
如果被调用子程序的属性是FAR,那么,CALL指令将产生一个远调用。这时,调用指令不仅要把该指令之后地址的偏移量压进栈,而且也要把段寄存器CS的值压进栈。在此之后,再把被调用子程序入口地址的偏移量和段值分别送给IP和CS,这样完成了子程序的远调用操作。
例如:
CALL DISPLAY ;DISPLAY是子程序名
CALL BX ;BX的内容是子程序的偏移量
CALL WORD1 ;WORD1是内存字变量,其值是子程序的偏移量
CALL DWORD1 ;DWORD1是双字变量,其值是子程序偏移量和段值
CALL word ptr [BX] ;BX所指内存字单元的值是子程序的偏移量
CALL dword ptr [BX] ;BX所指内存双字单元的值是子程序的偏移量和段值
子程序的返回
当子程序执行完时,需要返回到调用它的程序之中。为了实现此功能,指令系统提供了一条专用的子程序返回指令。其格式如下:
RET
RET [Imm]
RET指令执行步骤:
将栈顶的字出栈送到IP(如果是FAR就是两个字的内容分别送到CS和IP),这样程序就能返回到上层调用程序。
Near类型子程序返回
Far类型子程序返回
如果返回指令后面带有立即数(其值通常为偶数),则表示在得到返回地址之后,SP还要增加的偏移量,它不是类似于高级语言中子程序的返回值。
例:RET 6 ;子程序返回后,(SP)←(SP) + 6
汇编经典实验报告 来自淘豆网m.daumloan.com转载请标明出处.