一方面,之所以说是转移,是因为当调用一个子程序时,程序的执行顺序被改变,CPU将转而执行子程序中的指令序列,在这方面,调用子程序的 *** 作含有转移指令的功能,子程序的返回指令的转移特性与此类似;
另一方面,转移指令是一种“一去不复返”的 *** 作,而当子程序完后,还要求CPU能转而执行调用指令之下的指令,它是一种“有去有回”的 *** 作。
为了满足子程序调用和返回 *** 作的特殊性,在指令系统中设置了相应的特定指令。
调用指令(CALL)
调用子程序指令的格式如下:
CALL 子程序名/Reg/Mem
子程序的调用指令分为近(near)调用和远(far)调用。如果被调用子程序的属性是近的,那么,CALL指令将产生一个近调用,它把该指令之后地址的偏移量(用一个字来表示的)压栈,把被调用子程序入口地址的偏移量送给指令指针寄存器IP即可实现执行程序的转移。近调用指令的堆栈 *** 作.
如果被调用子程序的属性是远的,那么,CALL指令将产生一个远调用。这时,调用指令不仅要把该指令之后地址的偏移量压进栈,而且也要把段寄存器CS的值压进栈。在此之后,再把被调用子程序入口地址的偏移量和段值分别送给IP和CS,这样完成了子程序的远调用 *** 作。远调用指令的堆栈 *** 。
子程序调用指令本身的执行不影响任何标志位,但子程序体中指令的执行会改变标志位,所以,如果希望子程序的执行不能改变调用指令前后的标志位,那么,就要在子程序的开始处保护标志位,在子程序的返回前恢复标志位。
例如:
CALL DISPLAYDISPLAY是子程序名
CALL BXBX的内容是子程序的偏移量
CALL WORD1WORD1是内存字变量,其值是子程序的偏移量
CALL DWORD1DWORD1是双字变量,其值是子程序的偏移量和段值
CALL word ptr [BX]BX所指内存字单元的值是子程序的偏移量
CALL dword ptr [BX]BX所指内存双字单元的值是子程序的偏移量和段值
s7200plc调用子程序的指令 *** 作码是CALL。根据查询相关资料显示,子程序调用指令的语句表由 *** 作码CALL和子程序标号n(n:0~63,随着子程序个数的增加自动生成)构成,即CALLSBR_n。在汇编语言中,没有要求子程序存放位置的指令是 CALL 指令。CALL 指令用于调用一个子程序,可以在程序的任何地方使用,而不需要关心子程序的具体存放位置。CALL 指令会将当前的指令地址(即 CALL 指令下一条指令的地址)压入堆栈中,并跳转到指定的子程序开始执行。CALL 指令的一般格式为:
CALL subroutine_address
其中 subroutine_address 是子程序的地址,可以是一个标号、一个寄存器或一个内存地址。当执行 CALL 指令时,程序会跳转到 subroutine_address 指定的地址处执行子程序,并将返回地址压入堆栈。当子程序执行完毕后,使用 RET 指令返回到调用程序的下一条指令继续执行。
需要注意的是,在使用 CALL 指令调用子程序时,需要保证子程序的代码已经被正确加载并且可以执行。否则,可能会导致程序崩溃或出现其他错误。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)