\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*}