子程序调用
子程序调用指令【精选】

子程序存储在存储器中,可供一个或多个调用程序(主程序)反复调用。
主程序调用子程序时使用CALL指令,由子程序返回主程序时使用RET指令。
由于调用程序和子程序可以在同一个代码段中,也可以在不同的代码段中,因此,CALL指令和RET指令也有近调用、近返回及远调用、远返回两类格式。
⑴ CALL NEAR PTR <子程序名> 近调用(near call) 近调用是CALL指令的缺省格式,可以写为"CALL <子程序名>rotine"。
它调用同一个代码段内的子程序(子过程),因此,在调用过程中不用改变CS的值,只需将子程序的地址存入IP寄存器。
CALL指令中的调用地址可以用直接和间接两种寻址方式表示。
⑵ CALL FAR PTR <子程序名> 远调用(far call) 远调用适用于调用程序(也称为主程序)和子程序不在同一段中的情况,所以也叫做段间调用。
和近调用指令一样,远调用指令中的寻址方式也可用直接方式和间接方式。
⑶ RET 返回指令(return) RET指令执行的操作是把保存在堆栈中的返回地址出栈,以完成从子程序返回到调用程序的功能。
● CALL <子程序名> 段内直接调用 执行操作:① (SP) ← (SP)-2,((SP)) ← (IP)当前 ② (IP) ← (IP)当前+16位位移量(在指令的第2、3个字节中) ● CALL DESTIN 段内间接调用 执行操作:① (SP) ← (SP)-2,((SP)) ← (IP)当前 ② (IP) ← (EA) ; (EA)为指令寻址方式所确定的有效地址 ● CALL FAR PTR <子程序名> 段间直接调用 执行操作:① (SP) ← (SP)-2,((SP)) ← (CS)当前 (SP) ← (SP)-2,((SP)) ← (IP)当前 ② (IP) ←偏移地址(在指令的第2、3个字节中) (CS) ←段地址(在指令的第4、5个字节中) ● CALL WORD PTR DESTIN 段间间接调用 执行操作:① (SP) ← (SP)-2,((SP)) ← (CS)当前 (SP) ← (SP)-2,((SP)) ← (IP)当前 ② (IP) ← (EA) ; (EA)为指令寻址方式所确定的有效地址 (CS) ← (EA+2) 从CALL指令执行的操作可以看出,第一步是把子程序返回调用程序的地址保存在堆栈中。
子程序的调用和返回指令

1、子程序的调用和返回指令子程序的调用和返回是一对互逆操作,也是一种特殊的转移操作。
一方面,之所以说是转移,是因为当调用一个子程序时,程序的执行顺序被改变,CPU将转而执行子程序中的指令序列,在这方面,调用子程序的操作含有转移指令的功能,子程序的返回指令的转移特性与此类似;另一方面,转移指令是一种“一去不复返”的操作,而当子程序完后,还要求CPU能转而执行调用指令之下的指令,它是一种“有去有回”的操作。
为了满足子程序调用和返回操作的特殊性,在指令系统中设置了相应的特定指令。
1、1调用指令(CALL)调用子程序指令的格式如下:CALL 子程序名/Reg/Mem子程序的调用指令分为近(near)调用和远(far)调用。
如果被调用子程序的属性是近的,那么,CALL指令将产生一个近调用,它把该指令之后地址的偏移量(用一个字来表示的)压栈,把被调用子程序入口地址的偏移量送给指令指针寄存器IP即可实现执行程序的转移如果被调用子程序的属性是远的,那么,CALL指令将产生一个远调用。
这时,调用指令不仅要把该指令之后地址的偏移量压进栈,而且也要把段寄存器CS的值压进栈。
在此之后,再把被调用子程序入口地址的偏移量和段值分别送给IP和CS,这样完成了子程序的远调用操作00405600 call 0040689500405604 ......子程序调用指令本身的执行不影响任何标志位,但子程序体中指令的执行会改变标志位,所以,如果希望子程序的执行不能改变调用指令前后的标志位,那么,就要在子程序的开始处保护标志位,在子程序的返回前恢复标志位。
例如:CALL DISPLAY;DISPLAY是子程序名CALL BX;BX的内容是子程序的偏移量CALL WORD1;WORD1是内存字变量,其值是子程序的偏移量CALL DWORD1;DWORD1是双字变量,其值是子程序的偏移量和段值CALL word ptr [BX];BX所指内存字单元的值是子程序的偏移量CALL dword ptr [BX];BX所指内存双字单元的值是子程序的偏移量和段值1、2返回指令(RET)当子程序执行完时,需要返回到调用它的程序之中。
子程序的调用

