CALL(LCALL)指令執行時,進行兩步操作:
(1)將程式下一條指令的位置的IP壓入堆疊中;
(2)轉移到調用的子程式。
(CALL近調用,LCALL遠調用,
CALL 定址2K空間範圍
LCALL 定址64K空間範圍) 先壓CS,再壓IP!
CALL與RET結合使用,當CALL調用的子程式運行到RET命令時,壓入堆疊的IP彈出,跳出子程式,開始執行CALL的下一條語句。
例:
main: setb p1.0;
lcall delay;
clr p1.0;
lcall delay;
ajmp main;
delay: mov r7,#250;
d1: mov r6,#250;
d2:djnzr6,d2;
djnzr7,d1;
ret ;
end;
當執行LCALL時,把該語句的IP(或者說PC)壓入堆疊,開始進入子程式DELAY,當執行到RET時,堆疊中的IP出棧,LCALL的繼續執行下一條語句。
一般來說,執行一條CALL指令相當於執行一條PUSH指令加一條JMP指令。
call指令是調用子程式,後面緊跟的應該是子程式名或者過程名。