คำสั่ง CALL และ RET


      คำสั่งของ Z80 ในการเรียกใช้โปรแกรมย่อยคือคำสั่ง CALL และ ในส่วนของโปรแกรมย่อยจะต้องมีคำสั่ง RET เพื่อให้ให้คืนค่ากลับมายังโปรแกรมหลักในการเรียกใช้โปรแกรมย่อย หากในโปรแกรมย่อยมีการเรียกใช้ รีจิสเตอร์ ซ้ำกับโปรแกรมหลักก็จะทำให้ข้อมูลในรีจิสเตอร์นั้นเสียหายได้ วิธีแก้ไขคือจะต้องมีการเก็บค่าข้อมูลก่อนเข้าสู่โปรแกรมย่อย ซึ่งมักใช้คำสั่งในกลุ่มแลกเปลี่ยนข้อมูล เพื่อนำค่าไปเก็บไว้ในรีจิสเตอร์สำรองและเมื่อกลับออกจากโปรแกรมย่อยก็จะเรียกใช้อีกครั้งเพื่อคืนค่าเดิมกลับมา ดังนี้

           LD BC, 1234H
           EXX ; เก็บค่าข้อมูล BC ไว้ใน BC
           CALL DELAY ; เรียกโปรแกรมหน่วงเวลา
           EXX ; คืนค่าข้อมูล BC กลับมาไว้ใน BC

      อีกวิธีหนึ่งคือใช้คำสั่ง PUSH และ คำสั่ง POP เพื่อฝากข้อมูลไว้ในสแตก ดังนี้

           LD BC,1234H
           PUSE BC ; เก็บค่าข้อมูล BC ไว้ในสแตก
           CALL DELAY ; เรียกโปรแกรมหน่วงเวลา
           POP BC ; นำค่าข้อมูลจากสแตกคือ กลับมาไว้ใน BC

      สำหรับคำสั่ง CALL ที่ใช้เรียกโปรแกรมย่อย ยังมีทั้ง CALL เฉยๆ แบบไม่มีเงื่อนไขและ CALL cc โดย cc คือเงื่อนไขในลักษณะเดียวกับคำสั่ง JP และเช่นเดียวกันคำสั่งคืนค่าเพื่อกลับสู่โปรแกรมหลักก็มีคำสั่ง

           RET แบบ คืนค่าปกติ
           RET cc เมื่อ cc คืนเงื่อนไขในลักษณะเดียวกับคำสั่ง JPและในกรณีเป็นโปรแกรมย่อยเพื่อบริการอินเทอร์รัพท์ ก็ต้องใช้
           RETI สำหรับโปรแกรมย่อยในอินเทอร์รัพท์ปกติ คือ แบบ INT
           และ RETN สำหรับโปรแกรมย่อยในอินเทอร์รัพท์แบบ NMI (Non maskable interupt)