\newpage \subsection{Unorthodox Control Flow} In \lC, the \texttt{setjmp.h} header file can be included, which gives us access to \texttt{setjmp} and \texttt{longjmp}. To use them, we first need to declare a \texttt{jmp\_buf} somewhere, usually as a static variable. The \texttt{setjmp( jmp\_buf env } function stores the current stack / environment in the \texttt{jmp\_buf} and returns 0. The \texttt{longjmp( jmp\_buf env, int val )} function causes a second return, which returns \texttt{val}, to the \texttt{setjmp} invocation and jumps back to that place. \inputcodewithfilename{c}{code-examples/01_asm/}{08_unorthodox-controlflow.c} What the above code outputs is: \texttt{second} followed by \texttt{main}. \newpage They are implemented in Assembly as follows. Nothing really surprising for the implementation there. The assembly code is from the Musl \lC\ library \inputcodewithfilename{gas}{code-examples/01_asm/}{09_setjmp-longjmp.s}