mov ax,data mov ds,ax call nearp lea ax,nearp call ax call nproc lea bx,nproc call word ptr [bx]
call farp call fproc lea bx,fproc
Nearp proc near
…… ret Nearp endp Code1 ends end main code2 segment
3)在调用时,NEAR 和FAR 可以强制改变 CALL FAR PTR NEARPROC CALL NEAR PTR FARPROC
子过程的调用与返回指令
子过程的调用是个”有去有回”的过程,子程序执行
完后必须返回CALL指令的下一条指令处,因此必须对
CALL指令的下条指令的地址进行保存.保存地址的操作 是通过堆栈来完成.不是采用PUSH \POP指令来实现,而
通过存储器来传递参数
当调用程序和子程序处于同一文件中,可以直接访问 块内的变量或数据。 举例3:编写程序从键盘上输入一个字符串,存于变量为INPUT中, 要求以回车键作为输入过程的结束,字符结尾部分添加0。 (1) 分析: 子程序getstring直接从键盘输入字符串,入口参数:无。出 口参数:字符串变量INPUT 变量INPUT 属于通过存储器传递参数,调用程序和子程序处 于同一文件在数据段定义变量属于局部变量
Findmax proc
mov ax,[si] Lp1: cmp ax,[si+2] jg next xchg ax,[si+2] next: add si,2 loop lp1 ret findmax endp Code ends
end main
参数的传递
子程序的调用

格式二 M98 P××××××××; 例3 M98 P50010; 例4 M98 P510; 地址P后面的八位数字中,前四位表示调用次数, 后四位表示子程序号,采用这种调用格式时,调用 次数前的0可以省略不写,但子程序号前的0不可省 略。如例3表示调用O10子程序5次,而例4则表示调 用O510子程序1次。
三、子程序调用编程实例
例1 试用子程序方式编写如图所示软管接头工件右 端楔槽的加工程序。
1.选择加工用刀具
粗加工右端轮廓时,采用60°V型刀片右偏刀(图 a)进行加工;加工右端内凹接头轮廓时,采用55°菱 形刀片左偏刀(图b)进行加工。此外,当进行批量加 工时,还可采用特制的成形刀具(图c)加工。
(2)自动返回到程序开始段 如果在主程序中执行M99,则程序将返回到主程 序的开始程序段并继续执行主程序。也可以在主程序 中插入M99 Pn;用于返回到指定的程序段。为了能 够执行后面的程序,通常在该指令前加“/”,以便在 不需要返回执行时,跳过该程序段。
(3)强制改变子程序重复执行的次数 用M99 L××指令可强制改变子程序重复执行的 次数,其中L××表示子程序调用的次数。例如,如 果主程序用M98 P××L99,而子程序采用M99 L2返 回,则子程序重复执行的次数为2次。
O2;(SUB) ……; M99;
在有些系统中如出现该种刀尖圆弧半径补偿被分隔
指令的程序,在:
O1;(MAIN) O2;(SUB)
G91……;
G41……;
……;
……;
M98P2;
G40……;
M30;
M99;
子程序的执行过程如下:
O0402; N10 ……; N20 M98 P0100; N30 ……; …… N60 M98 P0200 L2; …… N100 M30;
子程序调用指令

