Files
eth-summaries/semester3/spca/parts/00_asm/06_unorthodox-control-flow.tex
2026-01-22 07:35:37 +01:00

20 lines
950 B
TeX

\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}