Pfad:
Home =>
AVR-Übersicht =>
Binäres Rechnen => Multiplikation
(This page in English:
)
Zwei 8-Bit-Zahlen sollen multipliziert werden. Man erinnere sich, wie das mit
Dezimalzahlen geht:
1234 * 567 = ?
------------------------
1234 * 7 = 8638
+ 12340 * 6 = 74040
+ 123400 * 5 = 617000
------------------------
1234 * 567 = 699678
========================
Also in Einzelschritten dezimal:
1. Wir nehmen die Zahl mit der kleinsten Ziffer mal und addieren sie zum Ergebnis.
2. Wir nehmen die Zahl mit 10 mal, dann mit der nächsthöheren Ziffer, und
addieren sie zum Ergebnis.
3. Wir nehmen die Zahl mit 100 mal, dann mit der dritthöchsten Ziffer, und
addieren sie zum Ergebnis.
Jetzt in Binär: Das Malnehmen mit den Ziffern entfällt, weil es ja nur Null
oder Eins gibt, also entweder wird die Zahl addiert oder eben nicht. Das Malnehmen mit
10 wird in binär zum Malnehmen mit 2, weil wir ja nicht mit Basis 10 sondern mit
Basis 2 rechnen. Malnehmen mit 2 ist aber ganz einfach: man kann die Zahl einfach mit
sich selbst addieren oder binär nach links schieben und rechts eine binäre
Null dazu schreiben. Man sieht schon, dass das binäre Multiplizieren viel
einfacher ist als das dezimale Multiplizieren. Man fragt sich, warum die Menschheit
so ein schrecklich kompliziertes Dezimalsystem erfinden musste und nicht beim
binären System verweilt ist.
Die rechentechnische Umsetzung in AVR-Assembler-Sprache zeigt der
Quelltext in HTML. Wer den Quelltext direkt haben möchte, findet ihn in der
Datei mult8.asm. Der Quelltext kann mit einem Assembler
übersetzt werden, der Object-Code im Studio durchgespielt werden.
Zu Beginn der Berechnung liegen die folgenden Bedingungen vor (wechseln Sie Ihren
Browser, wenn diese Tabelle nicht korrekt angezeigt wird!):
. | rmh = R1 = 0x00 | rm1 = R0 = 0xAA |
Z1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 |
* | . | rm2 = R2 = 0x55 |
Z2 | | 0 | 1 | 0 | 1 | 0 |
1 | 0 | 1 |
= | reh = R4 = 0x00 | rel = R3 = 0x00 |
Erg | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
Für das Verständnis der Berechnung ist die Kenntnis des Assembler-Befehles
ROL bzw ROR wichtig. Der Befehl verschiebt die Bits eines Registers nach links
(ROL) bzw. rechts (ROR), schiebt das Carry-Bit aus dem Statusregister in die leer
werdende Position im Register und schiebt dafür das beim Rotieren herausfallende
Bit in das Carry-Flag. Dieser Vorgang wird für das Linksschieben mit dem Inhalt
des Registers von 0xAA, für das Rechtsschieben mit 0x55 gezeigt:
 |
 |
Die folgenden Bilder zeigen die einzelnen Schritte im Studio:
- MULT8_1.gif: Der Object-Code ist gestartet, der Cursor
steht auf dem ersten Befehl. Mit F11 machen wir Einzelschritte.
- MULT8_2.gif: In die Register R0 und R2 werden die beiden
Werte AA und 55 geschrieben, die wir multiplizieren wollen.
- MULT8_3.gif: R2 wurde nach rechts geschoben, um das
niedrigste Bit in das Carry-Bit zu schieben. Aus 55 (0101.0101) ist 2A geworden
(0010.1010), die rechteste 1 liegt im Carry-Bit des Status-Registers herum.
- MULT8_4.gif: Weil im Carry eine Eins war, wird 00AA in
den Registern R1:R0 zu dem (leeren) Registerpaar R4:R3 hinzu addiert. 00AA steht nun
auch dort herum.
- MULT8_5.gif: Jetzt muss das Registerpaar R1:R0 mit sich
selbst addiert oder in unserem Fall einmal nach links geschoben werden. Aus 00AA
(0000.0000.1010.1010) wird jetzt 0154 (0000.0001.0101.0100), weil wir von rechts eine
Null hinein geschoben haben.
- Die gesamte Multiplikation geht solange weiter, bis alle Einsen in R2 durch das
Rechtsschieben herausgeflogen sind. Die Zahl ist dann fertig multipliziert, wenn nur
noch Nullen in R2 stehen. Die weiteren Schritte sind nicht mehr abgebildet.
- MULT8_6.gif: Mit F5 haben wir im Simulator den Rest
durchlaufen lassen und sind am Ausgang der Multiplikationsroutine angelangt, wo wir
einen Breakpoint gesetzt hatten. Das Ergebnisregister R4:R3 enthält nun den Wert
3872, das Ergebnis der Multiplikation von AA mit 55.
Das war sicherlich nicht schwer, wenn man sich die Rechengänge von Dezimal in
Binär übersetzt. Binär ist viel einfacher als Dezimal!
Zum Seitenanfang
©2002-2009 by http://www.avr-asm-tutorial.net