diff doc/manual/callconvs/callconv_x86.tex @ 328:276eb8c87aa0

- review and fixes, cleanup, amendments to calling convention appendix of manual
author Tassilo Philipp
date Fri, 22 Nov 2019 23:11:56 +0100
parents 63892f03e493
children 6e33db95e724
line wrap: on
line diff
--- a/doc/manual/callconvs/callconv_x86.tex	Fri Nov 22 23:08:59 2019 +0100
+++ b/doc/manual/callconvs/callconv_x86.tex	Fri Nov 22 23:11:56 2019 +0100
@@ -1,762 +1,808 @@
-%//////////////////////////////////////////////////////////////////////////////
-%
-% Copyright (c) 2007,2009 Daniel Adler <dadler@uni-goettingen.de>, 
-%                         Tassilo Philipp <tphilipp@potion-studios.com>
-%
-% Permission to use, copy, modify, and distribute this software for any
-% purpose with or without fee is hereby granted, provided that the above
-% copyright notice and this permission notice appear in all copies.
-%
-% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-%
-%//////////////////////////////////////////////////////////////////////////////
-
-% ==================================================
-% x86 
-% ==================================================
-\subsection{x86 Calling Conventions}
-
-
-\paragraph{Overview}
-
-There are numerous different calling conventions on the x86 processor
-architecture, like cdecl \cite{x86cdecl}, MS fastcall \cite{x86Winfastcall}, GNU
-fastcall \cite{x86GNUfastcall}, Borland fastcall \cite{x86Borlandfastcall}, Watcom
-fastcall \cite{x86Watcomfastcall}, Win32 stdcall \cite{x86Winstdcall}, MS thiscall
-\cite{x86Winthiscall}, GNU thiscall \cite{x86GNUthiscall}, the pascal calling
-convention \cite{x86Pascal} and a cdecl-like version for Plan9 \cite{x86Plan9}
-(dubbed plan9call by us), etc.\\
-
-
-\paragraph{\product{dyncall} support}
-
-Currently cdecl, stdcall, fastcall (MS and GNU), thiscall (MS and GNU) and
-plan9call are supported.\\
-\\
-
-
-\subsubsection{cdecl}
-
-\paragraph{Registers and register usage}
-
-\begin{table}[h]
-\begin{tabular*}{0.95\textwidth}{3 B}
-Name          & Brief description\\
-\hline
-{\bf eax}     & scratch, return value\\
-{\bf ebx}     & permanent\\
-{\bf ecx}     & scratch\\
-{\bf edx}     & scratch, return value\\
-{\bf esi}     & permanent\\
-{\bf edi}     & permanent\\
-{\bf ebp}     & permanent\\
-{\bf esp}     & stack pointer\\
-{\bf st0}     & scratch, floating point return value\\
-{\bf st1-st7} & scratch\\
-\end{tabular*}
-\caption{Register usage on x86 cdecl calling convention}
-\end{table}
-
-
-\pagebreak
-
-\paragraph{Parameter passing}
-
-\begin{itemize}
-\item stack parameter order: right-to-left
-\item caller cleans up the stack
-\item all arguments are pushed onto the stack
-\end{itemize}
-
-\paragraph{Return values}
-
-\begin{itemize}
-\item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register
-\item integers \textgreater\ 32 bits are returned via the eax and edx registers
-\item floating point types are returned via the st0 register (except on Minix, where they are returned as integers are)
-\end{itemize}
-
-
-\paragraph{Stack layout}
-
-Stack directly after function prolog:\\
-
-\begin{figure}[h]
-\begin{tabular}{5|3|1 1}
-\hhline{~-~~}
-                                  & \vdots         &                                &                              \\
-\hhline{~=~~}
-local data                        & \hspace{4cm}   &                                & \mrrbrace{5}{caller's frame} \\
-\hhline{~-~~}
-\mrlbrace{3}{parameter area}      & \ldots         & \mrrbrace{3}{stack parameters} &                              \\
-                                  & \ldots         &                                &                              \\
-                                  & \ldots         &                                &                              \\
-\hhline{~-~~}
-                                  & return address &                                &                              \\
-\hhline{~=~~}
-local data                        &                &                                & \mrrbrace{3}{current frame}  \\
-\hhline{~-~~}
-parameter area                    &                &                                &                              \\
-\hhline{~-~~}
-                                  & \vdots         &                                &                              \\
-\hhline{~-~~}
-\end{tabular}
-\caption{Stack layout on x86 cdecl calling convention}
-\end{figure}
-
-
-\pagebreak
-
-\subsubsection{MS fastcall}
-
-\paragraph{Registers and register usage}
-
-\begin{table}[h]
-\begin{tabular*}{0.95\textwidth}{3 B}
-Name          & Brief description\\
-\hline
-{\bf eax}     & scratch, return value\\
-{\bf ebx}     & permanent\\
-{\bf ecx}     & scratch, parameter 0\\
-{\bf edx}     & scratch, parameter 1, return value\\
-{\bf esi}     & permanent\\
-{\bf edi}     & permanent\\
-{\bf ebp}     & permanent\\
-{\bf esp}     & stack pointer\\
-{\bf st0}     & scratch, floating point return value\\
-{\bf st1-st7} & scratch\\
-\end{tabular*}
-\caption{Register usage on x86 fastcall (MS) calling convention}
-\end{table}
-
-
-\pagebreak
-
-\paragraph{Parameter passing}
-
-\begin{itemize}
-\item stack parameter order: right-to-left
-\item called function cleans up the stack
-\item first two integers/pointers (\textless=\ 32bit) are passed via ecx and edx (even if preceded by other arguments)
-\item integer types 64 bits in size @@@ ? first in edx:eax ?
-\item if first argument is a 64 bit integer, it is passed via ecx and edx
-\item all other parameters are pushed onto the stack
-\end{itemize}
-
-\paragraph{Return values}
-
-\begin{itemize}
-\item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register
-\item integers \textgreater\ 32 bits are returned via the eax and edx registers@@@verify
-\item floating point types are returned via the st0 register@@@ really ?
-\end{itemize}
-
-
-\paragraph{Stack layout}
-
-Stack directly after function prolog:\\
-
-\begin{figure}[h]
-\begin{tabular}{5|3|1 1}
-\hhline{~-~~}
-                                  & \vdots         &                                &                              \\
-\hhline{~=~~}
-local data                        & \hspace{4cm}   &                                & \mrrbrace{5}{caller's frame} \\
-\hhline{~-~~}
-\mrlbrace{3}{parameter area}      & \ldots         & \mrrbrace{3}{stack parameters} &                              \\
-                                  & \ldots         &                                &                              \\
-                                  & \ldots         &                                &                              \\
-\hhline{~-~~}
-                                  & return address &                                &                              \\
-\hhline{~=~~}
-local data                        &                &                                & \mrrbrace{3}{current frame}  \\
-\hhline{~-~~}
-parameter area                    &                &                                &                              \\
-\hhline{~-~~}
-                                  & \vdots         &                                &                              \\
-\hhline{~-~~}
-\end{tabular}
-\caption{Stack layout on x86 fastcall (MS) calling convention}
-\end{figure}
-
-
-\pagebreak
-
-\subsubsection{GNU fastcall}
-
-\paragraph{Registers and register usage}
-
-\begin{table}[h]
-\begin{tabular*}{0.95\textwidth}{3 B}
-Name          & Brief description\\
-\hline
-{\bf eax}     & scratch, return value\\
-{\bf ebx}     & permanent\\
-{\bf ecx}     & scratch, parameter 0\\
-{\bf edx}     & scratch, parameter 1, return value\\
-{\bf esi}     & permanent\\
-{\bf edi}     & permanent\\
-{\bf ebp}     & permanent\\
-{\bf esp}     & stack pointer\\
-{\bf st0}     & scratch, floating point return value\\
-{\bf st1-st7} & scratch\\
-\end{tabular*}
-\caption{Register usage on x86 fastcall (GNU) calling convention}
-\end{table}
-
-\paragraph{Parameter passing}
-
-\begin{itemize}
-\item stack parameter order: right-to-left
-\item called function cleans up the stack
-\item first two integers/pointers (\textless=\ 32bit) are passed via ecx and edx (even if preceded by other arguments)
-\item if first argument is a 64 bit integer, it is pushed on the stack and the two registers are skipped 
-\item all other parameters are pushed onto the stack
-\end{itemize}
-
-
-\paragraph{Return values}
-
-\begin{itemize}
-\item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register.
-\item integers \textgreater\ 32 bits are returned via the eax and edx registers.
-\item floating point types are returned via the st0.
-\end{itemize}
-
-
-\pagebreak
-
-\paragraph{Stack layout}
-
-Stack directly after function prolog:\\
-
-\begin{figure}[h]
-\begin{tabular}{5|3|1 1}
-\hhline{~-~~}
-                                  & \vdots         &                                &                              \\
-\hhline{~=~~}
-local data                        & \hspace{4cm}   &                                & \mrrbrace{5}{caller's frame} \\
-\hhline{~-~~}
-\mrlbrace{3}{parameter area}      & \ldots         & \mrrbrace{3}{stack parameters} &                              \\
-                                  & \ldots         &                                &                              \\
-                                  & \ldots         &                                &                              \\
-\hhline{~-~~}
-                                  & return address &                                &                              \\
-\hhline{~=~~}
-local data                        &                &                                & \mrrbrace{3}{current frame}  \\
-\hhline{~-~~}
-parameter area                    &                &                                &                              \\
-\hhline{~-~~}
-                                  & \vdots         &                                &                              \\
-\hhline{~-~~}
-\end{tabular}
-\caption{Stack layout on x86 fastcall (GNU) calling convention}
-\end{figure}
-
-
-\subsubsection{Borland fastcall}
-
-\paragraph{Registers and register usage}
-
-\begin{table}[h]
-\begin{tabular*}{0.95\textwidth}{3 B}
-Name          & Brief description\\
-\hline
-{\bf eax}     & scratch, parameter 0, return value\\
-{\bf ebx}     & permanent\\
-{\bf ecx}     & scratch, parameter 2\\
-{\bf edx}     & scratch, parameter 1, return value\\
-{\bf esi}     & permanent\\
-{\bf edi}     & permanent\\
-{\bf ebp}     & permanent\\
-{\bf esp}     & stack pointer\\
-{\bf st0}     & scratch, floating point return value\\
-{\bf st1-st7} & scratch\\
-\end{tabular*}
-\caption{Register usage on x86 fastcall (Borland) calling convention}
-\end{table}
-
-\paragraph{Parameter passing}
-
-\begin{itemize}
-\item stack parameter order: left-to-right
-\item called function cleans up the stack
-\item first three integers/pointers (\textless=\ 32bit) are passed via eax, ecx and edx (even if preceded by other arguments@@@?)
-\item integer types 64 bits in size @@@ ?
-\item all other parameters are pushed onto the stack
-\end{itemize}
-
-
-\pagebreak
-
-\paragraph{Return values}
-
-\begin{itemize}
-\item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register
-\item integers \textgreater\ 32 bits are returned via the eax and edx registers@@@ verify
-\item floating point types are returned via the st0 register@@@ really ?
-\end{itemize}
-
-
-
-\paragraph{Stack layout}
-
-Stack directly after function prolog:\\
-
-\begin{figure}[h]
-\begin{tabular}{5|3|1 1}
-\hhline{~-~~}
-                                  & \vdots         &                                &                              \\
-\hhline{~=~~}
-local data                        & \hspace{4cm}   &                                & \mrrbrace{5}{caller's frame} \\
-\hhline{~-~~}
-\mrlbrace{3}{parameter area}      & \ldots         & \mrrbrace{3}{stack parameters} &                              \\
-                                  & \ldots         &                                &                              \\
-                                  & \ldots         &                                &                              \\
-\hhline{~-~~}
-                                  & return address &                                &                              \\
-\hhline{~=~~}
-local data                        &                &                                & \mrrbrace{3}{current frame}  \\
-\hhline{~-~~}
-parameter area                    &                &                                &                              \\
-\hhline{~-~~}
-                                  & \vdots         &                                &                              \\
-\hhline{~-~~}
-\end{tabular}
-\caption{Stack layout on x86 fastcall (Borland) calling convention}
-\end{figure}
-
-
-\subsubsection{Watcom fastcall}
-
-
-\paragraph{Registers and register usage}
-
-\begin{table}[h]
-\begin{tabular*}{0.95\textwidth}{3 B}
-Name          & Brief description\\
-\hline
-{\bf eax}     & scratch, parameter 0, return value@@@\\
-{\bf ebx}     & scratch when used for parameter, parameter 2\\
-{\bf ecx}     & scratch when used for parameter, parameter 3\\
-{\bf edx}     & scratch when used for parameter, parameter 1, return value@@@\\
-{\bf esi}     & scratch when used for return pointer @@@??\\
-{\bf edi}     & permanent\\
-{\bf ebp}     & permanent\\
-{\bf esp}     & stack pointer\\
-{\bf st0}     & scratch, floating point return value\\
-{\bf st1-st7} & scratch\\
-\end{tabular*}
-\caption{Register usage on x86 fastcall (Watcom) calling convention}
-\end{table}
-
-\paragraph{Parameter passing}
-
-\begin{itemize}
-\item stack parameter order: right-to-left
-\item called function cleans up the stack
-\item first four integers/pointers (\textless=\ 32bit) are passed via eax, edx, ebx and ecx (even if preceded by other arguments@@@?)
-\item integer types 64 bits in size @@@ ?
-\item all other parameters are pushed onto the stack
-\end{itemize}
-
-
-\paragraph{Return values}
-
-\begin{itemize}
-\item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register@@@verify, I thnik its esi?
-\item integers \textgreater\ 32 bits are returned via the eax and edx registers@@@ verify
-\item floating point types are returned via the st0 register@@@ really ?
-\end{itemize}
-
-
-\paragraph{Stack layout}
-
-Stack directly after function prolog:\\
-
-\begin{figure}[h]
-\begin{tabular}{5|3|1 1}
-\hhline{~-~~}
-                                  & \vdots         &                                &                              \\
-\hhline{~=~~}
-local data                        & \hspace{4cm}   &                                & \mrrbrace{5}{caller's frame} \\
-\hhline{~-~~}
-\mrlbrace{3}{parameter area}      & \ldots         & \mrrbrace{3}{stack parameters} &                              \\
-                                  & \ldots         &                                &                              \\
-                                  & \ldots         &                                &                              \\
-\hhline{~-~~}
-                                  & return address &                                &                              \\
-\hhline{~=~~}
-local data                        &                &                                & \mrrbrace{3}{current frame}  \\
-\hhline{~-~~}
-parameter area                    &                &                                &                              \\
-\hhline{~-~~}
-                                  & \vdots         &                                &                              \\
-\hhline{~-~~}
-\end{tabular}
-\caption{Stack layout on x86 fastcall (Watcom) calling convention}
-\end{figure}
-
-
-
-\subsubsection{win32 stdcall}
-
-\paragraph{Registers and register usage}
-
-\begin{table}[h]
-\begin{tabular*}{0.95\textwidth}{3 B}
-Name          & Brief description\\
-\hline
-{\bf eax}     & scratch, return value\\
-{\bf ebx}     & permanent\\
-{\bf ecx}     & scratch\\
-{\bf edx}     & scratch, return value\\
-{\bf esi}     & permanent\\
-{\bf edi}     & permanent\\
-{\bf ebp}     & permanent\\
-{\bf esp}     & stack pointer\\
-{\bf st0}     & scratch, floating point return value\\
-{\bf st1-st7} & scratch\\
-\end{tabular*}
-\caption{Register usage on x86 stdcall calling convention}
-\end{table}
-
-\paragraph{Parameter passing}
-
-\begin{itemize}
-\item Stack parameter order: right-to-left
-\item Called function cleans up the stack
-\item All parameters are pushed onto the stack
-\item Stack is usually 4 byte aligned (GCC \textgreater=\ 3.x seems to use a 16byte alignement@@@)
-\item Function name is decorated by prepending an underscore character and appending a '@' character and the number of bytes of stack space required
-\end{itemize}
-
-
-\paragraph{Return values}
-
-\begin{itemize}
-\item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register
-\item integers \textgreater\ 32 bits are returned via the eax and edx registers
-\item floating point types are returned via the st0 register
-\end{itemize}
-
-
-\paragraph{Stack layout}
-
-Stack directly after function prolog:\\
-
-\begin{figure}[h]
-\begin{tabular}{5|3|1 1}
-\hhline{~-~~}
-                                  & \vdots         &                                &                              \\
-\hhline{~=~~}
-local data                        & \hspace{4cm}   &                                & \mrrbrace{5}{caller's frame} \\
-\hhline{~-~~}
-\mrlbrace{3}{parameter area}      & \ldots         & \mrrbrace{3}{stack parameters} &                              \\
-                                  & \ldots         &                                &                              \\
-                                  & \ldots         &                                &                              \\
-\hhline{~-~~}
-                                  & return address &                                &                              \\
-\hhline{~=~~}
-local data                        &                &                                & \mrrbrace{3}{current frame}  \\
-\hhline{~-~~}
-parameter area                    &                &                                &                              \\
-\hhline{~-~~}
-                                  & \vdots         &                                &                              \\
-\hhline{~-~~}
-\end{tabular}
-\caption{Stack layout on x86 stdcall calling convention}
-\end{figure}
-
-\subsubsection{MS thiscall}
-
-\paragraph{Registers and register usage}
-
-\begin{table}[h]
-\begin{tabular*}{0.95\textwidth}{3 B}
-Name          & Brief description\\
-\hline
-{\bf eax}     & scratch, return value\\
-{\bf ebx}     & permanent\\
-{\bf ecx}     & scratch, parameter 0\\
-{\bf edx}     & scratch, return value\\
-{\bf esi}     & permanent\\
-{\bf edi}     & permanent\\
-{\bf ebp}     & permanent\\
-{\bf esp}     & stack pointer\\
-{\bf st0}     & scratch, floating point return value\\
-{\bf st1-st7} & scratch\\
-\end{tabular*}
-\caption{Register usage on x86 thiscall (MS) calling convention}
-\end{table}
-
-\newpage
-
-
-\paragraph{Parameter passing}
-
-\begin{itemize}
-\item stack parameter order: right-to-left
-\item called function cleans up the stack
-\item first parameter (this pointer) is passed via ecx
-\item all other parameters are pushed onto the stack
-\item Function name is decorated by prepending a '@' character and appending a '@' character and the number of bytes (decimal) of stack space required
-\end{itemize}
-
-
-\paragraph{Return values}
-
-\begin{itemize}
-\item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register
-\item integers \textgreater\ 32 bits are returned via the eax and edx registers@@@verify
-\item floating point types are returned via the st0 register@@@ really ?
-\end{itemize}
-
-
-\paragraph{Stack layout}
-
-Stack directly after function prolog:\\
-
-\begin{figure}[h]
-\begin{tabular}{5|3|1 1}
-\hhline{~-~~}
-                                  & \vdots         &                                &                              \\
-\hhline{~=~~}
-local data                        & \hspace{4cm}   &                                & \mrrbrace{5}{caller's frame} \\
-\hhline{~-~~}
-\mrlbrace{3}{parameter area}      & \ldots         & \mrrbrace{3}{stack parameters} &                              \\
-                                  & \ldots         &                                &                              \\
-                                  & \ldots         &                                &                              \\
-\hhline{~-~~}
-                                  & return address &                                &                              \\
-\hhline{~=~~}
-local data                        &                &                                & \mrrbrace{3}{current frame}  \\
-\hhline{~-~~}
-parameter area                    &                &                                &                              \\
-\hhline{~-~~}
-                                  & \vdots         &                                &                              \\
-\hhline{~-~~}
-\end{tabular}
-\caption{Stack layout on x86 thiscall (MS) calling convention}
-\end{figure}
-
-
-
-\subsubsection{GNU thiscall}
-
-\paragraph{Registers and register usage}
-
-\begin{table}[h]
-\begin{tabular*}{0.95\textwidth}{3 B}
-Name          & Brief description\\
-\hline
-{\bf eax}     & scratch, return value\\
-{\bf ebx}     & permanent\\
-{\bf ecx}     & scratch\\
-{\bf edx}     & scratch, return value\\
-{\bf esi}     & permanent\\
-{\bf edi}     & permanent\\
-{\bf ebp}     & permanent\\
-{\bf esp}     & stack pointer\\
-{\bf st0}     & scratch, floating point return value\\
-{\bf st1-st7} & scratch\\
-\end{tabular*}
-\caption{Register usage on x86 thiscall (GNU) calling convention}
-\end{table}
-
-\paragraph{Parameter passing}
-
-\begin{itemize}
-\item stack parameter order: right-to-left
-\item caller cleans up the stack
-\item all parameters are pushed onto the stack
-\end{itemize}
-
-
-\paragraph{Return values}
-
-\begin{itemize}
-\item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register
-\item integers \textgreater\ 32 bits are returned via the eax and edx registers@@@verify
-\item floating point types are returned via the st0 register@@@ really ?
-\end{itemize}
-
-
-\paragraph{Stack layout}
-
-Stack directly after function prolog:\\
-
-\begin{figure}[h]
-\begin{tabular}{5|3|1 1}
-\hhline{~-~~}
-                                  & \vdots         &                                &                              \\
-\hhline{~=~~}
-local data                        & \hspace{4cm}   &                                & \mrrbrace{5}{caller's frame} \\
-\hhline{~-~~}
-\mrlbrace{3}{parameter area}      & \ldots         & \mrrbrace{3}{stack parameters} &                              \\
-                                  & \ldots         &                                &                              \\
-                                  & \ldots         &                                &                              \\
-\hhline{~-~~}
-                                  & return address &                                &                              \\
-\hhline{~=~~}
-local data                        &                &                                & \mrrbrace{3}{current frame}  \\
-\hhline{~-~~}
-parameter area                    &                &                                &                              \\
-\hhline{~-~~}
-                                  & \vdots         &                                &                              \\
-\hhline{~-~~}
-\end{tabular}
-\caption{Stack layout on x86 thiscall (GNU) calling convention}
-\end{figure}
-
-
-
-\subsubsection{pascal}
-
-The best known uses of the pascal calling convention are the 16 bit OS/2 APIs, Microsoft Windows 3.x and Borland Delphi 1.x.
-
-\paragraph{Registers and register usage}
-
-\begin{table}[h]
-\begin{tabular*}{0.95\textwidth}{3 B}
-Name          & Brief description\\
-\hline
-{\bf eax}     & scratch, return value\\
-{\bf ebx}     & permanent\\
-{\bf ecx}     & scratch\\
-{\bf edx}     & scratch, return value\\
-{\bf esi}     & permanent\\
-{\bf edi}     & permanent\\
-{\bf ebp}     & permanent\\
-{\bf esp}     & stack pointer\\
-{\bf st0}     & scratch, floating point return value\\
-{\bf st1-st7} & scratch\\
-\end{tabular*}
-\caption{Register usage on x86 pascal calling convention}
-\end{table}
-
-\paragraph{Parameter passing}
-
-\begin{itemize}
-\item stack parameter order: left-to-right
-\item called function cleans up the stack
-\item all parameters are pushed onto the stack
-\end{itemize}
-
-
-\paragraph{Return values}
-
-\begin{itemize}
-\item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register
-\item integers \textgreater\ 32 bits are returned via the eax and edx registers
-\item floating point types are returned via the st0 register
-\end{itemize}
-
-
-\paragraph{Stack layout}
-
-Stack directly after function prolog:\\
-
-\begin{figure}[h]
-\begin{tabular}{5|3|1 1}
-\hhline{~-~~}
-                                  & \vdots         &                                &                              \\
-\hhline{~=~~}
-local data                        & \hspace{4cm}   &                                & \mrrbrace{5}{caller's frame} \\
-\hhline{~-~~}
-\mrlbrace{3}{parameter area}      & \ldots         & \mrrbrace{3}{stack parameters} &                              \\
-                                  & \ldots         &                                &                              \\
-                                  & \ldots         &                                &                              \\
-\hhline{~-~~}
-                                  & return address &                                &                              \\
-\hhline{~=~~}
-local data                        &                &                                & \mrrbrace{3}{current frame}  \\
-\hhline{~-~~}
-parameter area                    &                &                                &                              \\
-\hhline{~-~~}
-                                  & \vdots         &                                &                              \\
-\hhline{~-~~}
-\end{tabular}
-\caption{Stack layout on x86 pascal calling convention}
-\end{figure}
-
-
-\newpage
-
-\subsubsection{plan9call}
-
-\paragraph{Registers and register usage}
-
-\begin{table}[h]
-\begin{tabular*}{0.95\textwidth}{3 B}
-Name          & Brief description\\
-\hline
-{\bf eax}     & scratch, return value\\
-{\bf ebx}     & scratch\\
-{\bf ecx}     & scratch\\
-{\bf edx}     & scratch\\
-{\bf esi}     & scratch\\
-{\bf edi}     & scratch\\
-{\bf ebp}     & scratch\\
-{\bf esp}     & stack pointer\\
-{\bf st0}     & scratch, floating point return value\\
-{\bf st1-st7} & scratch\\
-\end{tabular*}
-\caption{Register usage on x86 plan9call calling convention}
-\end{table}
-
-\paragraph{Parameter passing}
-
-\begin{itemize}
-\item stack parameter order: right-to-left
-\item caller cleans up the stack%@@@ doesn't belong to "parameter passing"
-\item all parameters are pushed onto the stack
-\end{itemize}
-
-\pagebreak
-
-\paragraph{Return values}
-
-\begin{itemize}
-\item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register
-\item integers \textgreater\ 32 bits or structures are returned by the caller allocating the space and
-passing a pointer to the callee as a new, implicit first parameter (this means, on the stack)
-\item floating point types are returned via the st0 register (called F0 in plan9 8a's terms)
-\end{itemize}
-
-
-\paragraph{Stack layout}
-
-Stack directly after function prolog:\\
-
-\begin{figure}[h]
-\begin{tabular}{5|3|1 1}
-\hhline{~-~~}
-                                  & \vdots         &                                &                              \\
-\hhline{~=~~}
-local data                        & \hspace{4cm}   &                                & \mrrbrace{5}{caller's frame} \\
-\hhline{~-~~}
-\mrlbrace{3}{parameter area}      & \ldots         & \mrrbrace{3}{stack parameters} &                              \\
-                                  & \ldots         &                                &                              \\
-                                  & \ldots         &                                &                              \\
-\hhline{~-~~}
-                                  & return address &                                &                              \\
-\hhline{~=~~}
-local data                        &                &                                & \mrrbrace{3}{current frame}  \\
-\hhline{~-~~}
-parameter area                    &                &                                &                              \\
-\hhline{~-~~}
-                                  & \vdots         &                                &                              \\
-\hhline{~-~~}
-\end{tabular}
-\\
-\\
-\\
-\caption{Stack layout on x86 plan9call calling convention}
-\end{figure}
+%//////////////////////////////////////////////////////////////////////////////
+%
+% Copyright (c) 2007-2019 Daniel Adler <dadler@uni-goettingen.de>, 
+%                         Tassilo Philipp <tphilipp@potion-studios.com>
+%
+% Permission to use, copy, modify, and distribute this software for any
+% purpose with or without fee is hereby granted, provided that the above
+% copyright notice and this permission notice appear in all copies.
+%
+% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+%
+%//////////////////////////////////////////////////////////////////////////////
+
+% ==================================================
+% x86 
+% ==================================================
+\subsection{x86 Calling Conventions}
+
+
+\paragraph{Overview}
+
+On this processor, a word is defined to be 16 bits in size, a dword 32 bits
+and a qword 64 bits.\\
+
+There are numerous different calling conventions on the x86 processor
+architecture, like cdecl \cite{x86cdecl}, MS fastcall \cite{x86Winfastcall}, GNU
+fastcall \cite{x86GNUfastcall}, Borland fastcall \cite{x86Borlandfastcall}, Watcom
+fastcall \cite{x86Watcomfastcall}, Win32 stdcall \cite{x86Winstdcall}, MS thiscall
+\cite{x86Winthiscall}, GNU thiscall \cite{x86GNUthiscall}, the pascal calling
+convention \cite{x86Pascal} and a cdecl-like version for Plan9 \cite{x86Plan9}
+(dubbed plan9call by us), etc.\\
+
+\begin{table}[h]
+\begin{tabular*}{0.95\textwidth}{rccccc}
+                 & \# of regs & \# regs to  &               & cleanup & 64bit args \\
+Name             & for params & \# preserve & push order    & by      & via regs?  \\
+\hline                           
+cdecl            & 0          & 4           & $\leftarrow$  & caller  & -          \\
+MS fastcall      & 2          & 4           & $\leftarrow$  & callee  & Y          \\
+GNU fastcall     & 2          & 4           & $\leftarrow$  & callee  & N          \\
+Borland fastcall & 3          & 4           & $\rightarrow$ & callee  & N          \\
+Watcom fastcall  & 4          & 2-6         & $\leftarrow$  & callee  & N          \\
+win32 stdcall    & 0          & 4           & $\leftarrow$  & callee  & -          \\
+MS thiscall      & 1          & 4           & $\leftarrow$  & callee  & N          \\
+GNU thiscall     & 0          & 4           & $\leftarrow$  & caller  & -          \\
+pascal           & 0          & 4           & $\rightarrow$ & callee  & -          \\
+plan9call        & 0          & 0           & $\leftarrow$  & caller  & -          \\
+\end{tabular*}
+\caption{short x86 calling convention comparison}
+\end{table}
+
+
+\paragraph{\product{dyncall} support}
+
+Currently cdecl, stdcall, fastcall (MS and GNU), thiscall (MS and GNU) and
+plan9call are supported.\\
+\\
+
+
+\newpage
+
+
+\subsubsection{cdecl}
+
+\paragraph{Registers and register usage}
+
+\begin{table}[h]
+\begin{tabular*}{0.95\textwidth}{3 B}
+Name          & Brief description\\
+\hline
+{\bf eax}     & scratch, return value\\
+{\bf ebx}     & preserve\\
+{\bf ecx}     & scratch\\
+{\bf edx}     & scratch, return value\\
+{\bf esi}     & preserve\\
+{\bf edi}     & preserve\\
+{\bf ebp}     & preserve\\
+{\bf esp}     & stack pointer\\
+{\bf st0}     & scratch, floating point return value\\
+{\bf st1-st7} & scratch\\
+\end{tabular*}
+\caption{Register usage on x86 cdecl calling convention}
+\end{table}
+
+
+\paragraph{Parameter passing}
+
+\begin{itemize}
+\item stack parameter order: right-to-left
+\item caller cleans up the stack
+\item all arguments are pushed onto the stack
+\end{itemize}
+
+\paragraph{Return values}
+
+\begin{itemize}
+\item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register
+\item integers \textgreater\ 32 bits are returned via the eax and edx registers
+\item return values \textgreater\ 64 bits (e.g. structures) are returned by the caller allocating the space and
+passing a pointer to the callee as a new, implicit first parameter (this means, on the stack)
+\item floating point types are returned via the st0 register (except on Minix, where they are returned as integers are)
+\end{itemize}
+
+
+\paragraph{Stack layout}
+
+% verified/amended: TP nov 2019 (see also doc/disas_examples/x86.cdecl.disas)
+Stack directly after function prolog:\\
+
+\begin{figure}[h]
+\begin{tabular}{5|3|1 1}
+                                  & \vdots         &                                &                              \\
+\hhline{~=~~}
+register save area                & \hspace{4cm}   &                                & \mrrbrace{6}{caller's frame} \\
+\hhline{~-~~}
+local data                        &                &                                &                              \\
+\hhline{~-~~}
+\mrlbrace{3}{parameter area}      & arg n-1        & \mrrbrace{3}{stack parameters} &                              \\
+                                  & \ldots         &                                &                              \\
+                                  & arg 0          &                                &                              \\
+\hhline{~-~~}
+                                  & return address &                                &                              \\
+\hhline{~=~~}
+register save area                &                &                                & \mrrbrace{4}{current frame}  \\
+\hhline{~-~~}
+local data                        &                &                                &                              \\
+\hhline{~-~~}
+parameter area                    &                &                                &                              \\
+\hhline{~-~~}
+                                  & \vdots         &                                &                              \\
+\end{tabular}
+\caption{Stack layout on x86 cdecl calling convention}
+\end{figure}
+
+
+\newpage
+
+
+\subsubsection{MS fastcall}
+
+\paragraph{Registers and register usage}
+
+\begin{table}[h]
+\begin{tabular*}{0.95\textwidth}{3 B}
+Name          & Brief description\\
+\hline
+{\bf eax}     & scratch, return value\\
+{\bf ebx}     & preserve\\
+{\bf ecx}     & scratch, parameter 0\\
+{\bf edx}     & scratch, parameter 1, return value\\
+{\bf esi}     & preserve\\
+{\bf edi}     & preserve\\
+{\bf ebp}     & preserve\\
+{\bf esp}     & stack pointer\\
+{\bf st0}     & scratch, floating point return value\\
+{\bf st1-st7} & scratch\\
+\end{tabular*}
+\caption{Register usage on x86 fastcall (MS) calling convention}
+\end{table}
+
+\paragraph{Parameter passing}
+
+\begin{itemize}
+\item stack parameter order: right-to-left
+\item called function cleans up the stack
+\item first two integers/pointers (\textless=\ 32bit) are passed via ecx and edx (even if preceded by other arguments)
+\item if first argument is a 64 bit integer, it is passed via ecx and edx
+\item all other parameters are pushed onto the stack
+\end{itemize}
+
+\paragraph{Return values}
+
+\begin{itemize}
+\item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register
+\item integers \textgreater\ 32 bits are returned via the eax and edx registers@@@verify
+\item floating point types are returned via the st0 register@@@ really ?
+\end{itemize}
+
+
+\paragraph{Stack layout}
+
+Stack directly after function prolog:\\
+
+\begin{figure}[h]
+\begin{tabular}{5|3|1 1}
+                                  & \vdots                     &                                &                              \\
+\hhline{~=~~}
+register save area                & \hspace{4cm}               &                                & \mrrbrace{6}{caller's frame} \\
+\hhline{~-~~}
+local data                        &                            &                                &                              \\
+\hhline{~-~~}
+\mrlbrace{3}{parameter area}      & last arg                   & \mrrbrace{3}{stack parameters} &                              \\
+                                  & \ldots                     &                                &                              \\
+                                  & first arg passed via stack &                                &                              \\
+\hhline{~-~~}
+                                  & return address             &                                &                              \\
+\hhline{~=~~}
+register save area                &                            &                                & \mrrbrace{4}{current frame}  \\
+\hhline{~-~~}
+local data                        &                            &                                &                              \\
+\hhline{~-~~}
+parameter area                    &                            &                                &                              \\
+\hhline{~-~~}
+                                  & \vdots                     &                                &                              \\
+\end{tabular}
+\caption{Stack layout on x86 fastcall (MS) calling convention}
+\end{figure}
+
+
+\pagebreak
+
+\subsubsection{GNU fastcall}
+
+\paragraph{Registers and register usage}
+
+\begin{table}[h]
+\begin{tabular*}{0.95\textwidth}{3 B}
+Name          & Brief description\\
+\hline
+{\bf eax}     & scratch, return value\\
+{\bf ebx}     & preserve\\
+{\bf ecx}     & scratch, parameter 0\\
+{\bf edx}     & scratch, parameter 1, return value\\
+{\bf esi}     & preserve\\
+{\bf edi}     & preserve\\
+{\bf ebp}     & preserve\\
+{\bf esp}     & stack pointer\\
+{\bf st0}     & scratch, floating point return value\\
+{\bf st1-st7} & scratch\\
+\end{tabular*}
+\caption{Register usage on x86 fastcall (GNU) calling convention}
+\end{table}
+
+\paragraph{Parameter passing}
+
+\begin{itemize}
+\item stack parameter order: right-to-left
+\item called function cleans up the stack
+\item first two integers/pointers (\textless=\ 32bit) are passed via ecx and edx (even if preceded by other arguments)
+\item if first argument is a 64 bit integer, it is pushed on the stack and the two registers are skipped 
+\item all other parameters are pushed onto the stack
+\end{itemize}
+
+
+\paragraph{Return values}
+
+\begin{itemize}
+\item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register.
+\item integers \textgreater\ 32 bits are returned via the eax and edx registers.
+\item floating point types are returned via the st0.
+\end{itemize}
+
+
+\pagebreak
+
+\paragraph{Stack layout}
+
+Stack directly after function prolog:\\
+
+\begin{figure}[h]
+\begin{tabular}{5|3|1 1}
+                                  & \vdots                     &                                &                              \\
+\hhline{~=~~}                                                 
+register save area                & \hspace{4cm}               &                                & \mrrbrace{6}{caller's frame} \\
+\hhline{~-~~}                                                 
+local data                        &                            &                                &                              \\
+\hhline{~-~~}                                                 
+\mrlbrace{3}{parameter area}      & last arg                   & \mrrbrace{3}{stack parameters} &                              \\
+                                  & \ldots                     &                                &                              \\
+                                  & first arg passed via stack &                                &                              \\
+\hhline{~-~~}
+                                  & return address             &                                &                              \\
+\hhline{~=~~}                                                  
+register save area                &                            &                                & \mrrbrace{4}{current frame}  \\
+\hhline{~-~~}                                                  
+local data                        &                            &                                &                              \\
+\hhline{~-~~}                                                  
+parameter area                    &                            &                                &                              \\
+\hhline{~-~~}                                                  
+                                  & \vdots                     &                                &                              \\
+\end{tabular}
+\caption{Stack layout on x86 fastcall (GNU) calling convention}
+\end{figure}
+
+
+\subsubsection{Borland fastcall}
+
+Also called {\bf register convention} by Borland.
+
+
+\paragraph{Registers and register usage}
+
+\begin{table}[h]
+\begin{tabular*}{0.95\textwidth}{3 B}
+Name          & Brief description\\
+\hline
+{\bf eax}     & scratch, parameter 0, return value\\
+{\bf ebx}     & preserve\\
+{\bf ecx}     & scratch, parameter 2\\
+{\bf edx}     & scratch, parameter 1, return value\\
+{\bf esi}     & preserve\\
+{\bf edi}     & preserve\\
+{\bf ebp}     & preserve\\
+{\bf esp}     & stack pointer\\
+{\bf st0}     & scratch, floating point return value\\
+{\bf st1-st7} & scratch\\
+\end{tabular*}
+\caption{Register usage on x86 fastcall (Borland) calling convention}
+\end{table}
+
+\paragraph{Parameter passing}
+
+\begin{itemize}
+\item stack parameter order: left-to-right
+\item called function cleans up the stack
+\item first three integers/pointers (with exception of method pointers) (\textless=\ 32bit) are passed via eax, ecx and edx (even if preceded or interleaved by other arguments)
+\item all other parameters are pushed onto the stack
+\end{itemize}
+
+
+\pagebreak
+
+\paragraph{Return values}
+
+\begin{itemize}
+\item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register
+\item integers \textgreater\ 32 bits are returned via the eax and edx registers
+\item floating point types are returned via the st0 register
+\item all others (e.g. all structs, return values \textgreater\ 64 bits, ...) are returned by the caller allocating the space and
+passing a pointer to the callee as a new, implicit first parameter
+\end{itemize}
+
+
+
+\paragraph{Stack layout}
+
+Stack directly after function prolog:\\
+
+\begin{figure}[h]
+\begin{tabular}{5|3|1 1}
+                                  & \vdots                     &                                &                              \\
+\hhline{~=~~}                                                  
+register save area                & \hspace{4cm}               &                                & \mrrbrace{6}{caller's frame} \\
+\hhline{~-~~}
+local data                        &                            &                                &                              \\
+\hhline{~-~~}
+\mrlbrace{3}{parameter area}      & first arg passed via stack & \mrrbrace{3}{stack parameters} &                              \\
+                                  & \ldots                     &                                &                              \\
+                                  & last arg                   &                                &                              \\
+\hhline{~-~~}                                                  
+                                  & return address             &                                &                              \\
+\hhline{~=~~}                                                  
+register save area                &                            &                                & \mrrbrace{4}{current frame}  \\
+\hhline{~-~~}                                                  
+local data                        &                            &                                &                              \\
+\hhline{~-~~}                                                  
+parameter area                    &                            &                                &                              \\
+\hhline{~-~~}                                                  
+                                  & \vdots                     &                                &                              \\
+\end{tabular}
+\caption{Stack layout on x86 fastcall (Borland) calling convention}
+\end{figure}
+
+
+\subsubsection{Watcom fastcall}
+
+
+\paragraph{Registers and register usage}
+
+\begin{table}[h]
+\begin{tabular*}{0.95\textwidth}{3 B}
+Name          & Brief description\\
+\hline
+{\bf eax}     & scratch, parameter 0, return value\\
+{\bf ebx}     & scratch when used for parameter, otherwise preserve, parameter 2\\
+{\bf ecx}     & scratch when used for parameter, otherwise preserve, parameter 3\\
+{\bf edx}     & scratch when used for parameter, otherwise preserve, parameter 1, return value\\
+{\bf esi}     & scratch when used for return pointer, otherwise preserve\\
+{\bf edi}     & preserve\\
+{\bf ebp}     & preserve\\
+{\bf esp}     & stack pointer\\
+{\bf st0}     & scratch, floating point return value\\
+{\bf st1-st7} & scratch\\
+\end{tabular*}
+\caption{Register usage on x86 fastcall (Watcom) calling convention}
+\end{table}
+
+\paragraph{Parameter passing}
+
+\begin{itemize}
+\item stack parameter order: right-to-left
+\item called function cleans up the stack
+\item first four integers/pointers (\textless=\ 32bit) are passed via eax, edx, ebx and ecx (even if preceded by other arguments)
+\item arguments \textgreater 32 bits, as well as all subsequent arguments, are passed via the stack
+\item all other parameters are pushed onto the stack
+\item varargs are always passed via the stack
+\end{itemize}
+
+
+\paragraph{Return values}
+
+\begin{itemize}
+\item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register
+\item integers \textgreater\ 32 bits are returned via the eax and edx registers@@@ verify
+\item floating point types are returned via the st0 register@@@ really ?
+\end{itemize}
+
+
+\paragraph{Stack layout}
+
+Stack directly after function prolog:\\
+
+\begin{figure}[h]
+\begin{tabular}{5|3|1 1}
+                                  & \vdots                     &                                &                              \\
+\hhline{~=~~}                                                
+register save area                & \hspace{4cm}               &                                & \mrrbrace{6}{caller's frame} \\
+\hhline{~-~~}
+local data                        &                            &                                &                              \\
+\hhline{~-~~}
+\mrlbrace{3}{parameter area}      & last arg                   & \mrrbrace{3}{stack parameters} &                              \\
+                                  & \ldots                     &                                &                              \\
+                                  & first arg passed via stack &                                &                              \\
+\hhline{~-~~}
+                                  & return address             &                                &                              \\
+\hhline{~=~~}                                                  
+register save area                &                            &                                & \mrrbrace{4}{current frame}  \\
+\hhline{~-~~}                                                  
+local data                        &                            &                                &                              \\
+\hhline{~-~~}                                                  
+parameter area                    &                            &                                &                              \\
+\hhline{~-~~}                                                  
+                                  & \vdots                     &                                &                              \\
+\end{tabular}
+\caption{Stack layout on x86 fastcall (Watcom) calling convention}
+\end{figure}
+
+
+
+\subsubsection{win32 stdcall}
+
+\paragraph{Registers and register usage}
+
+\begin{table}[h]
+\begin{tabular*}{0.95\textwidth}{3 B}
+Name          & Brief description\\
+\hline
+{\bf eax}     & scratch, return value\\
+{\bf ebx}     & preserve\\
+{\bf ecx}     & scratch\\
+{\bf edx}     & scratch, return value\\
+{\bf esi}     & preserve\\
+{\bf edi}     & preserve\\
+{\bf ebp}     & preserve\\
+{\bf esp}     & stack pointer\\
+{\bf st0}     & scratch, floating point return value\\
+{\bf st1-st7} & scratch\\
+\end{tabular*}
+\caption{Register usage on x86 stdcall calling convention}
+\end{table}
+
+\paragraph{Parameter passing}
+
+\begin{itemize}
+\item Stack parameter order: right-to-left
+\item Called function cleans up the stack
+\item All parameters are pushed onto the stack
+\item Stack is usually 4 byte aligned (GCC \textgreater=\ 3.x seems to use a 16byte alignement)
+\item the direction flag is clear on entry and must be returned clear % mention it first, above @@@
+\end{itemize}
+
+% introduce mangling section? \item Function name is decorated by prepending an underscore character and appending a '@' character and the number of bytes of stack space required
+
+\paragraph{Return values}
+
+\begin{itemize}
+\item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register
+\item integers \textgreater\ 32 bits are returned via the eax and edx registers
+\item floating point types are returned via the st0 register
+\end{itemize}
+
+
+\paragraph{Stack layout}
+
+Stack directly after function prolog:\\
+
+\begin{figure}[h]
+\begin{tabular}{5|3|1 1}
+                                  & \vdots         &                                &                              \\
+\hhline{~=~~}
+register save area                & \hspace{4cm}   &                                & \mrrbrace{6}{caller's frame} \\
+\hhline{~-~~}
+local data                        &                &                                &                              \\
+\hhline{~-~~}
+\mrlbrace{3}{parameter area}      & arg n-1        & \mrrbrace{3}{stack parameters} &                              \\
+                                  & \ldots         &                                &                              \\
+                                  & arg 0          &                                &                              \\
+\hhline{~-~~}
+                                  & return address &                                &                              \\
+\hhline{~=~~}
+register save area                &                &                                & \mrrbrace{4}{current frame}  \\
+\hhline{~-~~}
+local data                        &                &                                &                              \\
+\hhline{~-~~}
+parameter area                    &                &                                &                              \\
+\hhline{~-~~}
+                                  & \vdots         &                                &                              \\
+\end{tabular}
+\caption{Stack layout on x86 stdcall calling convention}
+\end{figure}
+
+\subsubsection{MS thiscall}
+
+\paragraph{Registers and register usage}
+
+\begin{table}[h]
+\begin{tabular*}{0.95\textwidth}{3 B}
+Name          & Brief description\\
+\hline
+{\bf eax}     & scratch, return value\\
+{\bf ebx}     & preserve\\
+{\bf ecx}     & scratch, parameter 0\\
+{\bf edx}     & scratch, return value\\
+{\bf esi}     & preserve\\
+{\bf edi}     & preserve\\
+{\bf ebp}     & preserve\\
+{\bf esp}     & stack pointer\\
+{\bf st0}     & scratch, floating point return value\\
+{\bf st1-st7} & scratch\\
+\end{tabular*}
+\caption{Register usage on x86 thiscall (MS) calling convention}
+\end{table}
+
+\newpage
+
+
+\paragraph{Parameter passing}
+
+\begin{itemize}
+\item stack parameter order: right-to-left
+\item called function cleans up the stack
+\item first parameter (this pointer) is passed via ecx
+\item all other parameters are pushed onto the stack
+\end{itemize}
+
+% introduce mangling section? \item Function name is decorated by prepending a '@' character and appending a '@' character and the number of bytes (decimal) of stack space required
+
+\paragraph{Return values}
+
+\begin{itemize}
+\item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register
+\item integers \textgreater\ 32 bits are returned via the eax and edx registers@@@verify
+\item floating point types are returned via the st0 register@@@ really ?
+\end{itemize}
+
+
+\paragraph{Stack layout}
+
+Stack directly after function prolog:\\
+
+\begin{figure}[h]
+\begin{tabular}{5|3|1 1}
+                                  & \vdots         &                                &                              \\
+\hhline{~=~~}
+register save area                & \hspace{4cm}   &                                & \mrrbrace{6}{caller's frame} \\
+\hhline{~=~~}
+local data                        &                &                                &                              \\
+\hhline{~-~~}
+\mrlbrace{3}{parameter area}      & arg n-1        & \mrrbrace{3}{stack parameters} &                              \\
+                                  & \ldots         &                                &                              \\
+                                  & arg 1          &                                &                              \\
+\hhline{~-~~}
+                                  & return address &                                &                              \\
+\hhline{~=~~}
+register save area                &                &                                & \mrrbrace{4}{current frame}  \\
+\hhline{~-~~}
+local data                        &                &                                &                              \\
+\hhline{~-~~}
+parameter area                    &                &                                &                              \\
+\hhline{~-~~}
+                                  & \vdots         &                                &                              \\
+\end{tabular}
+\caption{Stack layout on x86 thiscall (MS) calling convention}
+\end{figure}
+
+
+
+\subsubsection{GNU thiscall}
+
+This is equivalent to the cdecl calling convention, with the first parameter being the this pointer.
+
+% \paragraph{Registers and register usage}
+% 
+% \begin{table}[h]
+% \begin{tabular*}{0.95\textwidth}{3 B}
+% Name          & Brief description\\
+% \hline
+% {\bf eax}     & scratch, return value\\
+% {\bf ebx}     & preserve\\
+% {\bf ecx}     & scratch\\
+% {\bf edx}     & scratch, return value\\
+% {\bf esi}     & preserve\\
+% {\bf edi}     & preserve\\
+% {\bf ebp}     & preserve\\
+% {\bf esp}     & stack pointer\\
+% {\bf st0}     & scratch, floating point return value\\
+% {\bf st1-st7} & scratch\\
+% \end{tabular*}
+% \caption{Register usage on x86 thiscall (GNU) calling convention}
+% \end{table}
+% 
+% \paragraph{Parameter passing}
+% 
+% \begin{itemize}
+% \item stack parameter order: right-to-left
+% \item caller cleans up the stack
+% \item all parameters are pushed onto the stack
+% \end{itemize}
+% 
+% 
+% \paragraph{Return values}
+% 
+% \begin{itemize}
+% \item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register
+% \item integers \textgreater\ 32 bits are returned via the eax and edx registers
+% \item floating point types are returned via the st0 register
+% \end{itemize}
+% 
+% 
+% \paragraph{Stack layout}
+% 
+% Stack directly after function prolog:\\
+% 
+% \begin{figure}[h]
+% \begin{tabular}{5|3|1 1}
+%                                   & \vdots         &                                &                              \\
+% \hhline{~=~~}
+% register save area                & \hspace{4cm}   &                                & \mrrbrace{6}{caller's frame} \\
+% \hhline{~-~~}
+% local data                        &                &                                &                              \\
+% \hhline{~-~~}
+% \mrlbrace{3}{parameter area}      & arg n-1        & \mrrbrace{3}{stack parameters} &                              \\
+%                                   & \ldots         &                                &                              \\
+%                                   & arg 0          &                                &                              \\
+% \hhline{~-~~}
+%                                   & return address &                                &                              \\
+% \hhline{~=~~}
+% register save area                &                &                                & \mrrbrace{4}{current frame}  \\
+% \hhline{~-~~}
+% local data                        &                &                                &                              \\
+% \hhline{~-~~}
+% parameter area                    &                &                                &                              \\
+% \hhline{~-~~}
+%                                   & \vdots         &                                &                              \\
+% \end{tabular}
+% \caption{Stack layout on x86 thiscall (GNU) calling convention}
+% \end{figure}
+
+
+
+\subsubsection{pascal}
+
+The best known uses of the pascal calling convention are the 16 bit OS/2 APIs, Microsoft Windows 3.x and Borland Delphi 1.x.
+
+\paragraph{Registers and register usage}
+
+\begin{table}[h]
+\begin{tabular*}{0.95\textwidth}{3 B}
+Name          & Brief description\\
+\hline
+{\bf eax}     & scratch, return value\\
+{\bf ebx}     & preserve\\
+{\bf ecx}     & scratch\\
+{\bf edx}     & scratch, return value\\
+{\bf esi}     & preserve\\
+{\bf edi}     & preserve\\
+{\bf ebp}     & preserve\\
+{\bf esp}     & stack pointer\\
+{\bf st0}     & scratch, floating point return value\\
+{\bf st1-st7} & scratch\\
+\end{tabular*}
+\caption{Register usage on x86 pascal calling convention}
+\end{table}
+
+\paragraph{Parameter passing}
+
+\begin{itemize}
+\item stack parameter order: left-to-right
+\item called function cleans up the stack
+\item all parameters are pushed onto the stack
+\end{itemize}
+
+
+\paragraph{Return values}
+
+\begin{itemize}
+\item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register
+\item integers \textgreater\ 32 bits are returned via the eax and edx registers
+\item floating point types are returned via the st0 register
+\end{itemize}
+
+
+\paragraph{Stack layout}
+
+Stack directly after function prolog:\\
+
+\begin{figure}[h]
+\begin{tabular}{5|3|1 1}
+                                  & \vdots         &                                &                              \\
+\hhline{~=~~}
+register save area                & \hspace{4cm}   &                                & \mrrbrace{6}{caller's frame} \\
+\hhline{~-~~}
+local data                        &                &                                &                              \\
+\hhline{~-~~}
+\mrlbrace{3}{parameter area}      & arg 0          & \mrrbrace{3}{stack parameters} &                              \\
+                                  & \ldots         &                                &                              \\
+                                  & arg n-1        &                                &                              \\
+\hhline{~-~~}
+                                  & return address &                                &                              \\
+\hhline{~=~~}
+register save area                &                &                                & \mrrbrace{4}{current frame}  \\
+\hhline{~-~~}
+local data                        &                &                                &                              \\
+\hhline{~-~~}
+parameter area                    &                &                                &                              \\
+\hhline{~-~~}
+                                  & \vdots         &                                &                              \\
+\end{tabular}
+\caption{Stack layout on x86 pascal calling convention}
+\end{figure}
+
+
+\newpage
+
+\subsubsection{plan9call}
+
+\paragraph{Registers and register usage}
+
+\begin{table}[h]
+\begin{tabular*}{0.95\textwidth}{3 B}
+Name          & Brief description\\
+\hline
+{\bf eax}     & scratch, return value\\
+{\bf ebx}     & scratch\\
+{\bf ecx}     & scratch\\
+{\bf edx}     & scratch\\
+{\bf esi}     & scratch\\
+{\bf edi}     & scratch\\
+{\bf ebp}     & scratch\\
+{\bf esp}     & stack pointer\\
+{\bf st0}     & scratch, floating point return value\\
+{\bf st1-st7} & scratch\\
+\end{tabular*}
+\caption{Register usage on x86 plan9call calling convention}
+\end{table}
+
+\paragraph{Parameter passing}
+
+\begin{itemize}
+\item stack parameter order: right-to-left
+\item caller cleans up the stack
+\item all parameters are pushed onto the stack
+\end{itemize}
+
+\pagebreak
+
+\paragraph{Return values}
+
+\begin{itemize}
+\item return values of pointer or integral type (\textless=\ 32 bits) are returned via the eax register
+\item integers \textgreater\ 32 bits or structures are returned by the caller allocating the space and
+passing a pointer to the callee as a new, implicit first parameter (this means, on the stack)
+\item floating point types are returned via the st0 register (called F0 in plan9 8a's terms)
+\end{itemize}
+
+
+\paragraph{Stack layout}
+
+% verified/amended: TP nov 2019 (see also doc/disas_examples/x86.plan9call.disas)
+Note there is no register save area at all. Stack directly after function prolog:\\
+
+\begin{figure}[h]
+\begin{tabular}{5|3|1 1}
+                                  & \vdots         &                                &                              \\
+\hhline{~=~~}
+local data                        & \hspace{4cm}   &                                & \mrrbrace{5}{caller's frame} \\
+\hhline{~-~~}
+\mrlbrace{3}{parameter area}      & arg n-1        & \mrrbrace{3}{stack parameters} &                              \\
+                                  & \ldots         &                                &                              \\
+                                  & arg 0          &                                &                              \\
+\hhline{~-~~}
+                                  & return address &                                &                              \\
+\hhline{~=~~}
+local data                        &                &                                & \mrrbrace{3}{current frame}  \\
+\hhline{~-~~}
+parameter area                    &                &                                &                              \\
+\hhline{~-~~}
+                                  & \vdots         &                                &                              \\
+\end{tabular}
+\caption{Stack layout on x86 plan9call calling convention}
+\end{figure}
+