At the machine instruction level, the AVR has several instructions for changing the PC based on a run-time variable.
There are "indirect" call and jump instructions (icall and ijmp) that set the PC to the contents of the Z register (R31:30).
But the more common technique for task switching is to arrange for the correct address to be at the top of the stack, and then do a "ret" return instruction.
void start_task(int startaddr)
int * stack = malloc(stacksize);
* set up stack
*stack = startaddr;
// Other context
setstackpointer(stack); // usually magic assembler code for this
} // return goes to startaddr()
(I should note that "ijmp" is most like the PIC's "mov PCL, reg" instruction, and that the stack hack, while common on MANY architectures, is usually difficult to do on PICs since their hardware stack is not directly accessible to software.)