子程序调用指令
子程序调用指令是指一个程序在一段程序运行时,该段程序执行某个功能时,会调用由另一段子程序处理的指令的一种机器指令。
子程序调用指令的运行过程主要分为六个步骤:
1、先将书写代码时在子程序指令里声明的一个标记符(参数可以有一到多个)放入程序计数器,编程使程序跳转至对应的子程序。
2、将参数放入堆栈中。
3、程序计数器指向下一个指令(位置),将其存入返回地址寄存器中。
4、转至子程序,调用子程序中的指令,直至子程序返回跳转指令。
5、将从子程序返回的参数或结果放入程序总线中。
6、程序计数器指向堆栈中保存的返回地址,继续执行程序。
子程序调用指令的使用有很多优点,可以将程序设计的复杂性降低,提高代码的可维护性,减少重复的编码,并使程序更加结构良好和清晰。
同时,由于调用子程序时需要使用到跳转指令,也可以减少程序运行所需的时间。
然而,程序的运行效率有时也会根据子程序的大小和复杂性以及条件的多少而有所降低。
fx5u调用子程序实例

fx5u调用子程序实例FX5U是三菱电机推出的一款高性能可编程控制器,具有强大的功能和灵活的编程能力。
在FX5U中,调用子程序是一种常用的编程方法,可以提高程序的可读性和可维护性。
本文将以FX5U调用子程序为例,介绍如何在FX5U中使用子程序来实现特定的功能。
我们需要了解什么是子程序。
子程序是一个独立的程序段,它可以在主程序中被调用,并且可以传递参数和返回结果。
子程序的好处是可以将复杂的逻辑进行模块化,提高程序的可读性和可维护性。
在FX5U中,可以通过CALL指令来调用子程序。
在FX5U中,调用子程序的步骤如下:1. 首先,需要定义子程序。
在程序编辑器中,可以通过编写子程序的代码来定义子程序。
子程序的代码可以包含各种逻辑操作和功能模块。
2. 在主程序中,使用CALL指令来调用子程序。
CALL指令的语法为CALL 子程序名。
3. 可以在CALL指令中传递参数给子程序。
参数可以是变量、寄存器或常数,用于向子程序传递数据或配置信息。
4. 子程序执行完毕后,可以通过RET指令返回到主程序,并将结果传递回去。
RET指令用于结束子程序的执行。
下面以一个简单的例子来说明如何在FX5U中调用子程序。
假设我们需要编写一个程序,实现两个数的相加功能。
我们可以将相加的逻辑封装在一个子程序中,然后在主程序中调用这个子程序。
在程序编辑器中定义子程序。
假设我们将子程序命名为ADD,代码如下:```SUB ADDLD A, X ; 将X寄存器的值加载到A寄存器ADD A, Y ; 将Y寄存器的值与A寄存器的值相加ST A, Z ; 将结果存储到Z寄存器RET ; 返回主程序ENDSUB```然后,在主程序中调用子程序。
代码如下:```LD X, 10 ; 将10赋值给X寄存器LD Y, 20 ; 将20赋值给Y寄存器CALL ADD ; 调用ADD子程序LD Z, A ; 将A寄存器的值加载到Z寄存器```通过以上代码,我们可以实现将X寄存器和Y寄存器的值相加,并将结果存储到Z寄存器中。
第十一节 子程序的调用

