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