Subroutine Call and Return Instructions

Branch Type Instructions

 

These are of two types:

  1. Subroutine CALL Instruction
  2. JMP Instruction
    1. Unconditional JMP
    2. Conditional JMP

Subroutine Call Instructions: These instructions are used to calls a subroutine located at the specified address. There are two subroutine Call instructions, theses are ACAL and LCALL instruction

ACALL Instruction

Size                 : Two bytes

Requirement  : Subroutine that is called must be located in the same 2KByte block of program memory as the opcode following the ACALLinstruction.

Operation:

  1. PC is first incemented twice to obtain the address of the following instruction
  2. PC is saved on stack low-byte first and high byte at high address. SP increased by two.
  3. Calcultes the subroutine address as:
  4. by combining the 5 high-order bits of the incremented PC (for A15-A11), the 3 high-order bits of the ACALLinstruction opcode (for A10-A8), and the second byte of the instruction (for A7-A0)
Format Opcode/ Encoding 2nd Byte of Op-Code example / Operation Flags affected
ACALL addr11 A10-810001 A7-0 ACALL label

PC=PC+2
SP=SP+1
(SP)=PC7-0
SP=SP+1
(SP)=PC15-8
PC10-0=A10-0

P

 

Example:

Logical Address Encoding Label ORG 0  
0 74     55h MOV A, #55h A=55h
2 F5    80h BACK: MOV P1, A P1=A
4 11     09h ACALL DELAY A10-0=09; so A10-8=000

encoding of ACALL= 00010001

Call location = A7-0=09

6 F4h CPL A Complement A
7 80    02h SJMP Back Jump within 256 location
9 7D    FFh Delay: MOV R5, #0FF R5=FFh=256
B D5   0B Again: DJNZ R5, Again R5=R5-1; If R5<>0;

PC=PC+offset i.e 0

PC=PC+0=PC

Else PC=PC+2

D     RET  
      END  

 

LCALL

The LCALL instruction calls a subroutine located at the specified address. This instruction first adds 3 to the PC to generate the address of the next instruction. This result is pushed onto the stack low-byte first and the stack pointer is incremented by 2. The high-order and low-order bytes of the PC are loaded from the second and third bytes of the instruction respectively. Program execution is transferred to the subroutine at this address. No flags are affected by this instruction.

 

format example Operation Opcode/ Encoding Flags affected Byte Cycles
LCALL addr16 LCALL sub1 PC=PC+2
SP=SP+1
(SP)=PC[7-0]
SP=SP+1
(SP)=PC[15-8]
PC=addr16
00010010, A15-8, A7-0 none 3 2

 

Example Subroutine Long Call

ORG 0

MAIN :            – –

LCALL subrtn_1

LCALL subrtn_2

LCALL subrtn_3

– –

HERE:      SJMP     HERE

;

subrt_1:          —

RET                 ; end of sub routine_1

subrtn_2:        —

RET                 ; end of sub routine_2

subrtn_3:        —

RET                 ; end of sub routine_3

END

RET

It is used to return from a subroutine

POPs  the saved address from stack and load in PC. Twice read, each time stack pointer decremented

Program execution resumes from the resulting address which is typically the instruction following an ACALL or LCALL instruction.

Format Opcode/ Encoding 2nd byte Example/ Operation Flags affected
RET 00100010 RET

PC15-8=(SP)
SP=SP-1
PC7-0=(SP)
SP=SP-1

none
Updated: June 10, 2019 — 3:19 pm

Leave a Reply

Your email address will not be published. Required fields are marked *

care4you © 2014 care4you © Revision-1: 2016 care4you © Revision-2: 2019 Connect On Facebook DMCA.com Protection Status
error: Content is protected !!