Als angenehme Features sind folgende Punkte zu nennen:
\begin{itemize}
\item Teilweise Anwendung von boolschen Operatoren auf einzelne Bits
- \item Interrupts mit Priorit\"aten
\item In der ISR-Vector Tabelle sind 8 Bytes f\"ur jeden Interrupt vorhanden, wodurch kleine ISR's direkt in dieser platziert werden k\"onnen.
- \item Es gibt 4 Registerbanken zu 8 Registern die \"ueber das PSW \footnote{Program Status Word} ausgew\"ahlt werden k\"onnen.
+ \item Es gibt 4 Registerbanken zu je 8 Registern die \"ueber das PSW \footnote{Program Status Word} ausgew\"ahlt werden k\"onnen.
\item Eine Division liefert Quotient und Rest.
\item Die DJNZ-Operation \footnote{decrement jump not zero} ist bei Schleifen gut einsetzbar.
- \item Es ist die Anbindung von externem RAM m\"oglich und es gibt eigene MOV-Instruktionen daf\"ur. Jedoch ben\"otigt man f\"ur die Anbindnung Port0 und Port2 und kann diese nicht mehr Anderweitig verwenden.
\end{itemize}
Als etwas gew\"ohnungsbed\"urftig kann man folgende Features bezeichnen:
\item Die Entscheidung das Upper RAM\footnote{die obere H\"alfte des RAMs} nur indirekt adressierbar zu machen.
Bei direkter Adressierung greift man auf das SFR\footnote{Special Function Register} zu, indem Peripherie, Statusbytes, Accumulator, \ldots des Prozessors sind.
\item Es sind nur 16 Byte des Lower RAM und Bytes im SFR, deren Adresse auf 0x0h oder 0x8h enden, direkt Bit-adressierbar.
+ \item Die geringe Anzahl an Conditional Branches.
+ \item Es gibt keine Befehle um mit 16-Bit Daten umzugehen, abgesehen vom Datapointer.
\end{itemize}
\subsection{Listing}
\begin{itemize}
\item Der Array liegt im externen RAM
\item Die Adresse ist 16-Bit lang
- \item In Register 7 wird len \"uebergeben und in Register 5 und 6 das High- bzw. Low-Byte der Adresse.
- \item In Register 7 wird das Ergebnis zur\"uckgeliefert
+ \item Es werden die Calling Conventions von SDCC verwendet
\end{itemize}
-Das Timing wurde f\"ur die Original MCS-51 Architektur ermittelt und f\"ur die CPI-51. Da diese Architekturen kompatibel sind, ist keine Unterschied in der Programmgr\"o\ss e vorhanden.
-\begin{lstlisting}[caption=MCS-51 Code]
-crl r4 //clears r4 (sum)
-cjne r7, #0, exec //only execute prog if len/i > 0
-sjmp exit //jump to exit
+Das Timing wurde f\"ur die Original MCS-51 Architektur ermittelt.
+\lstinputlisting[caption=MCS-51 Code]{8051.s}
-exec:
-mov DPL, r6 //load datapointer low with r6
-mov DPH, r5 //load datapointer high with r5
+Es werden pro Schleifeniteration 21 Instruktionen ausgef\"uhrt. Dadurch ergibt sich eine Ausf\"uhrungszeit von 30$\mu$s (bei einer Clock von 12MHz) was 30 Maschinenzyklen beziehungsweise 360 Clocktakte entspricht. Die Codesize der Schleife ist 32 Bytes.
-loop:
- movx A, @DPTR // read arr[i] from address stored in DPTR
- add A, r4 // add sum to arr[i]
- mov r4, A // mov sum into r4
- inc DPTR // increment address
-
-djnz r7, loop // decrement i and jump if not zero
-
-exit:
-mov r7,r4 //returns sum in r7
-
-ret
-\end{lstlisting}
-
-Es werden pro Schleifeniteration 5 Instruktionen ausgef\"uhrt. Dadurch ergibt sich bei einem MCS-51 eine Ausf\"uhrungszeit von 8$\mu$s was 8 Maschinenzyklen und damit 96 Clocktakte.
-Ein CPI-51 ben\"otigt 9 Clocktakte f\"ur eine Iteration, bei der letzen Ausf\"uhrung einen weniger.
-
-Die Codesize der Schleife ist 6 Bytes.
+Wenn man von 8-Bit Daten ausgehen w\"urde, h\"atte eine Schleifeniteration 5 Instruktionen, eine Ausf\"uhrungszeit von 8$\mu$s und eine Codesize von 6 Bytes. Es ist also sehr sch\"on zu sehen das Operationen mit 16-Bit Daten sehr teuer sind im vergleich zu 8-Bit Daten.