子程序調(diào)用指令共兩條:一條為長調(diào)用指令,另一條為絕對(duì)調(diào)用指令。都為1字節(jié)2周期指令,兩條指令都從堆棧中取出以前壓入的16位地址送入PC,從而完成子程序的返回。
長調(diào)用指令LCALL addr16是一條三字節(jié)的兩周期指令,指令碼格式為12,16位地址高8位,16位地址低8位。該指令完成下列操作:先將PC內(nèi)容加3,再將PC內(nèi)容壓入堆棧,最后將指令中的16位地址addr16送入PC中,長調(diào)用的子程序調(diào)用范圍是64KB。
在子程序結(jié)束時(shí)運(yùn)行子程序返加指令RET,這條指令的運(yùn)行過程:將堆棧指針SP指向的棧頂單元中的數(shù)據(jù)彈出以程序計(jì)數(shù)器PC的高8位中,堆棧指針SP減1,使其指向棧頂,此時(shí),PC中的數(shù)據(jù)恰好就是子程序調(diào)用指令的下一條指令地址。
絕對(duì)調(diào)用指令A(yù)CALL addr11為兩字節(jié)兩周期指令。指令完成下列操作:先將PC內(nèi)容加2,再將PC內(nèi)容壓入堆棧;最后將11位地址addr11送入PC的低11位,這條指令的調(diào)用范圍是2KB
指令A(yù)CLL SUB1的地址為0600H,這條指令的下一條指令地址應(yīng)為0602H,則該指令能跳轉(zhuǎn)到的最低地址為保持PC高5位不變,而低11位全為0的地址,即0000H,能跳轉(zhuǎn)到的最高的地址為保持PC高5位不變,而低11位全為1的地址,即07FFH,所以在本例中,這條轉(zhuǎn)移指令的跳轉(zhuǎn)范圍為0000H-07FFH,標(biāo)號(hào)LAB1的地址為0700H,在指令能跳轉(zhuǎn)的范圍內(nèi)。
在實(shí)際編程時(shí),我們不用計(jì)算機(jī)器碼,編譯系統(tǒng)會(huì)根據(jù)程序中使用的地址號(hào)自動(dòng)將其轉(zhuǎn)為機(jī)器碼,但在編程時(shí)要注意到所使用的標(biāo)號(hào)是否超出指令能轉(zhuǎn)移的范圍,假定這段程序運(yùn)行前,堆棧指針SP中的數(shù)據(jù)為10H,則程序運(yùn)行過程如下:PC指針加2,使其指向下一條指令的地址,堆棧指針SP加1,PC低8位壓棧,堆棧指針SP加1,PC高8位壓棧,將機(jī)器碼第一字節(jié)的高3位送入程序計(jì)數(shù)器PC的D10D9D8,將機(jī)器碼第二字節(jié)送入PC低8位,則程序跳轉(zhuǎn)到0700去運(yùn)行子程序SUB1。在子程序結(jié)束時(shí)運(yùn)行子程序返回指令RET。
空操作指令NOP控制CPU不作任何操作,只消耗這條指令執(zhí)行所需的機(jī)器周期,該指令是單字節(jié)單周期指令,機(jī)器碼為00,這條指令常暖和于待待或延遲。