Pfad: Home => AVR-Übersicht => Binäres Rechnen => Multiplikation    (This page in English: Flag EN) Logo
AT90S8515

Binäres Multiplizieren zweier 8-Bit-Zahlen in AVR Assembler


Dezimales Multiplizieren

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.

Binäres Multiplizieren

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.

AVR-Assemblerprogramm

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 = 0x00rm1 = R0 = 0xAA
Z100000000 10101010
*.rm2 = R2 = 0x55
Z201010 101
=reh = R4 = 0x00rel = R3 = 0x00
Erg00000000 00000000

Binäres Rotieren

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:

ROL ROR


Multiplikation im Studio

Die folgenden Bilder zeigen die einzelnen Schritte im Studio:
  1. MULT8_1.gif: Der Object-Code ist gestartet, der Cursor steht auf dem ersten Befehl. Mit F11 machen wir Einzelschritte.
  2. MULT8_2.gif: In die Register R0 und R2 werden die beiden Werte AA und 55 geschrieben, die wir multiplizieren wollen.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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