\documentclass[twocolumn,a4paper,10pt]{report}
\usepackage{german,lstfloat,nofloat}
\begin{document}

\tableofsources

\newpage
\noindent Das folgende Listing~\ref{querlis} illustriert die Verwendung von Maschinensprache
zur Bestimmung der Quersumme einer Zahl. Als Beispiel wird die Kodierung im
Assembler der Prozessoren der 68000-Serie gezeigt.

\begin{source}
\caption[Quersumme]{Das Beispiel zeigt ein Programm, das die Quersummer einer im Register D2
"ubergebenen (Dezimal-) Zahl berechnet. Die Quersumme wird durch sukzessives Dividieren
durch 10 und Addieren des Divisionsrestes gebildet. Da der DIVU-Befehl nur einen 16~Bit-Quotienten
(bis max. 65536) zul"a"st, kann nicht der gesamte Umfang des 32~Bit-Registers genutzt werden
(was bis zu 10 Dezimalstellen bedeutete), sondern nur max. 5 Ziffern. Die Quersumme
findet man in D0.\label{querlis}}
\addcomment{Berechnet die Quersumme der Zahl im Register D2.}
\begin{code}
        move.w #34056, d2  ; Quersumme
        moveq #4, d1    ; von 34056
        clr.l d0
1$:     divu #10, d2
        move.l d2, d3
        andi.l #$ffff, d2
        lsr.l #8, d3    ; Divisionsrest 
                        ; in Bits 31:16
        lsr.l #8, d3    ; ins untere 
                        ; Byte schieben
        add.w d3, d0
        dbra d1, 1$
        rts
\end{code}
\end{source}

\noindent Betrachten wir nun einen Auszug aus einem Objektcodelisting. 
In Listing~\ref{primlist} sehen wir das dazugeh"orende
Programm als NOFLOAT-Objekt gesetzt. Innerhalb
dieses Objektes darf ein Seiten- oder
Spaltenumbruch stattfinden, es wird jedoch die 
Formatierung der caption's beibehalten.

\begin{nofloat}{source}
\caption{Der Objektcode des Primzahlentesters in Listings~\ref{primlist}. Die
Routine kann als Unterprogramm angesprungen werden.} 
\addcomment{Der Objectcode der nachfolgenden
Routine zur "Uberpr"ufung der Zahl im Register D6.}
\begin{code}
7C1B           ; move.l #27, d6
6102           ; bsr.s prim_test
4E75           ; rts
2406           ; move.l d6,d2
E24A           ; lsr.w #1, d2 
0042 0001      ; ori.w #1, d2 
2206           ; move.l d6, d1
82C2           ; divu d2, d1 
0281 FFFF      ; andi.l #$ffff, d1
6700 0010      ; beq non_prim
5542           ; subq.w #2, d2
B47C 0003      ; cmp.w #3, d2
6C00 FFEA      ; bge loop
7000           ; moveq #0, d0
4E75           ; rts
7001           ; moveq #1, d0
4E75           ; rts
\end{code}
\end{nofloat}

\noindent Das Listing mit dem Objektcode steht in keinem Zusammenhang mit dem ersten 
Assemblerlisting und dient lediglich der Demonstration des Listing-Befehls. 

\begin{figure}[h]
\centering\fbox{\rule{4cm}{0mm}\rule{0mm}{5cm}}
\caption{Diese Abbildung ist blo"s ein Test, um zu beweisen, da"s die normale
Formatierung Legenden unber"uhrt geblieben ist!}
\end{figure}


\begin{source*}
\caption{Primzahlentest\label{primlist}}
\addcomment{Pr"uft, ob die Zahl in D6 prim ist oder nicht.}
Das Unterprogramm testet, ob eine in D6 "ubergebene 16-Bit-Zahl prim ist (D0=0) oder
nicht (D0=1). 
\begin{code}
start:  move.l #27, d6        ; n=27
        bsr.s prim_test
        rts
prim_test: move.l d6,d2
        lsr.w #1, d2        ; n/2
        ori.w #1, d2        ; mache D2 ungerade
loop:   move.l d6, d1
        divu d2, d1        ; teste auf Teiler von D1
        andi.l #$ffff0000, d1
        beq non_prim
        subq.w #2, d2        ; immer in 2er-Schritten
        cmp.w #3, d2
        bge loop
prim:   moveq #0, d0
        rts
non_prim: moveq #1, d0
        rts
\end{code}
\end{source*}

Schlie"slich sollen Sie in Listing~\ref{quer} noch erfahren, wie einfach die Quersumme einer gegebenen
Zahl ermittelt werden kann.

\begin{source*}
\caption{Quersumme\label{quer}}
\addcomment{Berechnet die Quersumme der Zahl im Register D2.}
Das n"achste Beispiel zeigt ein Programm, das die Quersummer einer im Register D2
"ubergebenen (Dezimal-) Zahl berechnet. Die Quersumme wird durch sukzessives Dividieren
durch 10 und Addieren des Divisionsrestes gebildet. Da der DIVU-Befehl nur einen 16~Bit-Quotienten
(bis max. 65536) zul"a"st, kann nicht der gesamte Umfang des 32~Bit-Registers genutzt werden
(was bis zu 10 Dezimalstellen bedeutete), sondern nur max. 5 Ziffern. Die Quersumme
findet man in D0.
\begin{code}
move.w #34056, d2  ; Quersumme von 34056
        moveq #4, d1
        clr.l d0
1$:     divu #10, d2
        move.l d2, d3
        andi.l #$ffff, d2
        lsr.l #8, d3    ; Divisionsrest in Bits 31:16
        lsr.l #8, d3    ; ins untere Byte schieben
        add.w d3, d0
        dbra d1, 1$
        rts
\end{code}
\end{source*}


\end{document}

.
