Functions as you know them from higher level languages
When you make the call, you need to remember where to come back to when you return, so you need to store the return address somewhere.
PC -> 00: LDI, R0, 15 Stack:
03: LDI, R1, 0B
06: CALL R1
08: PRN R0
OA: HLT
0B: ADD R0, 10 #Subroutine
0E: RET
00: LDI, R0, 15 Stack:
03: LDI, R1, 0B 08
PC -> 06: CALL R1
08: PRN R0
OA: HLT
0B: ADD R0, 10 #Subroutine
0E: RET
00: LDI, R0, 15 Stack:
03: LDI, R1, 0B 08
06: CALL R1
08: PRN R0
OA: HLT
0B: ADD R0, 10 #Subroutine
PC -> 0E: RET
00: LDI, R0, 15 Stack:
03: LDI, R1, 0B
06: CALL R1
PC -> 08: PRN R0
OA: HLT
0B: ADD R0, 10 #Subroutine
0E: RET