From 7c409b74a68a2239b606e7d8cd970c963189e7aa Mon Sep 17 00:00:00 2001 From: Martin Perner Date: Tue, 19 Oct 2010 22:23:23 +0200 Subject: [PATCH] isa_cmp: updated 8051 asm --- 1_isacmp/8051.s | 51 +++++++++++++++++++++++++++++++++++++++++++++++ 1_isacmp/8051.tex | 39 ++++++++---------------------------- 2 files changed, 59 insertions(+), 31 deletions(-) create mode 100644 1_isacmp/8051.s diff --git a/1_isacmp/8051.s b/1_isacmp/8051.s new file mode 100644 index 0000000..3b45d0e --- /dev/null +++ b/1_isacmp/8051.s @@ -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 diff --git a/1_isacmp/8051.tex b/1_isacmp/8051.tex index 0fe9dc7..e50243c 100644 --- a/1_isacmp/8051.tex +++ b/1_isacmp/8051.tex @@ -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. -- 2.25.1