子程序的調(diào)用和返回指令

字號(hào):

子程序的調(diào)用和返回是一對(duì)互逆操作,也是一種特殊的轉(zhuǎn)移操作。
    一方面,之所以說是轉(zhuǎn)移,是因?yàn)楫?dāng)調(diào)用一個(gè)子程序時(shí),程序的執(zhí)行順序被改變,CPU將轉(zhuǎn)而執(zhí)行子程序中的指令序列,在這方面,調(diào)用子程序的操作含有轉(zhuǎn)移指令的功能,子程序的返回指令的轉(zhuǎn)移特性與此類似;
    另一方面,轉(zhuǎn)移指令是一種“一去不復(fù)返”的操作,而當(dāng)子程序完后,還要求CPU能轉(zhuǎn)而執(zhí)行調(diào)用指令之下的指令,它是一種“有去有回”的操作。
    為了滿足子程序調(diào)用和返回操作的特殊性,在指令系統(tǒng)中設(shè)置了相應(yīng)的特定指令。
     調(diào)用指令(CALL)
    調(diào)用子程序指令的格式如下:
    CALL 子程序名/Reg/Mem
    子程序的調(diào)用指令分為近(near)調(diào)用和遠(yuǎn)(far)調(diào)用。如果被調(diào)用子程序的屬性是近的,那么,CALL指令將產(chǎn)生一個(gè)近調(diào)用,它把該指令之后地址的偏移量(用一個(gè)字來表示的)壓棧,把被調(diào)用子程序入口地址的偏移量送給指令指針寄存器IP即可實(shí)現(xiàn)執(zhí)行程序的轉(zhuǎn)移。近調(diào)用指令的堆棧操作.
    如果被調(diào)用子程序的屬性是遠(yuǎn)的,那么,CALL指令將產(chǎn)生一個(gè)遠(yuǎn)調(diào)用。這時(shí),調(diào)用指令不僅要把該指令之后地址的偏移量壓進(jìn)棧,而且也要把段寄存器CS的值壓進(jìn)棧。在此之后,再把被調(diào)用子程序入口地址的偏移量和段值分別送給IP和CS,這樣完成了子程序的遠(yuǎn)調(diào)用操作。遠(yuǎn)調(diào)用指令的堆棧操。
    子程序調(diào)用指令本身的執(zhí)行不影響任何標(biāo)志位,但子程序體中指令的執(zhí)行會(huì)改變標(biāo)志位,所以,如果希望子程序的執(zhí)行不能改變調(diào)用指令前后的標(biāo)志位,那么,就要在子程序的開始處保護(hù)標(biāo)志位,在子程序的返回前恢復(fù)標(biāo)志位。
    例如:
    CALL DISPLAY;DISPLAY是子程序名
    CALL BX;BX的內(nèi)容是子程序的偏移量
    CALL WORD1;WORD1是內(nèi)存字變量,其值是子程序的偏移量
    CALL DWORD1;DWORD1是雙字變量,其值是子程序的偏移量和段值
    CALL word ptr [BX];BX所指內(nèi)存字單元的值是子程序的偏移量
    CALL dword ptr [BX];BX所指內(nèi)存雙字單元的值是子程序的偏移量和段值