summaryrefslogtreecommitdiff
path: root/info/examples/ltt/lstfloat.tex
blob: 5eb69a35a61581bdf14ca1d599e75fa9045a2cbe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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}