diff options
Diffstat (limited to 'Master/texmf-dist/doc/latex/latex-tipps-und-tricks/lstfloat.tex')
-rw-r--r-- | Master/texmf-dist/doc/latex/latex-tipps-und-tricks/lstfloat.tex | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/latex/latex-tipps-und-tricks/lstfloat.tex b/Master/texmf-dist/doc/latex/latex-tipps-und-tricks/lstfloat.tex new file mode 100644 index 00000000000..a4f72e638c1 --- /dev/null +++ b/Master/texmf-dist/doc/latex/latex-tipps-und-tricks/lstfloat.tex @@ -0,0 +1,134 @@ +\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} |