isa_cmp: updated 8051 asm
authorMartin Perner <martin@perner.cc>
Tue, 19 Oct 2010 20:23:23 +0000 (22:23 +0200)
committerMartin Perner <martin@perner.cc>
Tue, 19 Oct 2010 20:48:37 +0000 (22:48 +0200)
1_isacmp/8051.s [new file with mode: 0644]
1_isacmp/8051.tex

diff --git a/1_isacmp/8051.s b/1_isacmp/8051.s
new file mode 100644 (file)
index 0000000..3b45d0e
--- /dev/null
@@ -0,0 +1,51 @@
+;clears (sum)
+mov r4, #0x00
+mov r5, #0x00
+
+;i (sum)
+mov r0, #0x00
+mov r1, #0x00
+
+;save away len
+mov _sum_len_1_1, dpl
+mov (_sum_len_1_1 +1), dph
+
+;load datapointer with adress of array
+mov dpl, _sum_PARM_2
+mov dph, (_sum_PARM_2+1)
+
+0001$:
+       ; check the for condition
+       clr C ; clear carry
+       mov A, r0
+       subb A, _sum_len_1_1
+       mov A ,r1
+       xrl A ,#0x80
+       mov B, (_sum_len_1_1+1)
+       xrl B, #0x80
+       subb A,B
+       ;jump to exit
+       jnc 0002$
+
+       ;fetch the array element and add
+       movx A, @DPTR
+       inc DPTR
+       add A, r4
+       mov r4, A
+       movx A, @DPTR
+       addc A, r5
+       mov r5, A
+       inc DPTR
+
+       ;increment loop counter and jump
+       inc r0
+       cjne r0, #0x00, 0001$
+       inc r1
+       sjmp 0001$
+
+0002$:
+; prepare return values
+mov dpl, r4
+mov dph, r5
+
+ret
index 0fe9dc74128058a1c9eaecd480ab490a61a17b2f..e50243c88d7cf9402019f85542c2376a81b6263d 100644 (file)
@@ -20,12 +20,10 @@ Als Ziel der Architektur ist das angegebene Einsatzgebiet (Regelungstechnik) zu
 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:
@@ -33,6 +31,8 @@ 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}
@@ -40,36 +40,13 @@ Das Ergebnis der \"Ubersetzung h\"angt von Vorbedingungen ab die nicht angegeben
 \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.