主程序与子程序间的参数传递 主程序与子程序相互传递的信息称为参数。 主程序与子程序相互传递的信息称为参数。主程序提供给 子程序以便加工处理的信息称为入口参数, 子程序以便加工处理的信息称为入口参数,经子程序加工 处理后回送给主程序的信息称为出口参数。 处理后回送给主程序的信息称为出口参数。在调用子程序 主程序应事先把入口参数放到某些约定的位置。 时,主程序应事先把入口参数放到某些约定的位置。子程 序在运行时,可以从约定的位置得到有关的参数。同样, 序在运行时,可以从约定的位置得到有关的参数。同样, 子程序在运行结束前,也应把出口参数送到约定位置。 子程序在运行结束前,也应把出口参数送到约定位置。在 返回主程序后,主程序可以从这些地方得到需要的结果。 返回主程序后,主程序可以从这些地方得到需要的结果。
第十节 子程序的调用
子程序的概念
• 子程序是一种重要的程序结构。 在实用中, 子程序是一种重要的程序结构 。 在实用中 , 常会遇到需要反复多次执行同一程序段的情 为了减少重复编写的工作量, 形 。 为了减少重复编写的工作量 , 并减少程 序存储空间, 常常把功能完整、 序存储空间 , 常常把功能完整 、 意义明确并 次使用的程序段从原来的程序( 被多次使用的程序段从原来的程序(称为主程 中分离出来独立编写,就成为子程序, 序)中分离出来独立编写,就成为子程序,从 而主程序可根据需要多次调用子程序。 而主程序可根据需要多次调用子程序。
子程序调用与堆栈的关系
• 为了能够成功地调用子程序,主程序应能在需要时通过调用指 为了能够成功地调用子程序, 令自动转入子程序, 令自动转入子程序,子程序完成后应能够通过末尾的返回指令 自动返回调用指令下一条指令地址(称为断点地址 处继续执行。 称为断点地址)处继续执行 自动返回调用指令下一条指令地址 称为断点地址 处继续执行。 • 因此,调用指令不仅要将子程序入口地址送到程序计数器 , 因此,调用指令不仅要将子程序入口地址送到程序计数器PC, 还要将断点地址存入堆栈保护起来。 以便实现程序转移,还要将断点地址存入堆栈保护起来。返回 指令则要将断点地址从堆栈中取出送给PC, 指令则要将断点地址从堆栈中取出送给 ,以便返回断点处继 续执行主程序。 续执行主程序。
1200子程序调用指令

1200子程序调用指令以1200子程序调用指令为标题,写一篇文章在计算机编程中,子程序是一段独立的代码,可以被主程序调用。
通过使用子程序,我们可以将复杂的任务分解成一系列较小的任务,使程序更加可读、易于维护。
而1200子程序调用指令是一种特定的指令,用于在汇编语言中调用子程序。
本文将介绍1200子程序调用指令的使用方法和注意事项。
我们需要了解如何定义和使用子程序。
在汇编语言中,子程序通常以一段标签标识,并且可以接受参数和返回结果。
在定义子程序时,我们需要使用一些特定的指令来保存寄存器的值,并在子程序结束后恢复这些值。
这样可以确保在子程序调用完成后,程序的状态与调用前保持一致。
在使用1200子程序调用指令之前,我们需要将子程序的地址存储在一个特定的寄存器中。
在调用子程序时,我们可以使用1200子程序调用指令来跳转到存储在寄存器中的地址,并将控制权交给子程序。
子程序执行完成后,会返回到调用指令的下一条指令继续执行。
在进行子程序调用时,我们需要注意一些事项。
首先,在调用子程序之前,我们需要将参数传递给子程序。
这可以通过将参数存储在寄存器或内存中来实现。
在子程序内部,我们可以使用这些参数进行计算或其他操作。
在子程序返回时,我们可以将结果存储在寄存器或内存中,供主程序使用。
我们需要注意子程序调用的返回地址。
在1200子程序调用指令中,返回地址是自动保存在栈中的。
这意味着在子程序内部,我们可以自由地使用栈来保存其他临时数据,而不会破坏返回地址。
在子程序返回时,通过使用返回指令,将栈中保存的返回地址弹出,程序会跳转到返回地址所指向的位置。
我们还需要注意子程序的参数传递和返回结果的存储。
在使用1200子程序调用指令时,通常使用寄存器来传递参数和存储返回结果。
这是因为寄存器的访问速度比内存更快,可以提高程序的执行效率。
但是需要注意的是,在调用子程序之前,我们需要保存寄存器中的值,并在子程序返回后恢复这些值,以防止数据丢失或错误。