[SPCA] Finish unorthodox control flow

This commit is contained in:
2026-01-16 08:19:39 +01:00
parent 8ca91096af
commit ad5098bb07
9 changed files with 135 additions and 1 deletions

View File

@@ -0,0 +1,19 @@
\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}