\subsubsection{Registers} \texttt{x86} assembly is a bit particular with register naming (register names all start in \%). The initial 16-bit version of \texttt{x86} had the following registers (sub registers are registers that can be used to access the high (\texttt{h} suffix) or low (\texttt{l} suffix) half of the register. Only registers ending in \texttt{x} feature these sub registers. They, as well as \texttt{\%si} and \texttt{\%di} are general purpose): \begin{tables}{lll}{Name & Sub-registers & Description} \texttt{\%ax} & \texttt{\%ah}, \texttt{\%al} & accumulate \\ \texttt{\%cx} & \texttt{\%ch}, \texttt{\%cl} & counter \\ \texttt{\%dx} & \texttt{\%dh}, \texttt{\%dl} & data \\ \texttt{\%bx} & \texttt{\%bh}, \texttt{\%bl} & base \\ \texttt{\%si} & - & Source index \\ \texttt{\%di} & - & Destination index \\ \hline \texttt{\%sp} & - & Stack pointer \\ \texttt{\%bp} & - & Base pointer \\ \texttt{\%ip} & - & Instruction pointer \\ \texttt{\%sr} & - & Status (flags) \\ \end{tables} When the architecture was extended to 32-bit, all registers previously available were retained and a 32 bit version of each was introduced with the prefix \texttt{e}. In other words, any 16 bit code would still work as previously, as e.g. the \texttt{\%ax} register was simply now the lower 16 bits of the \texttt{\%eax} register. The same happened again when extending to 64-bit, only this time the \texttt{r} prefix was used. So, the register \texttt{\$eax} was now the lower 32 bits of \texttt{\%rax}. Additionally, the following registers are also available, with \texttt{X} to be substituted with 8 through 15: \texttt{\%rX} and the lower 32 bits \texttt{\%rXd}