; based on stack 
SUBROUTINE_DIP:
	MOV	A,P2
	ANL	A,#00001111b
	ADD	A,ACC
	ADD	A,#(MARK3-MARK2)
	MOV	R0,A
	ADD	A,#(MARK2-MARK1+1)
	MOVC	A,@A+PC		; low byte of address
MARK1:
	PUSH	ACC
	MOV	A,R0
	MOVC	A,@A+PC		; high byte of address
MARK2:
	PUSH	ACC
	RET
MARK3:
	DW	LABEL_0
	DW	LABEL_1
; ...
	DW	LABEL_15