程序中有些部分可能要實現(xiàn)相同的功能,而且這些功能需要用到,用子程序?qū)崿F(xiàn)這個功能是很適合的。子程序通常是與主程序分開的、完成特定功能的一段程序。當(dāng)主程序(調(diào)用程序)需要執(zhí)行這個功能時,就可以調(diào)用該子程序(被調(diào)用程序);于是,程序轉(zhuǎn)移到這個子程序的起始處執(zhí)行。當(dāng)運行完子程序后,再返回調(diào)用它的主程序。子程序由主程序執(zhí)行子程序調(diào)用指令 call 來調(diào)用;而子程序執(zhí)行完后用子程序返回指令 ret ,返回主程序繼續(xù)執(zhí)行。 call 和 ret 指令均不影響標(biāo)志位。
子程序結(jié)構(gòu)相當(dāng)于高級語言中的過程。為便于模塊化程序設(shè)計,往往把程序中某些具有獨立功能的部分編寫成獨立的程序模塊,稱為子程序。
1 .子程序調(diào)用指令 call
(1)段內(nèi)直接調(diào)用
格式: call dst
執(zhí)行操作: push (ip)
(ip)<-(ip)+d16
dst 給出轉(zhuǎn)向地址, d16 為機器指令中的位移量,是轉(zhuǎn)向地址和返回地址之間的差值。
(2) 段內(nèi)間接調(diào)用
格式: call dst
執(zhí)行操作: push (ip)
(ip)<-(ea)
指令中的 dst 可使用寄存器尋址方式或任一種存儲器尋址方式,由指定的寄存器或存儲單元的內(nèi)容給出轉(zhuǎn)向地址。
(3) 段間直接調(diào)用
格式: call dst
執(zhí)行操作: push (cs) push (ip)
(cs)<-dst 指定段地址
(ip)<-dst 指定偏移地址
(4) 段間間接調(diào)用
格式: call dst
執(zhí)行操作: push (cs)
push (ip)
(ip)<- ( ea )
(cs)<- ( ea+2 )
ea 是由 dst 的尋址方式確定的有效地址,可用任一種存儲器尋址方式來取得。
2 .返回指令 ret
(1)語句格式: ret ; (ip)<-pop()
(2)語句格式: ret exp;
在完成出棧操作后,還要修改堆棧指針