<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Avrsteffen</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Avrsteffen"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Avrsteffen"/>
	<updated>2026-04-10T23:38:45Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Xilinx_timing_constraints&amp;diff=104175</id>
		<title>Xilinx timing constraints</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Xilinx_timing_constraints&amp;diff=104175"/>
		<updated>2021-03-25T18:03:48Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* Setzen von timing constraints für Xilinx */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Setzen von timing constraints für Xilinx ==&lt;br /&gt;
=== Problem ===&lt;br /&gt;
Hallo ich habe folgenden VHDL Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;vhdl&amp;quot;&amp;gt;&lt;br /&gt;
architecture VERHALTEN of TEST is&lt;br /&gt;
signal Di : STD_LOGIC_VECTOR(7 downto 0);&lt;br /&gt;
begin&lt;br /&gt;
&lt;br /&gt;
  process (CLK,RESET)&lt;br /&gt;
  begin&lt;br /&gt;
    if RESET = &#039;0&#039; then&lt;br /&gt;
      Di &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
    elsif CLK = &#039;1&#039; and CLK&#039;event then&lt;br /&gt;
      Di &amp;lt;= not Di;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&lt;br /&gt;
  O &amp;lt;= to_bitvector(std_logic_vector(Di));&lt;br /&gt;
&lt;br /&gt;
end VERHALTEN;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Und wenn ich das Timing erstelle (generate Timing) bekomme ich zwei&lt;br /&gt;
Warnungen die ich mir nicht erklären kann:&lt;br /&gt;
&lt;br /&gt;
WARNING:Cpld:310 - Cannot apply TIMESPEC TS1000 =&lt;br /&gt;
PERIOD:PERIOD_CLK:0.000 nS&lt;br /&gt;
WARNING:Cpld:2 - Cannot apply TIMESPEC AUTO_TS_F2F =&lt;br /&gt;
&lt;br /&gt;
Wenn ich anstatt &amp;quot;Di &amp;lt;= not Di;&amp;quot; ersatzweise &amp;quot;Di &amp;lt;= Di + 1;&amp;quot;&lt;br /&gt;
einsetze bekomme ich keine Warnungen mehr.&lt;br /&gt;
&lt;br /&gt;
=== Antwort ===&lt;br /&gt;
&lt;br /&gt;
Hm, da man nicht viel weiss muß man qualifiziert raten.&lt;br /&gt;
Ich nehmen an, du baust einen CPLD und hast keine Timingconstraints&lt;br /&gt;
angegeben&lt;br /&gt;
(.ucf file wäre hier hilfreich).&lt;br /&gt;
&lt;br /&gt;
Ein Timing-constraint besteht aus drei Teilen:&lt;br /&gt;
# der Name des constraints&lt;br /&gt;
# Pfade(Netze) die constraint (eine Randbedingung erhalten) werden&lt;br /&gt;
# eine Grenze die die Signallaufzeit nicht verletzen darf (die Randbedingung)&lt;br /&gt;
&lt;br /&gt;
Die Warning (&amp;quot;cannot apply ...&amp;quot;) heisst :&lt;br /&gt;
(2) ist nicht gegeben also es gibt im Design keine Pfade die auf dieses constraint passen (also es gibt keine Netze mit diesen Namen, oder keine Netze zwischen diesen Primitiven).&lt;br /&gt;
&lt;br /&gt;
Die angemeckerten constraints scheinen automatisch erzeugt, also hat sich der Entwickler nicht überlegt, ob diese Pfade überhaupt in diesem Design vorkommen können.&lt;br /&gt;
&lt;br /&gt;
Im Design mit der Warning schalten die FF jeden Takt um, sie toggeln. Bei CPLD&#039;s wird daher die FF in den Toggle-mode konfiguriert. Die Logik der Makrozelle und die switch matrix wird nicht genutzt.&lt;br /&gt;
&lt;br /&gt;
Im zweiten Design ohne die Warnings werden die FF in jedem Takt mit einem neuen Wert geladen. Dieses Wert wird durch Kombinatorik (NAND-Gatter etc) gewonnen. Heisst in diesem design ist sehr wohl die Makrocell Logik und&lt;br /&gt;
wahrscheinlich auch die switchmatrix genutzt. Die FF werden wohl im&lt;br /&gt;
Modus, D_FF mit Enable und synchronen Set/Reset genutzt. Also es gibt etliche genutzte Pfade mehr in dem Counterdesign.&lt;br /&gt;
&lt;br /&gt;
Damit findet im zweiten design der timinganalyzer sehr wohl Pfade, auf die die&lt;br /&gt;
Timingconstraints zutreffen und hat somit keinen Grund die Warnung &amp;quot;cannot apply ...&amp;quot; auszugeben.&lt;br /&gt;
&lt;br /&gt;
Wahrscheinlich kannst du die warnings ignorieren, du hast nur mehr constraints vorgegeben als (in disem design) überprüfbar sind. Obwohl lieber ein constraint zuviel als zuwenig.&lt;br /&gt;
&lt;br /&gt;
Du musst auf jeden fall überprüfen, was die angemeckerten constraints bedeuten:&lt;br /&gt;
*Sind sie automatisch generiert?&lt;br /&gt;
*Welche Pfade werden durch die constraints geprüft?&lt;br /&gt;
*Werden diese Pfade in deinem Design genutzt?&lt;br /&gt;
&lt;br /&gt;
=== Weiterführende Links ===&lt;br /&gt;
[https://blogs.cuit.columbia.edu/zp2130/configure_sta_environment/ Timing Constraits sehr gut erklärt (englisch)]&lt;br /&gt;
&lt;br /&gt;
[[Category:Xilinx ISE]]&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102716</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102716"/>
		<updated>2020-12-11T17:35:13Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
Die Cycle Time der einzelnen Funktionen sind in der Tabelle zusammengefasst.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! HW !! 16x8!! 16x16!! 24x8!! 24x16!! 24x24!! 32x8!! 32x16!! 32x24!! 32x32&lt;br /&gt;
|-&lt;br /&gt;
| mul|| 14 || 26 || 21 || 40 || 57|| 29 || 49 || 75 || 102&lt;br /&gt;
|-&lt;br /&gt;
| mulsu|| 20 || 27 || 21 || 41 || 60 || 29 || 54 || 78 || 106&lt;br /&gt;
|-&lt;br /&gt;
| muls|| 19|| 28|| 23 || 42 || 63 || 38 || 60 || 86 || 112&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  10 cycles + 4 (RET) = 14 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_16x8:&lt;br /&gt;
;   R5:R2 = R17:R16 * R21:R20&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R16					; AL * BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		clr		R4&lt;br /&gt;
		mul 	R21,R16					; AH * BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  22 cycles + 4 (RET) = 26 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_16x16:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R5:R2 = R17:R16 * R21:R20&lt;br /&gt;
        sub		R9,R9            &lt;br /&gt;
		mul 	R20,R16					; AL * BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17					; AH * BH&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		&lt;br /&gt;
		mul 	R21,R16					; AH * BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R17					; AL * BH&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  17 cycles + 4 (RET) = 21 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_24x8:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R5:R2 = R16 * R22:R20&lt;br /&gt;
		sub		R9,R9				; NULL&lt;br /&gt;
		mul 	R20,R16				; AL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R16				; AH*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AM*BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		pop		R9		&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  36 cycles + 4 (RET) = 40 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_24x16:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R6:R2 = R17:R16 * R22:R20&lt;br /&gt;
&lt;br /&gt;
		sub		R4,R4				; NULL&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		mul 	R20,R16				; AL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R17				; AH*BH&lt;br /&gt;
		mov 	R5,R0&lt;br /&gt;
		mov 	R6,R1&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AM*BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R16				; AH*BL&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17				; AL*BH&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17				; AM*BH&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		pop		R9		&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul24x24_48.inc&lt;br /&gt;
;*  Mutiply 	24x24 -&amp;gt; 48 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  53 cycles + 4 (RET) = 57 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_24x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		&lt;br /&gt;
;   R7:R2 = R18:R16 * R22:R20&lt;br /&gt;
&lt;br /&gt;
		sub		R9,R9				; NULL&lt;br /&gt;
		mul 	R20,R16				; AL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R16				; AH*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18				; AH*BH&lt;br /&gt;
		movw 	R7:R6,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AM*BL&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R22,R17				; AH*BM		&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17				; AL*BM&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R21,R18				; AM*BH&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R17				; AM*BM	&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R18				; AL*BH&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
				&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x8_40.inc&lt;br /&gt;
;*  Mutiply 	32x8 -&amp;gt; 40 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  25 cycles + 4 (RET) = 29 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x8:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R6:R2 = R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub		R4,R4				; NULL&lt;br /&gt;
        sub		R9,R9            &lt;br /&gt;
		mul 	R20,R16				; AXL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0 &lt;br /&gt;
		mul 	R23,R16				; AH*BL&lt;br /&gt;
		mov 	R5,R0&lt;br /&gt;
		mov 	R6,R1&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R16				; AL*BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R16				; AM*BL&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x16_48.inc&lt;br /&gt;
;*  Mutiply 	32x16 -&amp;gt; 48 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  45 cycles + 4 (RET) = 49 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x16:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R7:R2 = R17:R16 * R23:R20&lt;br /&gt;
		sub		R9,R9				; NULL&lt;br /&gt;
		mul 	R20,R16				; AXL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R16				; AM*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R23,R17				; AH*BH&lt;br /&gt;
		movw 	R7:R6,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AL*BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R23,R16				; AH*BL&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R17				; AXL*BH&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R17				; AL*BH&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17				; AM*BH&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x24_56.inc&lt;br /&gt;
;*  Mutiply 	32x24 -&amp;gt; 56 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  71 cycles + 4 (RET) = 75 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		&lt;br /&gt;
;   R8:R2 = R18:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub		R6,R6				; NULL&lt;br /&gt;
		sub		R9,R9				; NULL&lt;br /&gt;
		mul 	R20,R16				; AXL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R16				; AM*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R23,R18				; AH*BH&lt;br /&gt;
		mov 	R7,R0&lt;br /&gt;
		mov 	R8,R1&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AL*BL&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R23,R16				; AH*BL		&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17				; AXL*BM&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R22,R17				; AM*BM&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R17				; AL*BM&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R23,R17				; AH*BM		&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R18				; AXL*BH&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R22,R18				; AM*BH&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R18				; AL*BH&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
				&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x32_64.inc&lt;br /&gt;
;*  Mutiply 	32x32 -&amp;gt; 64 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  98 cycles + 4 (RET) = 102 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mulsu16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  16 cycles + 4 (RET) = 20 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mulsu_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		clr		R4				&lt;br /&gt;
		mul		R20,R16			; AL x BL		(u*u)		&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		adc		R4,R10&lt;br /&gt;
		mulsu	R21,R16			; AH x BL		(s*u)&lt;br /&gt;
		sbc		R4,R10		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mulsu16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  23 cycles + 4 (RET) = 27 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mulsu_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AL x BL		(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21,R17			; AH x BH		(s*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R21,R16			; AH x BL		(s*u)&lt;br /&gt;
		sbc		R5,R10&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R17			; AL x BH		(u*u)&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	mulsu24x8_32.inc&lt;br /&gt;
;*		Mutiply 	24x8 -&amp;gt; 32 bit			(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  17 cycles + 4 (RET) = 21 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
mulsu_24x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10		&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0	&lt;br /&gt;
		mul		R21,R16			; AM x BL				&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	mulsu24x16_40.inc&lt;br /&gt;
;*		Mutiply 	24x16 -&amp;gt; 40 bit			(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  37 cycles + 4 (RET) = 41 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
mulsu_24x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R4&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AL x BL		(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0		&lt;br /&gt;
		mulsu	R22,R17			; AH x BH		(s*u)&lt;br /&gt;
		mov		R5,R0&lt;br /&gt;
		mov		R6,R1&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL		(u*u)&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL		(s*u)&lt;br /&gt;
		sbc		R6,R10&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AL x BH		(u*u)&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R17			; AM x BH		(u*u)&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	mulsu24x24_48.inc&lt;br /&gt;
;*		Mutiply 	24x24 -&amp;gt; 48 bit			(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
mulsu_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		mul		R20,R16			; AL x BL		(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R21,R17			; AM x BM		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mulsu	R22,R17			; AH x BH		(s*u)&lt;br /&gt;
		movw	R7:R6,R1:R0&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM		(s*u)&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY&lt;br /&gt;
		movw	R9:R8,R1:R0&lt;br /&gt;
		mul		R21,R16			; AM x BL		(u*u)&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R8&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R10&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R18			; AM x BH		(u*u)&lt;br /&gt;
		movw	R9:R8,R1:R0&lt;br /&gt;
		mul		R20,R17			; AL x BM		(u*u)&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R8&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R10&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL		(s*u)&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		adc		R7,R10&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R18			; AL x BH		(u*u)&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		adc		R7,R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	mulsu32x8_40.inc&lt;br /&gt;
;*		Mutiply 	32x8 -&amp;gt; 40 bit			(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  25 cycles + 4 (RET) = 29 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	mulsu32x16_48.inc&lt;br /&gt;
;*		Mutiply 	32x16 -&amp;gt; 48 bit			(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  50 cycles + 4 (RET) = 54 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	mulsu32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  74 cycles + 4 (RET) = 78 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
mulsu_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11	&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		clr		R6&lt;br /&gt;
		mul		R20,R16			; AXL x BL		(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM x BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mulsu	R23,R18			; AH x BH		(s*u)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1			&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL x BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL		(s*u)&lt;br /&gt;
		sbc		R7,R9			; signed DUMMY&lt;br /&gt;
		sbc		R8,R9			; signed DUMMY&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R17			; AXL x BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R21,R18			; AL x BH		(u*u)&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL x BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mulsu	R23,R17			; AH x BM		(s*u)&lt;br /&gt;
		sbc		R8,R9			; signed DUMMY&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM			(u*u)&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R18			; AXL x BH		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R22,R18			; AM x BH		(u*u)&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	mulsu32x32_64.inc&lt;br /&gt;
;*		Mutiply 	32x32 -&amp;gt; 64 bit			(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  102 cycles + 4 (RET) = 106 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
mulsu_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		sub		R14,R14			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL x BXL		(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R21,R17			; AL x BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R22,R18			; AM x BM		(u*u)&lt;br /&gt;
		movw	R7:R6,R1:R0&lt;br /&gt;
		mulsu	R23,R19			; AH x BH		(s*u)&lt;br /&gt;
		movw	R9:R8,R1:R0		&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL x BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R21,R18			; AL x BM		(u*u)&lt;br /&gt;
		movw	R13:R12,R1:R0&lt;br /&gt;
		mul		R22,R19			; AM x BH		(u*u)	&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R12&lt;br /&gt;
		adc		R6,R13&lt;br /&gt;
		adc		R7,R0&lt;br /&gt;
		adc		R8,R1&lt;br /&gt;
		adc		R9,R14&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AL x BXL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R22,R17			; AM x BL		(u*u)&lt;br /&gt;
		movw	R13:R12,R1:R0&lt;br /&gt;
		mulsu	R23,R18			; AH x BM		(s*u)&lt;br /&gt;
		sbc		R9,R14&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R12&lt;br /&gt;
		adc		R6,R13&lt;br /&gt;
		adc		R7,R0&lt;br /&gt;
		adc		R8,R1&lt;br /&gt;
		adc		R9,R14&lt;br /&gt;
				&lt;br /&gt;
		mul		R20,R18			; AXL x BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R21,R19			; AL x BH		(u*u)&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R14&lt;br /&gt;
		adc		R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul		R22,R16			; AM x BXL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mulsu	R23,R17			; AH x BL		(s*u)&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R14&lt;br /&gt;
		adc		R9,R14&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH*BXL		(s*u)&lt;br /&gt;
		sbc		R7,R14&lt;br /&gt;
		sbc		R8,R14&lt;br /&gt;
		sbc		R9,R14&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R14&lt;br /&gt;
		adc		R8,R14&lt;br /&gt;
		adc		R9,R14&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R19			; AXL x BH		(u*u)&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R14&lt;br /&gt;
		adc		R8,R14&lt;br /&gt;
		adc		R9,R14&lt;br /&gt;
		&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  11 cycles + 4 (RET) = 15 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		sub		R4,R4&lt;br /&gt;
		mulsu	R16,R20			; BL*AL	(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		muls	R21,R16			; AH*BL	(s*s)		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  13 cycles + 4 (RET) = 17 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6 R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  38 cycles + 4 (RET) = 42 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls24x24_48.inc&lt;br /&gt;
;*		Mutiply 	24x24 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x8_40.inc&lt;br /&gt;
;*		Mutiply 	32x8 -&amp;gt; 40 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  34 cycles + 4 (RET) = 38 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R4&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
&lt;br /&gt;
		muls	R23,R16			; AH x BL			(s*s)&lt;br /&gt;
		mov		R5,R0&lt;br /&gt;
		mov		R6,R1&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL			(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		sbc		R5,R10&lt;br /&gt;
		sbc		R6,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		adc		R4,R10&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R21			; BL x AL			(s*u)&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R22			; BL x AM			(s*u)&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x16_48.inc&lt;br /&gt;
;*		Mutiply 	32x16 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  82 cycles + 4 (RET) = 86 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		sub		R6,R6			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL*BL	(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM*BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		muls	R23,R18			; AH*BH		(s*s)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL*BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R16			; AH*BL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL*BM	(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R18,R21			; BH*AL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL*BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R17			; AH*BM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM		(u*u)		&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R20			; BH*AXL	(s*u)&lt;br /&gt;
		sbc		R6,R9&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R22			; BH*AM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x32_64.inc&lt;br /&gt;
;*		Mutiply 	32x32 -&amp;gt; 64 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
SOFTWARE VERSION   --&amp;gt;   Datei:&lt;br /&gt;
 &lt;br /&gt;
HARDWARE VERSION   --&amp;gt; [[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR-Arithmetik]]&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:MULT_ASM.zip&amp;diff=102710</id>
		<title>Datei:MULT ASM.zip</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:MULT_ASM.zip&amp;diff=102710"/>
		<updated>2020-12-06T17:50:02Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: Avrsteffen lud eine neue Version von Datei:MULT ASM.zip hoch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Beinhaltet die Include Dateien dieser Projektseite&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102709</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102709"/>
		<updated>2020-12-06T17:45:17Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* Download */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
Die Cycle Time der einzelnen Funktionen sind in der Tabelle zusammengefasst.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! HW !! 16x8!! 16x16!! 24x8!! 24x16!! 24x24!! 32x8!! 32x16!! 32x24!! 32x32&lt;br /&gt;
|-&lt;br /&gt;
| mul|| 14 || 26 || 21 || 40 || 57|| 29 || 49 || 75 || 102&lt;br /&gt;
|-&lt;br /&gt;
| mulsu|| 20 || 27 || 21 || 41 || 60 || 29 || 54 || 78 || 106&lt;br /&gt;
|-&lt;br /&gt;
| muls|| 19|| 28|| 23 || 42 || 63 || 38 || 60 || 86 || 112&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  10 cycles + 4 (RET) = 14 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_16x8:&lt;br /&gt;
;   R5:R2 = R17:R16 * R21:R20&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R16					; AL * BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		clr		R4&lt;br /&gt;
		mul 	R21,R16					; AH * BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  22 cycles + 4 (RET) = 26 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_16x16:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R5:R2 = R17:R16 * R21:R20&lt;br /&gt;
        sub		R9,R9            &lt;br /&gt;
		mul 	R20,R16					; AL * BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17					; AH * BH&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		&lt;br /&gt;
		mul 	R21,R16					; AH * BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R17					; AL * BH&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  17 cycles + 4 (RET) = 21 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_24x8:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R5:R2 = R16 * R22:R20&lt;br /&gt;
		sub		R9,R9				; NULL&lt;br /&gt;
		mul 	R20,R16				; AL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R16				; AH*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AM*BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		pop		R9		&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  36 cycles + 4 (RET) = 40 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_24x16:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R6:R2 = R17:R16 * R22:R20&lt;br /&gt;
&lt;br /&gt;
		sub		R4,R4				; NULL&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		mul 	R20,R16				; AL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R17				; AH*BH&lt;br /&gt;
		mov 	R5,R0&lt;br /&gt;
		mov 	R6,R1&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AM*BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R16				; AH*BL&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17				; AL*BH&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17				; AM*BH&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		pop		R9		&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul24x24_48.inc&lt;br /&gt;
;*  Mutiply 	24x24 -&amp;gt; 48 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  53 cycles + 4 (RET) = 57 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_24x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		&lt;br /&gt;
;   R7:R2 = R18:R16 * R22:R20&lt;br /&gt;
&lt;br /&gt;
		sub		R9,R9				; NULL&lt;br /&gt;
		mul 	R20,R16				; AL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R16				; AH*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18				; AH*BH&lt;br /&gt;
		movw 	R7:R6,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AM*BL&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R22,R17				; AH*BM		&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17				; AL*BM&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R21,R18				; AM*BH&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R17				; AM*BM	&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R18				; AL*BH&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
				&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x8_40.inc&lt;br /&gt;
;*  Mutiply 	32x8 -&amp;gt; 40 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  25 cycles + 4 (RET) = 29 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x8:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R6:R2 = R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub		R4,R4				; NULL&lt;br /&gt;
        sub		R9,R9            &lt;br /&gt;
		mul 	R20,R16				; AXL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0 &lt;br /&gt;
		mul 	R23,R16				; AH*BL&lt;br /&gt;
		mov 	R5,R0&lt;br /&gt;
		mov 	R6,R1&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R16				; AL*BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R16				; AM*BL&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x16_48.inc&lt;br /&gt;
;*  Mutiply 	32x16 -&amp;gt; 48 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  45 cycles + 4 (RET) = 49 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x16:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R7:R2 = R17:R16 * R23:R20&lt;br /&gt;
		sub		R9,R9				; NULL&lt;br /&gt;
		mul 	R20,R16				; AXL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R16				; AM*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R23,R17				; AH*BH&lt;br /&gt;
		movw 	R7:R6,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AL*BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R23,R16				; AH*BL&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R17				; AXL*BH&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R17				; AL*BH&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17				; AM*BH&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x24_56.inc&lt;br /&gt;
;*  Mutiply 	32x24 -&amp;gt; 56 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  71 cycles + 4 (RET) = 75 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		&lt;br /&gt;
;   R8:R2 = R18:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub		R6,R6				; NULL&lt;br /&gt;
		sub		R9,R9				; NULL&lt;br /&gt;
		mul 	R20,R16				; AXL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R16				; AM*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R23,R18				; AH*BH&lt;br /&gt;
		mov 	R7,R0&lt;br /&gt;
		mov 	R8,R1&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AL*BL&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R23,R16				; AH*BL		&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17				; AXL*BM&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R22,R17				; AM*BM&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R17				; AL*BM&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R23,R17				; AH*BM		&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R18				; AXL*BH&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R22,R18				; AM*BH&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R18				; AL*BH&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
				&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x32_64.inc&lt;br /&gt;
;*  Mutiply 	32x32 -&amp;gt; 64 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  98 cycles + 4 (RET) = 102 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mulsu16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  16 cycles + 4 (RET) = 20 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mulsu_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		clr		R4				&lt;br /&gt;
		mul		R20,R16			; AL x BL		(u*u)		&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		adc		R4,R10&lt;br /&gt;
		mulsu	R21,R16			; AH x BL		(s*u)&lt;br /&gt;
		sbc		R4,R10		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mulsu16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  23 cycles + 4 (RET) = 27 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mulsu_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AL x BL		(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21,R17			; AH x BH		(s*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R21,R16			; AH x BL		(s*u)&lt;br /&gt;
		sbc		R5,R10&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R17			; AL x BH		(u*u)&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	mulsu24x8_32.inc&lt;br /&gt;
;*		Mutiply 	24x8 -&amp;gt; 32 bit			(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  17 cycles + 4 (RET) = 21 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
mulsu_24x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10		&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0	&lt;br /&gt;
		mul		R21,R16			; AM x BL				&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	mulsu24x16_40.inc&lt;br /&gt;
;*		Mutiply 	24x16 -&amp;gt; 40 bit			(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  37 cycles + 4 (RET) = 41 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
mulsu_24x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R4&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AL x BL		(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0		&lt;br /&gt;
		mulsu	R22,R17			; AH x BH		(s*u)&lt;br /&gt;
		mov		R5,R0&lt;br /&gt;
		mov		R6,R1&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL		(u*u)&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL		(s*u)&lt;br /&gt;
		sbc		R6,R10&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AL x BH		(u*u)&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R17			; AM x BH		(u*u)&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	mulsu24x24_48.inc&lt;br /&gt;
;*		Mutiply 	24x24 -&amp;gt; 48 bit			(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
mulsu_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		mul		R20,R16			; AL x BL		(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R21,R17			; AM x BM		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mulsu	R22,R17			; AH x BH		(s*u)&lt;br /&gt;
		movw	R7:R6,R1:R0&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM		(s*u)&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY&lt;br /&gt;
		movw	R9:R8,R1:R0&lt;br /&gt;
		mul		R21,R16			; AM x BL		(u*u)&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R8&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R10&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R18			; AM x BH		(u*u)&lt;br /&gt;
		movw	R9:R8,R1:R0&lt;br /&gt;
		mul		R20,R17			; AL x BM		(u*u)&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R8&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R10&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL		(s*u)&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		adc		R7,R10&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R18			; AL x BH		(u*u)&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		adc		R7,R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	mulsu32x8_40.inc&lt;br /&gt;
;*		Mutiply 	32x8 -&amp;gt; 40 bit			(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  25 cycles + 4 (RET) = 29 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	mulsu32x16_48.inc&lt;br /&gt;
;*		Mutiply 	32x16 -&amp;gt; 48 bit			(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  50 cycles + 4 (RET) = 54 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	mulsu32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  74 cycles + 4 (RET) = 78 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
mulsu_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11	&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		clr		R6&lt;br /&gt;
		mul		R20,R16			; AXL x BL		(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM x BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mulsu	R23,R18			; AH x BH		(s*u)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1			&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL x BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL		(s*u)&lt;br /&gt;
		sbc		R7,R9			; signed DUMMY&lt;br /&gt;
		sbc		R8,R9			; signed DUMMY&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R17			; AXL x BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R21,R18			; AL x BH		(u*u)&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL x BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mulsu	R23,R17			; AH x BM		(s*u)&lt;br /&gt;
		sbc		R8,R9			; signed DUMMY&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM			(u*u)&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R18			; AXL x BH		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R22,R18			; AM x BH		(u*u)&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	mulsu32x32_64.inc&lt;br /&gt;
;*		Mutiply 	32x32 -&amp;gt; 64 bit			(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  102 cycles + 4 (RET) = 106 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
mulsu_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		sub		R14,R14			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL x BXL		(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R21,R17			; AL x BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R22,R18			; AM x BM		(u*u)&lt;br /&gt;
		movw	R7:R6,R1:R0&lt;br /&gt;
		mulsu	R23,R19			; AH x BH		(s*u)&lt;br /&gt;
		movw	R9:R8,R1:R0		&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL x BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R21,R18			; AL x BM		(u*u)&lt;br /&gt;
		movw	R13:R12,R1:R0&lt;br /&gt;
		mul		R22,R19			; AM x BH		(u*u)	&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R12&lt;br /&gt;
		adc		R6,R13&lt;br /&gt;
		adc		R7,R0&lt;br /&gt;
		adc		R8,R1&lt;br /&gt;
		adc		R9,R14&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AL x BXL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R22,R17			; AM x BL		(u*u)&lt;br /&gt;
		movw	R13:R12,R1:R0&lt;br /&gt;
		mulsu	R23,R18			; AH x BM		(s*u)&lt;br /&gt;
		sbc		R9,R14&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R12&lt;br /&gt;
		adc		R6,R13&lt;br /&gt;
		adc		R7,R0&lt;br /&gt;
		adc		R8,R1&lt;br /&gt;
		adc		R9,R14&lt;br /&gt;
				&lt;br /&gt;
		mul		R20,R18			; AXL x BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R21,R19			; AL x BH		(u*u)&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R14&lt;br /&gt;
		adc		R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul		R22,R16			; AM x BXL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mulsu	R23,R17			; AH x BL		(s*u)&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R14&lt;br /&gt;
		adc		R9,R14&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH*BXL		(s*u)&lt;br /&gt;
		sbc		R7,R14&lt;br /&gt;
		sbc		R8,R14&lt;br /&gt;
		sbc		R9,R14&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R14&lt;br /&gt;
		adc		R8,R14&lt;br /&gt;
		adc		R9,R14&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R19			; AXL x BH		(u*u)&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R14&lt;br /&gt;
		adc		R8,R14&lt;br /&gt;
		adc		R9,R14&lt;br /&gt;
		&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  11 cycles + 4 (RET) = 15 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		sub		R4,R4&lt;br /&gt;
		mulsu	R16,R20			; BL*AL	(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		muls	R21,R16			; AH*BL	(s*s)		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  13 cycles + 4 (RET) = 17 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6 R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  38 cycles + 4 (RET) = 42 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls24x24_48.inc&lt;br /&gt;
;*		Mutiply 	24x24 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x8_40.inc&lt;br /&gt;
;*		Mutiply 	32x8 -&amp;gt; 40 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  34 cycles + 4 (RET) = 38 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R4&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
&lt;br /&gt;
		muls	R23,R16			; AH x BL			(s*s)&lt;br /&gt;
		mov		R5,R0&lt;br /&gt;
		mov		R6,R1&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL			(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		sbc		R5,R10&lt;br /&gt;
		sbc		R6,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		adc		R4,R10&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R21			; BL x AL			(s*u)&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R22			; BL x AM			(s*u)&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x16_48.inc&lt;br /&gt;
;*		Mutiply 	32x16 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  82 cycles + 4 (RET) = 86 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		sub		R6,R6			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL*BL	(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM*BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		muls	R23,R18			; AH*BH		(s*s)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL*BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R16			; AH*BL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL*BM	(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R18,R21			; BH*AL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL*BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R17			; AH*BM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM		(u*u)		&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R20			; BH*AXL	(s*u)&lt;br /&gt;
		sbc		R6,R9&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R22			; BH*AM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x32_64.inc&lt;br /&gt;
;*		Mutiply 	32x32 -&amp;gt; 64 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
SOFTWARE VERSION   --&amp;gt;   Datei:&lt;br /&gt;
 &lt;br /&gt;
HARDWARE VERSION   --&amp;gt; [[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102708</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102708"/>
		<updated>2020-12-06T17:41:55Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* signed x unsigned */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
Die Cycle Time der einzelnen Funktionen sind in der Tabelle zusammengefasst.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! HW !! 16x8!! 16x16!! 24x8!! 24x16!! 24x24!! 32x8!! 32x16!! 32x24!! 32x32&lt;br /&gt;
|-&lt;br /&gt;
| mul|| 14 || 26 || 21 || 40 || 57|| 29 || 49 || 75 || 102&lt;br /&gt;
|-&lt;br /&gt;
| mulsu|| 20 || 27 || 21 || 41 || 60 || 29 || 54 || 78 || 106&lt;br /&gt;
|-&lt;br /&gt;
| muls|| 19|| 28|| 23 || 42 || 63 || 38 || 60 || 86 || 112&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  10 cycles + 4 (RET) = 14 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_16x8:&lt;br /&gt;
;   R5:R2 = R17:R16 * R21:R20&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R16					; AL * BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		clr		R4&lt;br /&gt;
		mul 	R21,R16					; AH * BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  22 cycles + 4 (RET) = 26 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_16x16:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R5:R2 = R17:R16 * R21:R20&lt;br /&gt;
        sub		R9,R9            &lt;br /&gt;
		mul 	R20,R16					; AL * BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17					; AH * BH&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		&lt;br /&gt;
		mul 	R21,R16					; AH * BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R17					; AL * BH&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  17 cycles + 4 (RET) = 21 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_24x8:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R5:R2 = R16 * R22:R20&lt;br /&gt;
		sub		R9,R9				; NULL&lt;br /&gt;
		mul 	R20,R16				; AL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R16				; AH*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AM*BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		pop		R9		&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  36 cycles + 4 (RET) = 40 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_24x16:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R6:R2 = R17:R16 * R22:R20&lt;br /&gt;
&lt;br /&gt;
		sub		R4,R4				; NULL&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		mul 	R20,R16				; AL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R17				; AH*BH&lt;br /&gt;
		mov 	R5,R0&lt;br /&gt;
		mov 	R6,R1&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AM*BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R16				; AH*BL&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17				; AL*BH&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17				; AM*BH&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		pop		R9		&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul24x24_48.inc&lt;br /&gt;
;*  Mutiply 	24x24 -&amp;gt; 48 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  53 cycles + 4 (RET) = 57 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_24x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		&lt;br /&gt;
;   R7:R2 = R18:R16 * R22:R20&lt;br /&gt;
&lt;br /&gt;
		sub		R9,R9				; NULL&lt;br /&gt;
		mul 	R20,R16				; AL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R16				; AH*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18				; AH*BH&lt;br /&gt;
		movw 	R7:R6,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AM*BL&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R22,R17				; AH*BM		&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17				; AL*BM&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R21,R18				; AM*BH&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R17				; AM*BM	&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R18				; AL*BH&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
				&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x8_40.inc&lt;br /&gt;
;*  Mutiply 	32x8 -&amp;gt; 40 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  25 cycles + 4 (RET) = 29 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x8:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R6:R2 = R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub		R4,R4				; NULL&lt;br /&gt;
        sub		R9,R9            &lt;br /&gt;
		mul 	R20,R16				; AXL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0 &lt;br /&gt;
		mul 	R23,R16				; AH*BL&lt;br /&gt;
		mov 	R5,R0&lt;br /&gt;
		mov 	R6,R1&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R16				; AL*BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R16				; AM*BL&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x16_48.inc&lt;br /&gt;
;*  Mutiply 	32x16 -&amp;gt; 48 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  45 cycles + 4 (RET) = 49 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x16:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R7:R2 = R17:R16 * R23:R20&lt;br /&gt;
		sub		R9,R9				; NULL&lt;br /&gt;
		mul 	R20,R16				; AXL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R16				; AM*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R23,R17				; AH*BH&lt;br /&gt;
		movw 	R7:R6,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AL*BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R23,R16				; AH*BL&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R17				; AXL*BH&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R17				; AL*BH&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17				; AM*BH&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x24_56.inc&lt;br /&gt;
;*  Mutiply 	32x24 -&amp;gt; 56 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  71 cycles + 4 (RET) = 75 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		&lt;br /&gt;
;   R8:R2 = R18:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub		R6,R6				; NULL&lt;br /&gt;
		sub		R9,R9				; NULL&lt;br /&gt;
		mul 	R20,R16				; AXL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R16				; AM*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R23,R18				; AH*BH&lt;br /&gt;
		mov 	R7,R0&lt;br /&gt;
		mov 	R8,R1&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AL*BL&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R23,R16				; AH*BL		&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17				; AXL*BM&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R22,R17				; AM*BM&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R17				; AL*BM&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R23,R17				; AH*BM		&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R18				; AXL*BH&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R22,R18				; AM*BH&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R18				; AL*BH&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
				&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x32_64.inc&lt;br /&gt;
;*  Mutiply 	32x32 -&amp;gt; 64 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  98 cycles + 4 (RET) = 102 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mulsu16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  16 cycles + 4 (RET) = 20 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mulsu_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		clr		R4				&lt;br /&gt;
		mul		R20,R16			; AL x BL		(u*u)		&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		adc		R4,R10&lt;br /&gt;
		mulsu	R21,R16			; AH x BL		(s*u)&lt;br /&gt;
		sbc		R4,R10		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mulsu16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  23 cycles + 4 (RET) = 27 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mulsu_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AL x BL		(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21,R17			; AH x BH		(s*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R21,R16			; AH x BL		(s*u)&lt;br /&gt;
		sbc		R5,R10&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R17			; AL x BH		(u*u)&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	mulsu24x8_32.inc&lt;br /&gt;
;*		Mutiply 	24x8 -&amp;gt; 32 bit			(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  17 cycles + 4 (RET) = 21 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
mulsu_24x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10		&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0	&lt;br /&gt;
		mul		R21,R16			; AM x BL				&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	mulsu24x16_40.inc&lt;br /&gt;
;*		Mutiply 	24x16 -&amp;gt; 40 bit			(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  37 cycles + 4 (RET) = 41 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
mulsu_24x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R4&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AL x BL		(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0		&lt;br /&gt;
		mulsu	R22,R17			; AH x BH		(s*u)&lt;br /&gt;
		mov		R5,R0&lt;br /&gt;
		mov		R6,R1&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL		(u*u)&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL		(s*u)&lt;br /&gt;
		sbc		R6,R10&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AL x BH		(u*u)&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R17			; AM x BH		(u*u)&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	mulsu24x24_48.inc&lt;br /&gt;
;*		Mutiply 	24x24 -&amp;gt; 48 bit			(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
mulsu_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		mul		R20,R16			; AL x BL		(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R21,R17			; AM x BM		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mulsu	R22,R17			; AH x BH		(s*u)&lt;br /&gt;
		movw	R7:R6,R1:R0&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM		(s*u)&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY&lt;br /&gt;
		movw	R9:R8,R1:R0&lt;br /&gt;
		mul		R21,R16			; AM x BL		(u*u)&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R8&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R10&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R18			; AM x BH		(u*u)&lt;br /&gt;
		movw	R9:R8,R1:R0&lt;br /&gt;
		mul		R20,R17			; AL x BM		(u*u)&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R8&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R10&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL		(s*u)&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		adc		R7,R10&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R18			; AL x BH		(u*u)&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		adc		R7,R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	mulsu32x8_40.inc&lt;br /&gt;
;*		Mutiply 	32x8 -&amp;gt; 40 bit			(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  25 cycles + 4 (RET) = 29 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	mulsu32x16_48.inc&lt;br /&gt;
;*		Mutiply 	32x16 -&amp;gt; 48 bit			(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  50 cycles + 4 (RET) = 54 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	mulsu32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  74 cycles + 4 (RET) = 78 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
mulsu_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11	&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		clr		R6&lt;br /&gt;
		mul		R20,R16			; AXL x BL		(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM x BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mulsu	R23,R18			; AH x BH		(s*u)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1			&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL x BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL		(s*u)&lt;br /&gt;
		sbc		R7,R9			; signed DUMMY&lt;br /&gt;
		sbc		R8,R9			; signed DUMMY&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R17			; AXL x BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R21,R18			; AL x BH		(u*u)&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL x BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mulsu	R23,R17			; AH x BM		(s*u)&lt;br /&gt;
		sbc		R8,R9			; signed DUMMY&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM			(u*u)&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R18			; AXL x BH		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R22,R18			; AM x BH		(u*u)&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	mulsu32x32_64.inc&lt;br /&gt;
;*		Mutiply 	32x32 -&amp;gt; 64 bit			(signed * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  102 cycles + 4 (RET) = 106 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
mulsu_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		sub		R14,R14			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL x BXL		(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R21,R17			; AL x BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R22,R18			; AM x BM		(u*u)&lt;br /&gt;
		movw	R7:R6,R1:R0&lt;br /&gt;
		mulsu	R23,R19			; AH x BH		(s*u)&lt;br /&gt;
		movw	R9:R8,R1:R0		&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL x BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R21,R18			; AL x BM		(u*u)&lt;br /&gt;
		movw	R13:R12,R1:R0&lt;br /&gt;
		mul		R22,R19			; AM x BH		(u*u)	&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R12&lt;br /&gt;
		adc		R6,R13&lt;br /&gt;
		adc		R7,R0&lt;br /&gt;
		adc		R8,R1&lt;br /&gt;
		adc		R9,R14&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AL x BXL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R22,R17			; AM x BL		(u*u)&lt;br /&gt;
		movw	R13:R12,R1:R0&lt;br /&gt;
		mulsu	R23,R18			; AH x BM		(s*u)&lt;br /&gt;
		sbc		R9,R14&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R12&lt;br /&gt;
		adc		R6,R13&lt;br /&gt;
		adc		R7,R0&lt;br /&gt;
		adc		R8,R1&lt;br /&gt;
		adc		R9,R14&lt;br /&gt;
				&lt;br /&gt;
		mul		R20,R18			; AXL x BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R21,R19			; AL x BH		(u*u)&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R14&lt;br /&gt;
		adc		R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul		R22,R16			; AM x BXL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mulsu	R23,R17			; AH x BL		(s*u)&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R14&lt;br /&gt;
		adc		R9,R14&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH*BXL		(s*u)&lt;br /&gt;
		sbc		R7,R14&lt;br /&gt;
		sbc		R8,R14&lt;br /&gt;
		sbc		R9,R14&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R14&lt;br /&gt;
		adc		R8,R14&lt;br /&gt;
		adc		R9,R14&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R19			; AXL x BH		(u*u)&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R14&lt;br /&gt;
		adc		R8,R14&lt;br /&gt;
		adc		R9,R14&lt;br /&gt;
		&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  11 cycles + 4 (RET) = 15 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		sub		R4,R4&lt;br /&gt;
		mulsu	R16,R20			; BL*AL	(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		muls	R21,R16			; AH*BL	(s*s)		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  13 cycles + 4 (RET) = 17 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6 R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  38 cycles + 4 (RET) = 42 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls24x24_48.inc&lt;br /&gt;
;*		Mutiply 	24x24 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x8_40.inc&lt;br /&gt;
;*		Mutiply 	32x8 -&amp;gt; 40 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  34 cycles + 4 (RET) = 38 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R4&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
&lt;br /&gt;
		muls	R23,R16			; AH x BL			(s*s)&lt;br /&gt;
		mov		R5,R0&lt;br /&gt;
		mov		R6,R1&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL			(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		sbc		R5,R10&lt;br /&gt;
		sbc		R6,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		adc		R4,R10&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R21			; BL x AL			(s*u)&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R22			; BL x AM			(s*u)&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x16_48.inc&lt;br /&gt;
;*		Mutiply 	32x16 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  82 cycles + 4 (RET) = 86 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		sub		R6,R6			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL*BL	(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM*BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		muls	R23,R18			; AH*BH		(s*s)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL*BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R16			; AH*BL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL*BM	(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R18,R21			; BH*AL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL*BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R17			; AH*BM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM		(u*u)		&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R20			; BH*AXL	(s*u)&lt;br /&gt;
		sbc		R6,R9&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R22			; BH*AM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x32_64.inc&lt;br /&gt;
;*		Mutiply 	32x32 -&amp;gt; 64 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102707</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102707"/>
		<updated>2020-12-06T17:34:45Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* Hardware Version */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
Die Cycle Time der einzelnen Funktionen sind in der Tabelle zusammengefasst.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! HW !! 16x8!! 16x16!! 24x8!! 24x16!! 24x24!! 32x8!! 32x16!! 32x24!! 32x32&lt;br /&gt;
|-&lt;br /&gt;
| mul|| 14 || 26 || 21 || 40 || 57|| 29 || 49 || 75 || 102&lt;br /&gt;
|-&lt;br /&gt;
| mulsu|| 20 || 27 || 21 || 41 || 60 || 29 || 54 || 78 || 106&lt;br /&gt;
|-&lt;br /&gt;
| muls|| 19|| 28|| 23 || 42 || 63 || 38 || 60 || 86 || 112&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  10 cycles + 4 (RET) = 14 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_16x8:&lt;br /&gt;
;   R5:R2 = R17:R16 * R21:R20&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R16					; AL * BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		clr		R4&lt;br /&gt;
		mul 	R21,R16					; AH * BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  22 cycles + 4 (RET) = 26 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_16x16:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R5:R2 = R17:R16 * R21:R20&lt;br /&gt;
        sub		R9,R9            &lt;br /&gt;
		mul 	R20,R16					; AL * BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17					; AH * BH&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		&lt;br /&gt;
		mul 	R21,R16					; AH * BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R17					; AL * BH&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  17 cycles + 4 (RET) = 21 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_24x8:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R5:R2 = R16 * R22:R20&lt;br /&gt;
		sub		R9,R9				; NULL&lt;br /&gt;
		mul 	R20,R16				; AL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R16				; AH*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AM*BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		pop		R9		&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  36 cycles + 4 (RET) = 40 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_24x16:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R6:R2 = R17:R16 * R22:R20&lt;br /&gt;
&lt;br /&gt;
		sub		R4,R4				; NULL&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		mul 	R20,R16				; AL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R17				; AH*BH&lt;br /&gt;
		mov 	R5,R0&lt;br /&gt;
		mov 	R6,R1&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AM*BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R16				; AH*BL&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17				; AL*BH&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17				; AM*BH&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		pop		R9		&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul24x24_48.inc&lt;br /&gt;
;*  Mutiply 	24x24 -&amp;gt; 48 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  53 cycles + 4 (RET) = 57 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_24x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		&lt;br /&gt;
;   R7:R2 = R18:R16 * R22:R20&lt;br /&gt;
&lt;br /&gt;
		sub		R9,R9				; NULL&lt;br /&gt;
		mul 	R20,R16				; AL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R16				; AH*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18				; AH*BH&lt;br /&gt;
		movw 	R7:R6,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AM*BL&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R22,R17				; AH*BM		&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17				; AL*BM&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R21,R18				; AM*BH&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R17				; AM*BM	&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R18				; AL*BH&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
				&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x8_40.inc&lt;br /&gt;
;*  Mutiply 	32x8 -&amp;gt; 40 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  25 cycles + 4 (RET) = 29 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x8:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R6:R2 = R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub		R4,R4				; NULL&lt;br /&gt;
        sub		R9,R9            &lt;br /&gt;
		mul 	R20,R16				; AXL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0 &lt;br /&gt;
		mul 	R23,R16				; AH*BL&lt;br /&gt;
		mov 	R5,R0&lt;br /&gt;
		mov 	R6,R1&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R16				; AL*BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R16				; AM*BL&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x16_48.inc&lt;br /&gt;
;*  Mutiply 	32x16 -&amp;gt; 48 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  45 cycles + 4 (RET) = 49 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x16:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R7:R2 = R17:R16 * R23:R20&lt;br /&gt;
		sub		R9,R9				; NULL&lt;br /&gt;
		mul 	R20,R16				; AXL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R16				; AM*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R23,R17				; AH*BH&lt;br /&gt;
		movw 	R7:R6,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AL*BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R23,R16				; AH*BL&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R17				; AXL*BH&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R17				; AL*BH&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17				; AM*BH&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x24_56.inc&lt;br /&gt;
;*  Mutiply 	32x24 -&amp;gt; 56 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  71 cycles + 4 (RET) = 75 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		&lt;br /&gt;
;   R8:R2 = R18:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub		R6,R6				; NULL&lt;br /&gt;
		sub		R9,R9				; NULL&lt;br /&gt;
		mul 	R20,R16				; AXL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R16				; AM*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R23,R18				; AH*BH&lt;br /&gt;
		mov 	R7,R0&lt;br /&gt;
		mov 	R8,R1&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AL*BL&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R23,R16				; AH*BL		&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17				; AXL*BM&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R22,R17				; AM*BM&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R17				; AL*BM&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R23,R17				; AH*BM		&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R18				; AXL*BH&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R22,R18				; AM*BH&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R18				; AL*BH&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
				&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x32_64.inc&lt;br /&gt;
;*  Mutiply 	32x32 -&amp;gt; 64 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  98 cycles + 4 (RET) = 102 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  11 cycles + 4 (RET) = 15 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		sub		R4,R4&lt;br /&gt;
		mulsu	R16,R20			; BL*AL	(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		muls	R21,R16			; AH*BL	(s*s)		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  13 cycles + 4 (RET) = 17 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6 R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  38 cycles + 4 (RET) = 42 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls24x24_48.inc&lt;br /&gt;
;*		Mutiply 	24x24 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x8_40.inc&lt;br /&gt;
;*		Mutiply 	32x8 -&amp;gt; 40 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  34 cycles + 4 (RET) = 38 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R4&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
&lt;br /&gt;
		muls	R23,R16			; AH x BL			(s*s)&lt;br /&gt;
		mov		R5,R0&lt;br /&gt;
		mov		R6,R1&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL			(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		sbc		R5,R10&lt;br /&gt;
		sbc		R6,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		adc		R4,R10&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R21			; BL x AL			(s*u)&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R22			; BL x AM			(s*u)&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x16_48.inc&lt;br /&gt;
;*		Mutiply 	32x16 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  82 cycles + 4 (RET) = 86 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		sub		R6,R6			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL*BL	(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM*BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		muls	R23,R18			; AH*BH		(s*s)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL*BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R16			; AH*BL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL*BM	(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R18,R21			; BH*AL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL*BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R17			; AH*BM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM		(u*u)		&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R20			; BH*AXL	(s*u)&lt;br /&gt;
		sbc		R6,R9&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R22			; BH*AM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x32_64.inc&lt;br /&gt;
;*		Mutiply 	32x32 -&amp;gt; 64 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102706</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102706"/>
		<updated>2020-12-06T15:31:10Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* unsigned x unsigned */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  10 cycles + 4 (RET) = 14 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_16x8:&lt;br /&gt;
;   R5:R2 = R17:R16 * R21:R20&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R16					; AL * BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		clr		R4&lt;br /&gt;
		mul 	R21,R16					; AH * BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  22 cycles + 4 (RET) = 26 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_16x16:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R5:R2 = R17:R16 * R21:R20&lt;br /&gt;
        sub		R9,R9            &lt;br /&gt;
		mul 	R20,R16					; AL * BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17					; AH * BH&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		&lt;br /&gt;
		mul 	R21,R16					; AH * BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R17					; AL * BH&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  17 cycles + 4 (RET) = 21 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_24x8:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R5:R2 = R16 * R22:R20&lt;br /&gt;
		sub		R9,R9				; NULL&lt;br /&gt;
		mul 	R20,R16				; AL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R16				; AH*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AM*BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		pop		R9		&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  36 cycles + 4 (RET) = 40 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_24x16:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R6:R2 = R17:R16 * R22:R20&lt;br /&gt;
&lt;br /&gt;
		sub		R4,R4				; NULL&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		mul 	R20,R16				; AL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R17				; AH*BH&lt;br /&gt;
		mov 	R5,R0&lt;br /&gt;
		mov 	R6,R1&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AM*BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R16				; AH*BL&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17				; AL*BH&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17				; AM*BH&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		pop		R9		&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul24x24_48.inc&lt;br /&gt;
;*  Mutiply 	24x24 -&amp;gt; 48 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  53 cycles + 4 (RET) = 57 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_24x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		&lt;br /&gt;
;   R7:R2 = R18:R16 * R22:R20&lt;br /&gt;
&lt;br /&gt;
		sub		R9,R9				; NULL&lt;br /&gt;
		mul 	R20,R16				; AL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R16				; AH*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18				; AH*BH&lt;br /&gt;
		movw 	R7:R6,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AM*BL&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R22,R17				; AH*BM		&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17				; AL*BM&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R21,R18				; AM*BH&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R17				; AM*BM	&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R18				; AL*BH&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
				&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x8_40.inc&lt;br /&gt;
;*  Mutiply 	32x8 -&amp;gt; 40 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  25 cycles + 4 (RET) = 29 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x8:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R6:R2 = R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub		R4,R4				; NULL&lt;br /&gt;
        sub		R9,R9            &lt;br /&gt;
		mul 	R20,R16				; AXL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0 &lt;br /&gt;
		mul 	R23,R16				; AH*BL&lt;br /&gt;
		mov 	R5,R0&lt;br /&gt;
		mov 	R6,R1&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R16				; AL*BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R16				; AM*BL&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x16_48.inc&lt;br /&gt;
;*  Mutiply 	32x16 -&amp;gt; 48 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  45 cycles + 4 (RET) = 49 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x16:&lt;br /&gt;
		push	R9&lt;br /&gt;
;   R7:R2 = R17:R16 * R23:R20&lt;br /&gt;
		sub		R9,R9				; NULL&lt;br /&gt;
		mul 	R20,R16				; AXL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R16				; AM*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R23,R17				; AH*BH&lt;br /&gt;
		movw 	R7:R6,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AL*BL&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R23,R16				; AH*BL&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R17				; AXL*BH&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R9&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R17				; AL*BH&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17				; AM*BH&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x24_56.inc&lt;br /&gt;
;*  Mutiply 	32x24 -&amp;gt; 56 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  71 cycles + 4 (RET) = 75 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		&lt;br /&gt;
;   R8:R2 = R18:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub		R6,R6				; NULL&lt;br /&gt;
		sub		R9,R9				; NULL&lt;br /&gt;
		mul 	R20,R16				; AXL*BL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R22,R16				; AM*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R23,R18				; AH*BH&lt;br /&gt;
		mov 	R7,R0&lt;br /&gt;
		mov 	R8,R1&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16				; AL*BL&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R23,R16				; AH*BL		&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17				; AXL*BM&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R22,R17				; AM*BM&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R17				; AL*BM&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R23,R17				; AH*BM		&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R18				; AXL*BH&lt;br /&gt;
		movw	R11:R10,R1:R0&lt;br /&gt;
		mul		R22,R18				; AM*BH&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R18				; AL*BH&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
				&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x32_64.inc&lt;br /&gt;
;*  Mutiply 	32x32 -&amp;gt; 64 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  98 cycles + 4 (RET) = 102 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  11 cycles + 4 (RET) = 15 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		sub		R4,R4&lt;br /&gt;
		mulsu	R16,R20			; BL*AL	(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		muls	R21,R16			; AH*BL	(s*s)		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  13 cycles + 4 (RET) = 17 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6 R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  38 cycles + 4 (RET) = 42 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls24x24_48.inc&lt;br /&gt;
;*		Mutiply 	24x24 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x8_40.inc&lt;br /&gt;
;*		Mutiply 	32x8 -&amp;gt; 40 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  34 cycles + 4 (RET) = 38 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R4&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
&lt;br /&gt;
		muls	R23,R16			; AH x BL			(s*s)&lt;br /&gt;
		mov		R5,R0&lt;br /&gt;
		mov		R6,R1&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL			(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		sbc		R5,R10&lt;br /&gt;
		sbc		R6,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		adc		R4,R10&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R21			; BL x AL			(s*u)&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R22			; BL x AM			(s*u)&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x16_48.inc&lt;br /&gt;
;*		Mutiply 	32x16 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  82 cycles + 4 (RET) = 86 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		sub		R6,R6			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL*BL	(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM*BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		muls	R23,R18			; AH*BH		(s*s)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL*BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R16			; AH*BL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL*BM	(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R18,R21			; BH*AL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL*BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R17			; AH*BM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM		(u*u)		&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R20			; BH*AXL	(s*u)&lt;br /&gt;
		sbc		R6,R9&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R22			; BH*AM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x32_64.inc&lt;br /&gt;
;*		Mutiply 	32x32 -&amp;gt; 64 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102705</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102705"/>
		<updated>2020-12-06T15:26:32Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* mul_16x8_24 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x32_64.inc&lt;br /&gt;
;*  Mutiply 	32x32 -&amp;gt; 64 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  98 cycles + 4 (RET) = 102 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  11 cycles + 4 (RET) = 15 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		sub		R4,R4&lt;br /&gt;
		mulsu	R16,R20			; BL*AL	(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		muls	R21,R16			; AH*BL	(s*s)		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  13 cycles + 4 (RET) = 17 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6 R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  38 cycles + 4 (RET) = 42 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls24x24_48.inc&lt;br /&gt;
;*		Mutiply 	24x24 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x8_40.inc&lt;br /&gt;
;*		Mutiply 	32x8 -&amp;gt; 40 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  34 cycles + 4 (RET) = 38 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R4&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
&lt;br /&gt;
		muls	R23,R16			; AH x BL			(s*s)&lt;br /&gt;
		mov		R5,R0&lt;br /&gt;
		mov		R6,R1&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL			(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		sbc		R5,R10&lt;br /&gt;
		sbc		R6,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		adc		R4,R10&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R21			; BL x AL			(s*u)&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R22			; BL x AM			(s*u)&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x16_48.inc&lt;br /&gt;
;*		Mutiply 	32x16 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  82 cycles + 4 (RET) = 86 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		sub		R6,R6			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL*BL	(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM*BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		muls	R23,R18			; AH*BH		(s*s)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL*BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R16			; AH*BL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL*BM	(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R18,R21			; BH*AL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL*BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R17			; AH*BM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM		(u*u)		&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R20			; BH*AXL	(s*u)&lt;br /&gt;
		sbc		R6,R9&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R22			; BH*AM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x32_64.inc&lt;br /&gt;
;*		Mutiply 	32x32 -&amp;gt; 64 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102704</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102704"/>
		<updated>2020-12-06T15:26:12Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* mul_16x16_32 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x32_64.inc&lt;br /&gt;
;*  Mutiply 	32x32 -&amp;gt; 64 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  98 cycles + 4 (RET) = 102 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  11 cycles + 4 (RET) = 15 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		sub		R4,R4&lt;br /&gt;
		mulsu	R16,R20			; BL*AL	(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		muls	R21,R16			; AH*BL	(s*s)		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  13 cycles + 4 (RET) = 17 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6 R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  38 cycles + 4 (RET) = 42 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls24x24_48.inc&lt;br /&gt;
;*		Mutiply 	24x24 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x8_40.inc&lt;br /&gt;
;*		Mutiply 	32x8 -&amp;gt; 40 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  34 cycles + 4 (RET) = 38 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R4&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
&lt;br /&gt;
		muls	R23,R16			; AH x BL			(s*s)&lt;br /&gt;
		mov		R5,R0&lt;br /&gt;
		mov		R6,R1&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL			(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		sbc		R5,R10&lt;br /&gt;
		sbc		R6,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		adc		R4,R10&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R21			; BL x AL			(s*u)&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R22			; BL x AM			(s*u)&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x16_48.inc&lt;br /&gt;
;*		Mutiply 	32x16 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  82 cycles + 4 (RET) = 86 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		sub		R6,R6			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL*BL	(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM*BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		muls	R23,R18			; AH*BH		(s*s)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL*BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R16			; AH*BL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL*BM	(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R18,R21			; BH*AL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL*BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R17			; AH*BM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM		(u*u)		&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R20			; BH*AXL	(s*u)&lt;br /&gt;
		sbc		R6,R9&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R22			; BH*AM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x32_64.inc&lt;br /&gt;
;*		Mutiply 	32x32 -&amp;gt; 64 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102703</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102703"/>
		<updated>2020-12-06T15:25:55Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* mul_24x8_32 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x32_64.inc&lt;br /&gt;
;*  Mutiply 	32x32 -&amp;gt; 64 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  98 cycles + 4 (RET) = 102 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  11 cycles + 4 (RET) = 15 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		sub		R4,R4&lt;br /&gt;
		mulsu	R16,R20			; BL*AL	(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		muls	R21,R16			; AH*BL	(s*s)		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  13 cycles + 4 (RET) = 17 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6 R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  38 cycles + 4 (RET) = 42 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls24x24_48.inc&lt;br /&gt;
;*		Mutiply 	24x24 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x8_40.inc&lt;br /&gt;
;*		Mutiply 	32x8 -&amp;gt; 40 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  34 cycles + 4 (RET) = 38 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R4&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
&lt;br /&gt;
		muls	R23,R16			; AH x BL			(s*s)&lt;br /&gt;
		mov		R5,R0&lt;br /&gt;
		mov		R6,R1&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL			(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		sbc		R5,R10&lt;br /&gt;
		sbc		R6,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		adc		R4,R10&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R21			; BL x AL			(s*u)&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R22			; BL x AM			(s*u)&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x16_48.inc&lt;br /&gt;
;*		Mutiply 	32x16 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  82 cycles + 4 (RET) = 86 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		sub		R6,R6			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL*BL	(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM*BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		muls	R23,R18			; AH*BH		(s*s)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL*BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R16			; AH*BL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL*BM	(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R18,R21			; BH*AL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL*BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R17			; AH*BM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM		(u*u)		&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R20			; BH*AXL	(s*u)&lt;br /&gt;
		sbc		R6,R9&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R22			; BH*AM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x32_64.inc&lt;br /&gt;
;*		Mutiply 	32x32 -&amp;gt; 64 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102702</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102702"/>
		<updated>2020-12-06T15:25:31Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* mul_24x16_40 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x32_64.inc&lt;br /&gt;
;*  Mutiply 	32x32 -&amp;gt; 64 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  98 cycles + 4 (RET) = 102 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  11 cycles + 4 (RET) = 15 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		sub		R4,R4&lt;br /&gt;
		mulsu	R16,R20			; BL*AL	(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		muls	R21,R16			; AH*BL	(s*s)		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  13 cycles + 4 (RET) = 17 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6 R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  38 cycles + 4 (RET) = 42 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls24x24_48.inc&lt;br /&gt;
;*		Mutiply 	24x24 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x8_40.inc&lt;br /&gt;
;*		Mutiply 	32x8 -&amp;gt; 40 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  34 cycles + 4 (RET) = 38 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R4&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
&lt;br /&gt;
		muls	R23,R16			; AH x BL			(s*s)&lt;br /&gt;
		mov		R5,R0&lt;br /&gt;
		mov		R6,R1&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL			(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		sbc		R5,R10&lt;br /&gt;
		sbc		R6,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		adc		R4,R10&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R21			; BL x AL			(s*u)&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R22			; BL x AM			(s*u)&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x16_48.inc&lt;br /&gt;
;*		Mutiply 	32x16 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  82 cycles + 4 (RET) = 86 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		sub		R6,R6			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL*BL	(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM*BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		muls	R23,R18			; AH*BH		(s*s)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL*BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R16			; AH*BL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL*BM	(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R18,R21			; BH*AL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL*BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R17			; AH*BM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM		(u*u)		&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R20			; BH*AXL	(s*u)&lt;br /&gt;
		sbc		R6,R9&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R22			; BH*AM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x32_64.inc&lt;br /&gt;
;*		Mutiply 	32x32 -&amp;gt; 64 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102701</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102701"/>
		<updated>2020-12-06T15:25:15Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* mul_24x24_48 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x32_64.inc&lt;br /&gt;
;*  Mutiply 	32x32 -&amp;gt; 64 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  98 cycles + 4 (RET) = 102 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  11 cycles + 4 (RET) = 15 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		sub		R4,R4&lt;br /&gt;
		mulsu	R16,R20			; BL*AL	(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		muls	R21,R16			; AH*BL	(s*s)		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  13 cycles + 4 (RET) = 17 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6 R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  38 cycles + 4 (RET) = 42 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls24x24_48.inc&lt;br /&gt;
;*		Mutiply 	24x24 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x8_40.inc&lt;br /&gt;
;*		Mutiply 	32x8 -&amp;gt; 40 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  34 cycles + 4 (RET) = 38 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R4&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
&lt;br /&gt;
		muls	R23,R16			; AH x BL			(s*s)&lt;br /&gt;
		mov		R5,R0&lt;br /&gt;
		mov		R6,R1&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL			(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		sbc		R5,R10&lt;br /&gt;
		sbc		R6,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		adc		R4,R10&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R21			; BL x AL			(s*u)&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R22			; BL x AM			(s*u)&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x16_48.inc&lt;br /&gt;
;*		Mutiply 	32x16 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  82 cycles + 4 (RET) = 86 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		sub		R6,R6			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL*BL	(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM*BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		muls	R23,R18			; AH*BH		(s*s)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL*BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R16			; AH*BL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL*BM	(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R18,R21			; BH*AL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL*BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R17			; AH*BM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM		(u*u)		&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R20			; BH*AXL	(s*u)&lt;br /&gt;
		sbc		R6,R9&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R22			; BH*AM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x32_64.inc&lt;br /&gt;
;*		Mutiply 	32x32 -&amp;gt; 64 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102700</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102700"/>
		<updated>2020-12-06T15:24:48Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* mul_32x8_40 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x32_64.inc&lt;br /&gt;
;*  Mutiply 	32x32 -&amp;gt; 64 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  98 cycles + 4 (RET) = 102 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  11 cycles + 4 (RET) = 15 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		sub		R4,R4&lt;br /&gt;
		mulsu	R16,R20			; BL*AL	(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		muls	R21,R16			; AH*BL	(s*s)		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  13 cycles + 4 (RET) = 17 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6 R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  38 cycles + 4 (RET) = 42 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls24x24_48.inc&lt;br /&gt;
;*		Mutiply 	24x24 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x8_40.inc&lt;br /&gt;
;*		Mutiply 	32x8 -&amp;gt; 40 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  34 cycles + 4 (RET) = 38 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R4&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
&lt;br /&gt;
		muls	R23,R16			; AH x BL			(s*s)&lt;br /&gt;
		mov		R5,R0&lt;br /&gt;
		mov		R6,R1&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL			(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		sbc		R5,R10&lt;br /&gt;
		sbc		R6,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		adc		R4,R10&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R21			; BL x AL			(s*u)&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R22			; BL x AM			(s*u)&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x16_48.inc&lt;br /&gt;
;*		Mutiply 	32x16 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  82 cycles + 4 (RET) = 86 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		sub		R6,R6			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL*BL	(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM*BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		muls	R23,R18			; AH*BH		(s*s)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL*BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R16			; AH*BL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL*BM	(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R18,R21			; BH*AL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL*BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R17			; AH*BM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM		(u*u)		&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R20			; BH*AXL	(s*u)&lt;br /&gt;
		sbc		R6,R9&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R22			; BH*AM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x32_64.inc&lt;br /&gt;
;*		Mutiply 	32x32 -&amp;gt; 64 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102699</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102699"/>
		<updated>2020-12-06T15:24:23Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* mul_32x16_48 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x32_64.inc&lt;br /&gt;
;*  Mutiply 	32x32 -&amp;gt; 64 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  98 cycles + 4 (RET) = 102 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  11 cycles + 4 (RET) = 15 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		sub		R4,R4&lt;br /&gt;
		mulsu	R16,R20			; BL*AL	(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		muls	R21,R16			; AH*BL	(s*s)		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  13 cycles + 4 (RET) = 17 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6 R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  38 cycles + 4 (RET) = 42 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls24x24_48.inc&lt;br /&gt;
;*		Mutiply 	24x24 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x8_40.inc&lt;br /&gt;
;*		Mutiply 	32x8 -&amp;gt; 40 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  34 cycles + 4 (RET) = 38 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R4&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
&lt;br /&gt;
		muls	R23,R16			; AH x BL			(s*s)&lt;br /&gt;
		mov		R5,R0&lt;br /&gt;
		mov		R6,R1&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL			(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		sbc		R5,R10&lt;br /&gt;
		sbc		R6,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		adc		R4,R10&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R21			; BL x AL			(s*u)&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R22			; BL x AM			(s*u)&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x16_48.inc&lt;br /&gt;
;*		Mutiply 	32x16 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  82 cycles + 4 (RET) = 86 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		sub		R6,R6			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL*BL	(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM*BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		muls	R23,R18			; AH*BH		(s*s)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL*BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R16			; AH*BL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL*BM	(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R18,R21			; BH*AL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL*BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R17			; AH*BM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM		(u*u)		&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R20			; BH*AXL	(s*u)&lt;br /&gt;
		sbc		R6,R9&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R22			; BH*AM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x32_64.inc&lt;br /&gt;
;*		Mutiply 	32x32 -&amp;gt; 64 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102698</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102698"/>
		<updated>2020-12-06T15:23:57Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* mul_32x24_56 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x32_64.inc&lt;br /&gt;
;*  Mutiply 	32x32 -&amp;gt; 64 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  98 cycles + 4 (RET) = 102 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  11 cycles + 4 (RET) = 15 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		sub		R4,R4&lt;br /&gt;
		mulsu	R16,R20			; BL*AL	(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		muls	R21,R16			; AH*BL	(s*s)		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  13 cycles + 4 (RET) = 17 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6 R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  38 cycles + 4 (RET) = 42 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls24x24_48.inc&lt;br /&gt;
;*		Mutiply 	24x24 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x8_40.inc&lt;br /&gt;
;*		Mutiply 	32x8 -&amp;gt; 40 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  34 cycles + 4 (RET) = 38 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R4&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
&lt;br /&gt;
		muls	R23,R16			; AH x BL			(s*s)&lt;br /&gt;
		mov		R5,R0&lt;br /&gt;
		mov		R6,R1&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL			(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		sbc		R5,R10&lt;br /&gt;
		sbc		R6,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		adc		R4,R10&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R21			; BL x AL			(s*u)&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R22			; BL x AM			(s*u)&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x16_48.inc&lt;br /&gt;
;*		Mutiply 	32x16 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  82 cycles + 4 (RET) = 86 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		sub		R6,R6			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL*BL	(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM*BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		muls	R23,R18			; AH*BH		(s*s)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL*BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R16			; AH*BL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL*BM	(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R18,R21			; BH*AL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL*BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R17			; AH*BM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM		(u*u)		&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R20			; BH*AXL	(s*u)&lt;br /&gt;
		sbc		R6,R9&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R22			; BH*AM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x32_64.inc&lt;br /&gt;
;*		Mutiply 	32x32 -&amp;gt; 64 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102697</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102697"/>
		<updated>2020-12-06T15:22:52Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* mul_32x32_64 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	mul32x32_64.inc&lt;br /&gt;
;*  Mutiply 	32x32 -&amp;gt; 64 bit 		(unsigned * unsigned)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  	R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  98 cycles + 4 (RET) = 102 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
mul_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  11 cycles + 4 (RET) = 15 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		sub		R4,R4&lt;br /&gt;
		mulsu	R16,R20			; BL*AL	(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		muls	R21,R16			; AH*BL	(s*s)		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  13 cycles + 4 (RET) = 17 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6 R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  38 cycles + 4 (RET) = 42 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls24x24_48.inc&lt;br /&gt;
;*		Mutiply 	24x24 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x8_40.inc&lt;br /&gt;
;*		Mutiply 	32x8 -&amp;gt; 40 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  34 cycles + 4 (RET) = 38 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R4&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
&lt;br /&gt;
		muls	R23,R16			; AH x BL			(s*s)&lt;br /&gt;
		mov		R5,R0&lt;br /&gt;
		mov		R6,R1&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL			(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		sbc		R5,R10&lt;br /&gt;
		sbc		R6,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		adc		R4,R10&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R21			; BL x AL			(s*u)&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R22			; BL x AM			(s*u)&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x16_48.inc&lt;br /&gt;
;*		Mutiply 	32x16 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  82 cycles + 4 (RET) = 86 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		sub		R6,R6			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL*BL	(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM*BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		muls	R23,R18			; AH*BH		(s*s)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL*BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R16			; AH*BL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL*BM	(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R18,R21			; BH*AL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL*BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R17			; AH*BM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM		(u*u)		&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R20			; BH*AXL	(s*u)&lt;br /&gt;
		sbc		R6,R9&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R22			; BH*AM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x32_64.inc&lt;br /&gt;
;*		Mutiply 	32x32 -&amp;gt; 64 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102695</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102695"/>
		<updated>2020-12-06T00:13:04Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* muls_32x32_64 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  11 cycles + 4 (RET) = 15 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		sub		R4,R4&lt;br /&gt;
		mulsu	R16,R20			; BL*AL	(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		muls	R21,R16			; AH*BL	(s*s)		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  13 cycles + 4 (RET) = 17 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6 R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  38 cycles + 4 (RET) = 42 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls24x24_48.inc&lt;br /&gt;
;*		Mutiply 	24x24 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x8_40.inc&lt;br /&gt;
;*		Mutiply 	32x8 -&amp;gt; 40 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  34 cycles + 4 (RET) = 38 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R4&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
&lt;br /&gt;
		muls	R23,R16			; AH x BL			(s*s)&lt;br /&gt;
		mov		R5,R0&lt;br /&gt;
		mov		R6,R1&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL			(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		sbc		R5,R10&lt;br /&gt;
		sbc		R6,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		adc		R4,R10&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R21			; BL x AL			(s*u)&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R22			; BL x AM			(s*u)&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x16_48.inc&lt;br /&gt;
;*		Mutiply 	32x16 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  82 cycles + 4 (RET) = 86 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		sub		R6,R6			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL*BL	(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM*BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		muls	R23,R18			; AH*BH		(s*s)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL*BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R16			; AH*BL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL*BM	(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R18,R21			; BH*AL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL*BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R17			; AH*BM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM		(u*u)		&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R20			; BH*AXL	(s*u)&lt;br /&gt;
		sbc		R6,R9&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R22			; BH*AM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x32_64.inc&lt;br /&gt;
;*		Mutiply 	32x32 -&amp;gt; 64 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102694</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102694"/>
		<updated>2020-12-06T00:12:00Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* muls_32x16_48 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  11 cycles + 4 (RET) = 15 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		sub		R4,R4&lt;br /&gt;
		mulsu	R16,R20			; BL*AL	(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		muls	R21,R16			; AH*BL	(s*s)		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  13 cycles + 4 (RET) = 17 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6 R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  38 cycles + 4 (RET) = 42 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls24x24_48.inc&lt;br /&gt;
;*		Mutiply 	24x24 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x8_40.inc&lt;br /&gt;
;*		Mutiply 	32x8 -&amp;gt; 40 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  34 cycles + 4 (RET) = 38 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R4&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
&lt;br /&gt;
		muls	R23,R16			; AH x BL			(s*s)&lt;br /&gt;
		mov		R5,R0&lt;br /&gt;
		mov		R6,R1&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL			(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		sbc		R5,R10&lt;br /&gt;
		sbc		R6,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		adc		R4,R10&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R21			; BL x AL			(s*u)&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R22			; BL x AM			(s*u)&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x16_48.inc&lt;br /&gt;
;*		Mutiply 	32x16 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  82 cycles + 4 (RET) = 86 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		sub		R6,R6			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL*BL	(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM*BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		muls	R23,R18			; AH*BH		(s*s)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL*BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R16			; AH*BL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL*BM	(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R18,R21			; BH*AL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL*BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R17			; AH*BM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM		(u*u)		&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R20			; BH*AXL	(s*u)&lt;br /&gt;
		sbc		R6,R9&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R22			; BH*AM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102693</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102693"/>
		<updated>2020-12-06T00:11:09Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* muls_32x8_40 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  11 cycles + 4 (RET) = 15 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		sub		R4,R4&lt;br /&gt;
		mulsu	R16,R20			; BL*AL	(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		muls	R21,R16			; AH*BL	(s*s)		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  13 cycles + 4 (RET) = 17 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6 R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  38 cycles + 4 (RET) = 42 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls24x24_48.inc&lt;br /&gt;
;*		Mutiply 	24x24 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x8_40.inc&lt;br /&gt;
;*		Mutiply 	32x8 -&amp;gt; 40 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  34 cycles + 4 (RET) = 38 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R4&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
&lt;br /&gt;
		muls	R23,R16			; AH x BL			(s*s)&lt;br /&gt;
		mov		R5,R0&lt;br /&gt;
		mov		R6,R1&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL			(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		sbc		R5,R10&lt;br /&gt;
		sbc		R6,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		adc		R4,R10&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R21			; BL x AL			(s*u)&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		adc		R5,R10&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R16,R22			; BL x AM			(s*u)&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R10&lt;br /&gt;
		&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  82 cycles + 4 (RET) = 86 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		sub		R6,R6			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL*BL	(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM*BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		muls	R23,R18			; AH*BH		(s*s)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL*BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R16			; AH*BL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL*BM	(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R18,R21			; BH*AL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL*BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R17			; AH*BM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM		(u*u)		&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R20			; BH*AXL	(s*u)&lt;br /&gt;
		sbc		R6,R9&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R22			; BH*AM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102692</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102692"/>
		<updated>2020-12-06T00:10:01Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* muls_24x24_48 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  11 cycles + 4 (RET) = 15 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		sub		R4,R4&lt;br /&gt;
		mulsu	R16,R20			; BL*AL	(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		muls	R21,R16			; AH*BL	(s*s)		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  13 cycles + 4 (RET) = 17 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6 R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  38 cycles + 4 (RET) = 42 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls24x24_48.inc&lt;br /&gt;
;*		Mutiply 	24x24 -&amp;gt; 48 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  82 cycles + 4 (RET) = 86 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		sub		R6,R6			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL*BL	(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM*BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		muls	R23,R18			; AH*BH		(s*s)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL*BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R16			; AH*BL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL*BM	(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R18,R21			; BH*AL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL*BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R17			; AH*BM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM		(u*u)		&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R20			; BH*AXL	(s*u)&lt;br /&gt;
		sbc		R6,R9&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R22			; BH*AM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102691</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102691"/>
		<updated>2020-12-06T00:08:55Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* muls_24x16_40 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  11 cycles + 4 (RET) = 15 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		sub		R4,R4&lt;br /&gt;
		mulsu	R16,R20			; BL*AL	(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		muls	R21,R16			; AH*BL	(s*s)		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  13 cycles + 4 (RET) = 17 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x16_40.inc&lt;br /&gt;
;*  Mutiply 	24x16 -&amp;gt; 40 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6 R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  38 cycles + 4 (RET) = 42 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION		muls_24x24_48.inc&lt;br /&gt;
;*		Mutiply 24x16 -&amp;gt; 64 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  82 cycles + 4 (RET) = 86 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		sub		R6,R6			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL*BL	(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM*BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		muls	R23,R18			; AH*BH		(s*s)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL*BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R16			; AH*BL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL*BM	(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R18,R21			; BH*AL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL*BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R17			; AH*BM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM		(u*u)		&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R20			; BH*AXL	(s*u)&lt;br /&gt;
		sbc		R6,R9&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R22			; BH*AM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102690</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102690"/>
		<updated>2020-12-06T00:08:16Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* muls_24x8_32 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  11 cycles + 4 (RET) = 15 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		sub		R4,R4&lt;br /&gt;
		mulsu	R16,R20			; BL*AL	(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		muls	R21,R16			; AH*BL	(s*s)		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  13 cycles + 4 (RET) = 17 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls24x8_32.inc&lt;br /&gt;
;*  Mutiply 	24x8 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL    BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_24x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION		muls_24x24_48.inc&lt;br /&gt;
;*		Mutiply 24x16 -&amp;gt; 64 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  82 cycles + 4 (RET) = 86 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		sub		R6,R6			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL*BL	(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM*BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		muls	R23,R18			; AH*BH		(s*s)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL*BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R16			; AH*BL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL*BM	(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R18,R21			; BH*AL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL*BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R17			; AH*BM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM		(u*u)		&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R20			; BH*AXL	(s*u)&lt;br /&gt;
		sbc		R6,R9&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R22			; BH*AM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102689</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102689"/>
		<updated>2020-12-06T00:07:16Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* muls_16x16_32 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  11 cycles + 4 (RET) = 15 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		sub		R4,R4&lt;br /&gt;
		mulsu	R16,R20			; BL*AL	(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		muls	R21,R16			; AH*BL	(s*s)		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x16_32.inc&lt;br /&gt;
;*  Mutiply 	16x16 -&amp;gt; 32 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BH  BL     E3 E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R17:R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  13 cycles + 4 (RET) = 17 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R10&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R10&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION		muls_24x24_48.inc&lt;br /&gt;
;*		Mutiply 24x16 -&amp;gt; 64 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  82 cycles + 4 (RET) = 86 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		sub		R6,R6			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL*BL	(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM*BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		muls	R23,R18			; AH*BH		(s*s)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL*BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R16			; AH*BL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL*BM	(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R18,R21			; BH*AL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL*BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R17			; AH*BM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM		(u*u)		&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R20			; BH*AXL	(s*u)&lt;br /&gt;
		sbc		R6,R9&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R22			; BH*AM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102688</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102688"/>
		<updated>2020-12-06T00:04:36Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* muls_32x24_56 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  11 cycles + 4 (RET) = 15 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		sub		R4,R4&lt;br /&gt;
		mulsu	R16,R20			; BL*AL	(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		muls	R21,R16			; AH*BL	(s*s)		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION		muls_24x24_48.inc&lt;br /&gt;
;*		Mutiply 24x16 -&amp;gt; 64 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION	muls32x24_56.inc&lt;br /&gt;
;*		Mutiply 	32x24 -&amp;gt; 56 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL  AXL   BH  BM  BL     E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R18:R17:R16 -&amp;gt; R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  82 cycles + 4 (RET) = 86 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_32x24:&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		sub		R9,R9&lt;br /&gt;
		sub		R6,R6			; NULL&lt;br /&gt;
		&lt;br /&gt;
		mul		R20,R16			; AXL*BL	(u*u)&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mul		R22,R16			; AM*BL		(u*u)&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		muls	R23,R18			; AH*BH		(s*s)&lt;br /&gt;
		mov		R7,R0&lt;br /&gt;
		mov		R8,R1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R16			; AL*BL		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R16			; AH*BL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R20,R17			; AXL*BM	(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R18,R21			; BH*AL		(s*u)&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R3,R10&lt;br /&gt;
		adc		R4,R11&lt;br /&gt;
		adc		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mul		R21,R17			; AL*BM		(u*u)&lt;br /&gt;
		movw	R11:R10,R1:R0		&lt;br /&gt;
		mulsu	R23,R17			; AH*BM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R10&lt;br /&gt;
		adc		R5,R11&lt;br /&gt;
		adc		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mul		R22,R17			; AM*BM		(u*u)		&lt;br /&gt;
		add		R5,R0&lt;br /&gt;
		adc		R6,R1&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R20			; BH*AXL	(s*u)&lt;br /&gt;
		sbc		R6,R9&lt;br /&gt;
		sbc		R7,R9&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R4,R0&lt;br /&gt;
		adc		R5,R1&lt;br /&gt;
		adc		R6,R9&lt;br /&gt;
		adc		R7,R9&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R22			; BH*AM		(s*u)&lt;br /&gt;
		sbc		R8,R9&lt;br /&gt;
		add		R6,R0&lt;br /&gt;
		adc		R7,R1&lt;br /&gt;
		adc		R8,R9&lt;br /&gt;
&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102687</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102687"/>
		<updated>2020-12-06T00:02:26Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* muls_16x8_24 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*  FUNCTION	muls16x8_24.inc&lt;br /&gt;
;*  Mutiply 	16x8 -&amp;gt; 24 bit 		(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;* 		AH  AL    BL     E2 E1 E0&lt;br /&gt;
;*  	R21:R20 x R16 -&amp;gt; R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	-&lt;br /&gt;
;*  11 cycles + 4 (RET) = 15 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
muls_16x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		sub		R10,R10			; NULL&lt;br /&gt;
		sub		R4,R4&lt;br /&gt;
		mulsu	R16,R20			; BL*AL	(s*u)&lt;br /&gt;
		sbc		R4,R10&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		muls	R21,R16			; AH*BL	(s*s)		&lt;br /&gt;
		add		R3,R0&lt;br /&gt;
		adc		R4,R1&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION		muls_24x24_48.inc&lt;br /&gt;
;*		Mutiply 24x16 -&amp;gt; 64 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102686</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102686"/>
		<updated>2020-12-05T23:35:48Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* muls_24x24_48 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;*		FUNCTION		muls_24x24_48.inc&lt;br /&gt;
;*		Mutiply 24x16 -&amp;gt; 64 bit			(signed * signed)&lt;br /&gt;
;*&lt;br /&gt;
;*      AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  59 cycles + 4 (RET) = 63 Cycles&lt;br /&gt;
;*&lt;br /&gt;
;***********************************************************************************&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AM x BM&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Softwarepool&amp;diff=102650</id>
		<title>AVR Softwarepool</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Softwarepool&amp;diff=102650"/>
		<updated>2020-12-01T18:15:31Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* LCD und VFD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die interessantesten Softwareprojekte aus der Codesammlung...&lt;br /&gt;
&lt;br /&gt;
(A)   ... Projekt ist in &#039;&#039;&#039;Assembler&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(C)   ... Projekt ist in &#039;&#039;&#039;C&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(C++) ... Projekt ist in &#039;&#039;&#039;C++&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(B)   ... Projekt ist in &#039;&#039;&#039;Bascom&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(PC)  ... Projekt ist nicht für einen µC, sondern für den PC&lt;br /&gt;
&lt;br /&gt;
==1-Wire==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/14792  DS1820, DS18B20 in C]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6505 Mehrere DS1820/DS18B20 auslesen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31408#536372 Mehrere DS1820/DS18B20/DS18S20/DS1822 über einen Webserver auslesbar]&lt;br /&gt;
* (C) [https://www.mikrocontroller.net/topic/387139#4890827 Bibliothek für OneWire und DS18x20]&lt;br /&gt;
&lt;br /&gt;
==Akkulader==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/72627#594587 Bleiakku-Lader 12/24V]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
&lt;br /&gt;
==Betriebssysteme und Scheduler==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/190388#1856376 Nano OS] von Tobias W. ([http://sourceforge.net/projects/nanoos/ Sourceforge])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12176#79672 Wartezeiten effektiv (Scheduler)] von Peter Dannegger&lt;br /&gt;
* (C++) [http://www.mikrocontroller.net/topic/96977#837989 Einfacher Scheduler und Timer in C++ für ATMega] von S. Seegel&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/74026#609246 GOS: einfacher preemptive multitasking scheduler] von Günter Greschenz&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/articles/Monitorprogramm_Bamo128 Bamo128] Monitorprogramm und Bootloader&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/319580#new AvRtos] preemtiver real time multitasking scheduler von Harald B. ([http://sourceforge.net/projects/avrtos/ Sourceforge])&lt;br /&gt;
* (C) [https://bitbucket.org/dferreyra/avr-threads/wiki/Home avr-threads] Thread-Library für AVR&lt;br /&gt;
&lt;br /&gt;
==Bootloader==&lt;br /&gt;
* (A,C,PC) [http://www.mikrocontroller.net/topic/12181#79866 AVR Bootloader]&lt;br /&gt;
* (A, PC) [http://www.mikrocontroller.net/topic/146638#1364260 AVR Bootloader für GCC-Toolchain]&lt;br /&gt;
* (A,PC) [http://www.mikrocontroller.net/topic/95839 AVR Bootloader mit Verschlüsselung]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/72308#591159 ATtiny45 Bootloader]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/67047#538510 MMC/SD Bootloader für ATMega16]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/56818#439359 SD/MMC Card Bootloader (passt in 2kb bootsection)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/61170#480765 boofa - Bootloader für AVR über UART (AVR109)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/53130#413058 Bootloader ATmega168]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/73196#600293 UART Bootloader ATtiny13 - ATmega644]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/150816#1414460 UART Bootloader AtMega644P @ 20MHz] (Eclipse Projekt)&lt;br /&gt;
* (C) [[AVR Bootloader in C - eine einfache Anleitung]]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/200645#1971295 LAN-Bootloader für ATmega1284p]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/articles/Monitorprogramm_Bamo128 Bamo128] Monitorprogramm und Bootloader&lt;br /&gt;
Siehe auch: [[Bootloader]]&lt;br /&gt;
&lt;br /&gt;
==DCC==&lt;br /&gt;
&lt;br /&gt;
(Digital Command Control, Standard zur digitalen Steuerung von Modelleisenbahnen)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31397#241300 DCC Decoder]&lt;br /&gt;
&lt;br /&gt;
==DCF77==&lt;br /&gt;
&lt;br /&gt;
(Zeitsignaldienst für funkgesteuerte Uhren auf der Langwellen-Frequenz 77,5 kHz)&lt;br /&gt;
 &lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/38914#287867 DCF77 AVR-Assemblerbaustein ]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6500#41738 DCF77-Uhr mit ATTINY12]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31385#241104 DCF Digital Empfangsmodul - Korrelation - (Assembler)ATmega8 ]&lt;br /&gt;
* (C) [http://pic-projekte.de/wordpress/?p=572 DCF77 PIC-Projekte.de]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25071#186286 DCF 77 ]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/14788#101528 DCF-Uhr mit DotMatrix-Anzeige für avr-gcc]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12154#79501 PC DCF Timer ( PC Zeitschaltuhr)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25116#187197 DCF 77 Uhr mit CodeVision ]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/58769#456232 DCF77 Uhr in C mit ATtiny26]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48597#372164 DCF77 Uhr, zum X.ten Mal, jetzt mit SAF]&lt;br /&gt;
* (C,A) [http://www.mikrocontroller.net/topic/31408#536372 DCF77 mit beliebig gepoltem Eingangssignal innerhalb eines Webservers]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/121049 DCF-Uhr, Sonnenstand, TWI-Port, Alarmfunktion für Atmega8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/151260#1419218 DCF77 Uhr 7 Segment LED ATmega8 Assembler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/168807#1614129 DCF-Uhr mit LCD in C]&lt;br /&gt;
&lt;br /&gt;
== DRAM ==&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/25053#186085 2MB DRAM an AVR] und Anwendung als [http://www.mikrocontroller.net/topic/25053#186089 Audiorekorder]&lt;br /&gt;
* (A,C) [https://www.mikrocontroller.net/topic/236862 Grafikfähiger LCD Controller für 320x240 LCD mit D-RAM]&lt;br /&gt;
&lt;br /&gt;
==Drehgeber==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/6526#41978 Drehgeber auslesen]&lt;br /&gt;
* (C+A) [http://www.mikrocontroller.net/topic/302229#new 4-fach Auswertung für Dreh-/Inkrementalgeber, schnell]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/328348#new Schrittmotor als Drehgeber mit Drehdynamik]&lt;br /&gt;
* (A) [https://www.mikrocontroller.net/topic/478343?goto=5925396#5922395]&lt;br /&gt;
&lt;br /&gt;
==DTMF==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/92444#792954 DTMF dekodieren]&lt;br /&gt;
&lt;br /&gt;
==DMX==&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/92350#new 20 Kanal Relaissteuerung per DMX]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/276885#new DMX512 zu RGB Led Controller use HSV Farbraum]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/290366#3096821 20 Kanal PWM per DMX]&lt;br /&gt;
&lt;br /&gt;
==Ethernet==&lt;br /&gt;
Siehe auch [[AVR Softwarepool#Netzwerk|Netzwerk]]&lt;br /&gt;
&lt;br /&gt;
==Entwicklungssysteme==&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/74198#611404 AVR Code Wizard]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/30110#230503 Multitasking kernel für ATtinys in ASM]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/65156#521012 BASIC-Computer mit ATmega32]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/64129#511368 AVR TinyBASIC Anpassung für ATmega8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/59189#460273 Mini-Computer mit BASIC]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/55807 Forth System für ATmegas in Assembler]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/94193 Forth-Computer mit ATmega32 und Videoausgabe] von Christian Berger&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/62500#493931 Fixpoint-Arithmetik in &amp;quot;C&amp;quot;]&lt;br /&gt;
* (C++) [http://www.mikrocontroller.net/topic/143537 Fixpoint-Arithmetik in &amp;quot;C++&amp;quot;]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/85256#717037 64 Bit float Emulator in C, IEEE754 kompatibel]&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/92979#797957 AVR ATmega8TestBoard]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/94468#812992 Gleitkomma-Bibliothek für AVR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/177481?page=1 AVR CP/M System]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/187390 EMACS Konfiguration]&lt;br /&gt;
* (C) [https://www.mikrocontroller.net/topic/467307 Watchdog-ISR für ATmega328]&lt;br /&gt;
&lt;br /&gt;
==FFT==&lt;br /&gt;
&lt;br /&gt;
(Fast Fourier Transformation, &amp;quot;schnelle&amp;quot; Fouriertransformation)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25095#186536 FFT auf dem AVR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25062#186225 128point FFT in ASM]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/27001#203911 Schnelle FFT in Assembler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131525#1191497 AVR-Lichtorgel per FFT MEGA8 32 644 ]&lt;br /&gt;
&lt;br /&gt;
==Funksteckdosen==&lt;br /&gt;
* (C,A) [http://www.mikrocontroller.net/topic/31408#536372 Ansteuerung von Funksteckdosen mit einem Webserver]&lt;br /&gt;
&lt;br /&gt;
==GPS==&lt;br /&gt;
&lt;br /&gt;
(Global Positioning System, satellitengestütztes System zur weltweiten Positions- und Zeitbestimmung)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/48544#371717 GPS - MOUSE - MINI- NAVIGATOR (Assembler) ATmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/72507#593252 GPS an mega8,88 oder 168]&lt;br /&gt;
&lt;br /&gt;
==IR==&lt;br /&gt;
* siehe auch [[AVR Softwarepool#RC5|RC5]]&lt;br /&gt;
* (C) [[IRMP]] - Infrared Multi Protocol Decoder:&lt;br /&gt;
**[[IRMP| Wiki Seite]]&lt;br /&gt;
**[http://www.mikrocontroller.net/topic/162119#1545798 Thread im Forum]&lt;br /&gt;
&lt;br /&gt;
==Kryptographie==&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/73468 Verschiedene kryptographische Funktionen] &lt;br /&gt;
&lt;br /&gt;
==LANC==&lt;br /&gt;
&lt;br /&gt;
(Steuerprotokoll für Video- und Digitalfotokameras, auch als Control-L bekannt)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/40463#302754 Sony LANC Auswertung mit AVR] (Atmega 128 @ 16 MHz)&lt;br /&gt;
&lt;br /&gt;
==LEDs und LED-Anzeigen==&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/76839#638278 Solarlicht Steuerung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/77863#648213 Taster + LED am selben Draht (4*)]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/73776#606472 LED-Touch-Panel] (ARM)&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/74013#609097 RGB-Moodlight auf ATTiny2313 mit RC5-Fernbedienung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/54561#421940 HSV RGB Led Dimmer, C Code &amp;amp; Video &amp;amp; Doku]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/67567#543492 Mini RGB Lichteffektgenerator mit Menü für Pic16F84]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48464#370871 Ansteuerung einer RGB LED (PWM)]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/87149#737282 3x7 Segment und 1 I/O-Pin (Assembler)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31370#240843 ADC mit Multiplexanzeige] (vier 7-Segmentanzeigen)&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31388#241192 AVR-Lauflicht]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/94746#815809 HSB-&amp;gt;RGB Umrechnung rein in Assembler, auch für ATiny]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/110168 2x7-Segment an nur 3 Leitungen]&lt;br /&gt;
* (A) [[Ambilight in Hardware]]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/145156#1346531 µCke Microcontroller Mücke (Atmel Tiny13)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131525#1191497 AVR-Lichtorgel per FFT MEGA8 32 644 ]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/182305 TLC5940 16-Kanal 12bit LED Treiber ansteuern und HighPower LEDs über MosFETs treiben]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/185730 7Segment Coder]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/244768 RGB-Moodlight, ATMega8, Soft-PWM mit Gammakorrektur, IR-Fernbedienung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/275426 serielles 4x7 Segment Display NSM4202]&lt;br /&gt;
* (C) [https://www.mikrocontroller.net/topic/415651#new SSD1306/1309 Library zum Darstellen von Text/Grafik auf OLED Displays]&lt;br /&gt;
* (A) [https://www.mikrocontroller.net/topic/506738#new SSD1306 text library für oled displays]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==LCD und VFD==&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
* (C) [http://bluematrixi.bl.funpic.de/index.php/elektronik-avr/lcd-display-nokia3310 Bibliothek für Nokia 3310 Lcd Ansteuerung in &amp;quot;C&amp;quot; - sehr gut]&lt;br /&gt;
*(C,A)[http://www.mikrocontroller.net/articles/Ansteuerung_Handy_Displays Ansteuerung_Handy_Displays]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/53137#413137 Programm zum Erstellen eigener Schriftarten (LCD)]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/54860#423255 LCD Schriftarten ( Fonts in veschiedenen Größen )]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31403  The Siemens S65 132x176, 65536 color display with AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48501#371218 LCD Ansteuerung im 4bit-Modus]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48456#370782 LCD Library T6963c]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/76399#633680 &amp;quot;Bessere&amp;quot; T6963c Library]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25099#186569 LCD Controller für 640x480 LCD mit mega8515]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/38923#287939 LCD Controller KS0073 Support im 4-Bit Mode]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/79609#664268 KS0066U oder Ähnliche --- LCD Treiber]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/81793#683135 Pollin E0855-2 SED1530-Treiber]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/90449#772843 LCD über nur einen IO-Pin ansteuern]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/120475 VFD Library (Vacuum Fluorescent Display Library)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98321#851423 Grafikfähiger LCD Controller für 320x240 LCD mit 4 Graustufen] (jetzt auch mit 8 Graustufen)&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/140369 Menüsystem für beliebige schwarz-weiß LCDs bis 4096x4096 Pixeln und grafischem Editor]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/194149 Schnelle SED1520 Funktionsbibliothek mit Bildkonverter und Fontgenerator]&lt;br /&gt;
* (PC,C) [http://www.mikrocontroller.net/topic/234304 DOGXL Fontgenerator (SW+Graustufen)]&lt;br /&gt;
* (C,A) [http://www.mikrocontroller.net/topic/236862#2401250 Grafikfähiger LCD Controller für 320x240 LCD mit D-RAM]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/190078 LCD SHARP M078CKA mit LH155]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/287978 EA DOGM162 Textdisplay an SPI]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/305266 HD44780 Display 2x16 Xmega-Assemblerbaustein]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/320791#3524261 Nokia N95 Display 320x240 Arduino Lib.]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/318818#3456758 Library für ST7735 Display Controller mit GLCD Font Unterstützung]&lt;br /&gt;
* (C) [https://www.mikrocontroller.net/topic/415651#new SSD1306/1309 Library zum Darstellen von Text/Grafik auf OLED Displays]&lt;br /&gt;
* (A) [https://www.mikrocontroller.net/topic/506738#new SSD1306 text library für oled displays]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98923#857451 Ultraschall Entfernungsmesser mit I2C, Eigenbau]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/83871#new  I2C-Master realisiert in Software, ohne TWI für alle ATMEGAs]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/38919#new  RS232 &amp;lt;-&amp;gt; TWI / I2C Interface für ATMega8 (ASM) inkl. Windows Software]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/67698#544930 USI TWI Master]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/235733#2388116 Hardware TWI-MASTER Interrupt basierend für Mega AVR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/272621#new I2C/TWI Master-Interrupt Xmega-Assemblerbaustein]&lt;br /&gt;
* (C) [https://www.mikrocontroller.net/topic/378553 hot-plug fähige Library für DS1621 Temperatursensoren ]&lt;br /&gt;
* (A) [https://www.mikrocontroller.net/topic/506739#new TWI im polling für AVR 0-Series und AVR 1-Series]&lt;br /&gt;
&lt;br /&gt;
==Messgeräte==&lt;br /&gt;
===Drehzahlmesser===&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/1518#8469 Drehzahlmesser 4 mal 7-Segment mit 90S2313]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/Drehzahlmesser Drehzahlmesser mit 4 mal 7-Segment anzeigen mit Tiny2313, Wiki-Artikel]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/231283 einfache Drehzahlmessung mit ATmega88]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/232485 4-Kanal Drehzahlmessung mit ATmega88]&lt;br /&gt;
&lt;br /&gt;
===Klopfsensormessgerät===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/Klopfsensormessgeraet Messgerät für Klopfgeräusche an Verbrennungsmotoren auf Basis des TPIC8101]&lt;br /&gt;
&lt;br /&gt;
===Entfernungsmesser===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98923#857451 Ultraschall Entfernungsmesser mit I2C, Eigenbau]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/130834 3D Umgebungserfassung mit einem auf zwei Servors montiertem Sharp Distanzsensor, Eigenbau]&lt;br /&gt;
&lt;br /&gt;
===Frequenzmesser===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/62610#495030 Frequenzmesser bis 2Mhz -- mit AVR ATmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48582#372072 Frequenzmessung (Seite mit Quellcode nicht erreichbar)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/62517#494146 Input Capture Pin (ICP) auslesen ( Frequenz messen)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25144#187587 Frequenzmessung und Impulszählung über den Parallelport-IR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31394#241251 einfacher 5 MHz Frequenzzähler (Assembler) ATmega8]&lt;br /&gt;
* (A+C) [http://www.mikrocontroller.net/topic/69021#558098 Multimeter]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/173665#new sehr genauer Frequenzmesser Atmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/186801#new  Reziproker Frequenzzähler+ Optimierte 64bit uint Routinen]&lt;br /&gt;
* (C+A) [http://www.mikrocontroller.net/topic/200279#new 6 Stellen von 1Hz bis 40MHz ATmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/241150#2458079 Reziproker Frequenzzähler, GPS-stabilisiert, ATmega162]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/359552#new Reziproker Frequenzzähler mit BASCOM-AVR]&lt;br /&gt;
&lt;br /&gt;
===Frequenzgenerator===&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/152966#1438488 Einstellbarer Frequenzgenerator für 0.12 Hz - 8 MHz mit Atmega 8 und Bascom ]&lt;br /&gt;
&lt;br /&gt;
===Kompass===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/100239#870281 KOMPASS KMZ10A KMZ10B ATmega8 Assembler]&lt;br /&gt;
&lt;br /&gt;
===Messgeräte für elektronische Bauteile===&lt;br /&gt;
* (A+C) [http://www.mikrocontroller.net/topic/69021#558098 Multimeter]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/60797#477026 LC-METER / LC-Messgerät ATmega8 Assembler]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/60591#474873 Widerstandstester]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/56770#438957 Ladungsmessgerät]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31386#241139 Transistortester]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131804#1194273 Transistortester]&lt;br /&gt;
&lt;br /&gt;
===Spannungsmesser===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31370#240843 ADC mit Multiplexanzeige] - Voltmeter&lt;br /&gt;
* (A+C) [http://www.mikrocontroller.net/topic/69021#558098 Multimeter]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31389 Wirkleistungsmessgerät] - &amp;quot;Ein einfaches Wirkleistungsmessgerät für 230V Verbraucher ohne Netztrennung mit 3 stelliger 7-Segment Anzeige für Verbraucher bis 500W.&amp;quot; (+ ähnlicher Aufbau mit Silabs Controller)&lt;br /&gt;
&lt;br /&gt;
===Thermometer===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6516#41903 Zeit + Temperatur auf LCD mit AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/53127#413006 Thermometer mit LED &amp;amp; LM35]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31408#536372 Viele DS18x20-Thermometer in einem Webserver]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/354441#3953900 Auswertung Temperatursensor KTY81 (PT1000), Arduino Uno, 1-6 Kanäle]&lt;br /&gt;
&lt;br /&gt;
===Oszilloskop===&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/53129#413011 Einfaches Oszilloskop - Bascom]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/48586#372093 Oszi- &amp;amp; Logikanalyser mit LCD]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31376#240880 einfaches DIGITAL- Oszilloskop (800 Datenpunkte) Assembler]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/56616#437772 Einfaches &amp;quot;Oszilloskop&amp;quot;]&lt;br /&gt;
* (C) [http://www.christoph-lauer.de/Homepage/Blog/Eintrage/2010/8/1_Embedded_C_based_Spectrumanalyzer.html ATXMega based Oscilloscope and Spectrumanalyzer]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/228997#2308320 Selbstbau Digital Storage Oszilloskop]&lt;br /&gt;
&lt;br /&gt;
===Beschleunigungssensor===&lt;br /&gt;
* (c++) [http://www.mikrocontroller.net/topic/268214 Einfache BMA020 Library, mit I2C]&lt;br /&gt;
&lt;br /&gt;
==MIDI==&lt;br /&gt;
&lt;br /&gt;
(Musical Instrument Digital Interface, Datenübertragungsstandard für Musikinstrumente)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48542#371695 Mr.MidiPlayer - Spielt alle MIDI-Dateien von einer SD-Karte] (siehe auch: [[Midi_Rekorder_mit_MMC/SD-Karte]])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25035#185861 MIDI-Rekorder mit SD/MMC und AVR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/106512# Drum-Trigger mit MIDI-Ausgabe]&lt;br /&gt;
&lt;br /&gt;
==MMC==&lt;br /&gt;
&lt;br /&gt;
(Multimedia Card, digitales Flash-Speichermedium)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25056#186117 SourceCode MMC die Zweite]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48481#370950 MMC/SD-Karte mit FAT16 an AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/67047#538510 MMC/SD Bootloader füt ATMega16]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/14800#102024 MMC/SD ansteuern mit AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25035#185861 MIDI-Rekorder mit SD/MMC und AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/FAT32 MMC/SD - FAT16/32 Bibliothek für AVR  mit Wiki]&lt;br /&gt;
&lt;br /&gt;
==Netzgeräte==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/60786#476904 Labornetzgerät]&lt;br /&gt;
* [[RADLAB-PS1]] [http://www.mikrocontroller.net/topic/124858#1138781 Netzteil um LM317 mit Strombegrenzung und Anzeige!]&lt;br /&gt;
&lt;br /&gt;
==Netzwerk==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/87517#new Kleiner ENC28J60 µWebserver von SimonK]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/82127#new Ulrich Radigs ENC28J60 mit leicht lötbaren/beschaffbaren Bauteilen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131825 Dirk Broßwick Webserver auf ENC28j60 Basis mit einem ATmega2561, es gibt auch einen Port auf das AVR-NET IO]&lt;br /&gt;
&lt;br /&gt;
==Parser==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/64763#517245 Zwei Parser für numerische Ausdrücke]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/76842#638283 uShell - ein universeller Parser für uCs]&lt;br /&gt;
&lt;br /&gt;
==RFID==&lt;br /&gt;
&lt;br /&gt;
(Radio Frequency Identification, Verfahren zur funkbasierten Identifizierung und Lokalisierung von Gegenständen)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/68442#552128 USB RFID Tag Leser]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/228709 Soft-RFID ohne RFID-IC]&lt;br /&gt;
&lt;br /&gt;
==RC - Fernsteuerungen/Servos==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48529#371582 RC Summen Signal erzeugen ]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/192453 RC Summen Signal dekodieren ]&lt;br /&gt;
&lt;br /&gt;
==RC5==&lt;br /&gt;
&lt;br /&gt;
(verbreitetes Datenübertragungsprotokoll für Infrarot-Fernbedienungen)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/14789#101536 RC5 Sender auf einem Attiny11L]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/74013#609097 RGB-Moodlight auf ATTiny2313 mit RC5-Fernbedienung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12216#80856 Fernbedien RC5 Empfänger]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/59235#460765 RC5 Sender selber bauen ???]&lt;br /&gt;
&lt;br /&gt;
==Ringpuffer==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/66789#536189 Ringpuffer AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/101472#882716 AVR-GCC: UART mit FIFO]&lt;br /&gt;
&lt;br /&gt;
==SD==&lt;br /&gt;
&lt;br /&gt;
(Secure Digital Memory Card; digitales Flash-Speichermedium)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48542#371695 Mr.MidiPlayer - Spielt alle MIDI-Dateien von einer SD-Karte] (siehe auch: [[Midi_Rekorder_mit_MMC/SD-Karte]])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25035#185861 MIDI-Rekorder mit SD/MMC und AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/68257#550336 Datenrekorder auf SD-Karte mit mega88]&lt;br /&gt;
&lt;br /&gt;
==Sonstiges==&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/111783#994358 Sonnenstandberechnung mit Atmega 8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/UAC_Mikrocontroller_ASCII_Console uAC Mikrocontroller ASCII Console]&lt;br /&gt;
&lt;br /&gt;
==Spaßprojekte==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/119876#1083044 Miniprojekt: Lagerfeuer-LED (ATtiny25)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/120289#1087905 Klingel mit 100 Melodien - last minute Weihnachtsgeschenk]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/145156#1346531 µCke Microcontroller Mücke (Atmel Tiny13)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/167528#1601077 Toastbrote zählen]&lt;br /&gt;
&lt;br /&gt;
==Spiele==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48505#371259 Tetris auf dem AtMega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/187253# Atmega8 Schachuhr mit Max7219 ]&lt;br /&gt;
&lt;br /&gt;
==Steuerungen==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/123551 Aquarium Controller]&lt;br /&gt;
* () [http://www.mikrocontroller.net/topic/309045 Lüftersteuerung durch zwei SHT75, mega32, LCD und SD-Karte]&lt;br /&gt;
* () [http://www.mikrocontroller.net/topic/307375 Fensteröffner mit Scheibenwischermotor dht11 sht11]&lt;br /&gt;
&lt;br /&gt;
==Taster / Schalter==&lt;br /&gt;
===mechanisch===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6492#41625 Tasten entprellen - Bulletproof] (siehe auch: [[Entprellung]])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48465#370877 Universelle Tastenabfrage]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/6491#41624 Tasten-Matrix entprellen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/64731#517001 Tastenmatrix auslesen über nur 2 Leitungen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/64743#517105 Tasten Entprellen für N00bs]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/77863#648213 Taster + LED am selben Draht (4*)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/1515#8455 Entprellen von Tastern, autorepeat, vintage]&lt;br /&gt;
&lt;br /&gt;
===kapazitiv===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/38904  Sensor mit nur einer Kontaktfläche]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25045 Einfache Sensortaste]&lt;br /&gt;
&lt;br /&gt;
==Tonerzeugung==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/66945#537624 ATMEGA8 Soundgenerator/Synthesizer]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/120289#1087905 Klingel mit 100 Melodien - last minute Weihnachtsgeschenk]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/134362 RTTTL Melodiegenerator mit ATTINY85]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/232702#new RTTTL Melodiegenerator mit ATMEGA8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25051 Melodie ausgeben mit AVR ATTiny12]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/145156#1346531 µCke Microcontroller Mücke (Atmel Tiny13)]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/137629#1259132 Melodieklingel BASCOM ATmega8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/191596 2Kanal Synthesizer ATtiny 2313, 85, ..]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/232845 17 Kanal Avr Synthesizer]&lt;br /&gt;
* (C) [[AVR-Synthesizer]]&lt;br /&gt;
&lt;br /&gt;
==TWI==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/87597#742070 AVR TWI Master und Slave Funtionen in C]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31404#242081 TWI / I2C einf. MASTER SLAVE Beispiel(Assembler) ATmega8]&lt;br /&gt;
&lt;br /&gt;
==USB==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/75254#622120 USB Host Stack für Eingebettete Systeme (LGPL)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/68442#552128 USB RFID Tag Leser]&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/92979#797957 AVR ATmega8TestBoard]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/90791#776280 Relaiskarte für den USB Port]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/130381#1179352 USB-Stick am Mikrocontroller VNC1L]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/155241 PDIUSBD12 Treiber und micro USB-Device stack]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/192453 HID-Joystick mit V-USB ]&lt;br /&gt;
&lt;br /&gt;
==UART==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/101472#882716 AVR-GCC: UART mit FIFO]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/38928#287985 Software UART]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/125651#1147436 Software UART mit FIFO]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/175946#1690682 uParse] - ein kompakter und vielseitiger Parser (Atmega32) für [[RS232]]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/159753#1517744 Einfacher Interpreter für Komandozeilen/Befehlszeilen] (Atmega32) für [[RS232]]&lt;br /&gt;
* (C) [https://sourceforge.net/projects/yambsiavr/ Modbus Slave Library] für [[RS232]] und [[RS485]]&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/53140#413249 AVR ASCII Video Terminal - 40 x 25 - BAS Signal]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/53139#413225 TV VIDEO BILD BAS Frequenzzähler DVM Atmega8 Assembler]&lt;br /&gt;
* (A) [http://www.electronicspit.com/video/ Videosignal in Farbe aus dem ATMega32] (URL nicht mehr erreichbar)&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25091#new VGA Testbildgenerator]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/101429#882288 ATmega8 erzeugt Video in C!]&lt;br /&gt;
&lt;br /&gt;
==Zeitgeber und Uhren==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/12185#80055 Die genaue Sekunde / RTC]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/74673#616226 LCD-Timer für Belichtungsgerät]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/119859#1082804 DS1307 Assembler-Code]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31374#240878 AVR Library für RTC 12C887 in C]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25136#187534 RTC DS1302 in C]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25087#186454 RTC + Scheduler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/53131#413059 Jumbo-LED Uhr]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/6516#41903 Zeit + Temperatur auf LCD mit AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25069 Sekunden in Zeit/Datum umwandeln (mit Sommerzeit/Schaltjahren)]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/48560#371911 BASCOM Uhr mit Butterfly]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48450#370765 Countdown timer für UV Belichter]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98885 Countdown Timer mit ATtiny2313]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12176#79672 Wartezeiten effektiv (Scheduler)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31408#536372 Schaltuhr mit DCF77-Referenz in einem Webserver, Steuerung von Funksteckdosen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/100892#876549 Eieruhr mit ATtiny24V/ATtiny2313V]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/151236 Zeitauslöser für Casio EX F1 mit Attiny2313]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/151260#1419218 DCF77 Uhr 7 Segment LED ATmega8 Assembler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/177688# NIXIE Uhr mit vielen Funktionen in C mit ATTiny2313]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/233699 Stoppuhr – Geschwindigkeit – Pulsweite mit Atmega88]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/275514 Timer bis 99:59 min - LED Display NSM4202, Drehgeber - At90S2313]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/289724 Uhr/Kalender AVR-Assemblerbaustein]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Codesammlung Übersicht]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR]]&lt;br /&gt;
[[Kategorie:Forum]]&lt;br /&gt;
[[Kategorie:Listen]]&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Softwarepool&amp;diff=102649</id>
		<title>AVR Softwarepool</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Softwarepool&amp;diff=102649"/>
		<updated>2020-12-01T18:14:20Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* LEDs und LED-Anzeigen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die interessantesten Softwareprojekte aus der Codesammlung...&lt;br /&gt;
&lt;br /&gt;
(A)   ... Projekt ist in &#039;&#039;&#039;Assembler&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(C)   ... Projekt ist in &#039;&#039;&#039;C&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(C++) ... Projekt ist in &#039;&#039;&#039;C++&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(B)   ... Projekt ist in &#039;&#039;&#039;Bascom&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(PC)  ... Projekt ist nicht für einen µC, sondern für den PC&lt;br /&gt;
&lt;br /&gt;
==1-Wire==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/14792  DS1820, DS18B20 in C]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6505 Mehrere DS1820/DS18B20 auslesen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31408#536372 Mehrere DS1820/DS18B20/DS18S20/DS1822 über einen Webserver auslesbar]&lt;br /&gt;
* (C) [https://www.mikrocontroller.net/topic/387139#4890827 Bibliothek für OneWire und DS18x20]&lt;br /&gt;
&lt;br /&gt;
==Akkulader==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/72627#594587 Bleiakku-Lader 12/24V]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
&lt;br /&gt;
==Betriebssysteme und Scheduler==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/190388#1856376 Nano OS] von Tobias W. ([http://sourceforge.net/projects/nanoos/ Sourceforge])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12176#79672 Wartezeiten effektiv (Scheduler)] von Peter Dannegger&lt;br /&gt;
* (C++) [http://www.mikrocontroller.net/topic/96977#837989 Einfacher Scheduler und Timer in C++ für ATMega] von S. Seegel&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/74026#609246 GOS: einfacher preemptive multitasking scheduler] von Günter Greschenz&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/articles/Monitorprogramm_Bamo128 Bamo128] Monitorprogramm und Bootloader&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/319580#new AvRtos] preemtiver real time multitasking scheduler von Harald B. ([http://sourceforge.net/projects/avrtos/ Sourceforge])&lt;br /&gt;
* (C) [https://bitbucket.org/dferreyra/avr-threads/wiki/Home avr-threads] Thread-Library für AVR&lt;br /&gt;
&lt;br /&gt;
==Bootloader==&lt;br /&gt;
* (A,C,PC) [http://www.mikrocontroller.net/topic/12181#79866 AVR Bootloader]&lt;br /&gt;
* (A, PC) [http://www.mikrocontroller.net/topic/146638#1364260 AVR Bootloader für GCC-Toolchain]&lt;br /&gt;
* (A,PC) [http://www.mikrocontroller.net/topic/95839 AVR Bootloader mit Verschlüsselung]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/72308#591159 ATtiny45 Bootloader]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/67047#538510 MMC/SD Bootloader für ATMega16]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/56818#439359 SD/MMC Card Bootloader (passt in 2kb bootsection)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/61170#480765 boofa - Bootloader für AVR über UART (AVR109)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/53130#413058 Bootloader ATmega168]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/73196#600293 UART Bootloader ATtiny13 - ATmega644]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/150816#1414460 UART Bootloader AtMega644P @ 20MHz] (Eclipse Projekt)&lt;br /&gt;
* (C) [[AVR Bootloader in C - eine einfache Anleitung]]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/200645#1971295 LAN-Bootloader für ATmega1284p]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/articles/Monitorprogramm_Bamo128 Bamo128] Monitorprogramm und Bootloader&lt;br /&gt;
Siehe auch: [[Bootloader]]&lt;br /&gt;
&lt;br /&gt;
==DCC==&lt;br /&gt;
&lt;br /&gt;
(Digital Command Control, Standard zur digitalen Steuerung von Modelleisenbahnen)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31397#241300 DCC Decoder]&lt;br /&gt;
&lt;br /&gt;
==DCF77==&lt;br /&gt;
&lt;br /&gt;
(Zeitsignaldienst für funkgesteuerte Uhren auf der Langwellen-Frequenz 77,5 kHz)&lt;br /&gt;
 &lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/38914#287867 DCF77 AVR-Assemblerbaustein ]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6500#41738 DCF77-Uhr mit ATTINY12]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31385#241104 DCF Digital Empfangsmodul - Korrelation - (Assembler)ATmega8 ]&lt;br /&gt;
* (C) [http://pic-projekte.de/wordpress/?p=572 DCF77 PIC-Projekte.de]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25071#186286 DCF 77 ]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/14788#101528 DCF-Uhr mit DotMatrix-Anzeige für avr-gcc]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12154#79501 PC DCF Timer ( PC Zeitschaltuhr)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25116#187197 DCF 77 Uhr mit CodeVision ]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/58769#456232 DCF77 Uhr in C mit ATtiny26]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48597#372164 DCF77 Uhr, zum X.ten Mal, jetzt mit SAF]&lt;br /&gt;
* (C,A) [http://www.mikrocontroller.net/topic/31408#536372 DCF77 mit beliebig gepoltem Eingangssignal innerhalb eines Webservers]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/121049 DCF-Uhr, Sonnenstand, TWI-Port, Alarmfunktion für Atmega8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/151260#1419218 DCF77 Uhr 7 Segment LED ATmega8 Assembler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/168807#1614129 DCF-Uhr mit LCD in C]&lt;br /&gt;
&lt;br /&gt;
== DRAM ==&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/25053#186085 2MB DRAM an AVR] und Anwendung als [http://www.mikrocontroller.net/topic/25053#186089 Audiorekorder]&lt;br /&gt;
* (A,C) [https://www.mikrocontroller.net/topic/236862 Grafikfähiger LCD Controller für 320x240 LCD mit D-RAM]&lt;br /&gt;
&lt;br /&gt;
==Drehgeber==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/6526#41978 Drehgeber auslesen]&lt;br /&gt;
* (C+A) [http://www.mikrocontroller.net/topic/302229#new 4-fach Auswertung für Dreh-/Inkrementalgeber, schnell]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/328348#new Schrittmotor als Drehgeber mit Drehdynamik]&lt;br /&gt;
* (A) [https://www.mikrocontroller.net/topic/478343?goto=5925396#5922395]&lt;br /&gt;
&lt;br /&gt;
==DTMF==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/92444#792954 DTMF dekodieren]&lt;br /&gt;
&lt;br /&gt;
==DMX==&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/92350#new 20 Kanal Relaissteuerung per DMX]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/276885#new DMX512 zu RGB Led Controller use HSV Farbraum]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/290366#3096821 20 Kanal PWM per DMX]&lt;br /&gt;
&lt;br /&gt;
==Ethernet==&lt;br /&gt;
Siehe auch [[AVR Softwarepool#Netzwerk|Netzwerk]]&lt;br /&gt;
&lt;br /&gt;
==Entwicklungssysteme==&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/74198#611404 AVR Code Wizard]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/30110#230503 Multitasking kernel für ATtinys in ASM]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/65156#521012 BASIC-Computer mit ATmega32]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/64129#511368 AVR TinyBASIC Anpassung für ATmega8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/59189#460273 Mini-Computer mit BASIC]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/55807 Forth System für ATmegas in Assembler]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/94193 Forth-Computer mit ATmega32 und Videoausgabe] von Christian Berger&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/62500#493931 Fixpoint-Arithmetik in &amp;quot;C&amp;quot;]&lt;br /&gt;
* (C++) [http://www.mikrocontroller.net/topic/143537 Fixpoint-Arithmetik in &amp;quot;C++&amp;quot;]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/85256#717037 64 Bit float Emulator in C, IEEE754 kompatibel]&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/92979#797957 AVR ATmega8TestBoard]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/94468#812992 Gleitkomma-Bibliothek für AVR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/177481?page=1 AVR CP/M System]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/187390 EMACS Konfiguration]&lt;br /&gt;
* (C) [https://www.mikrocontroller.net/topic/467307 Watchdog-ISR für ATmega328]&lt;br /&gt;
&lt;br /&gt;
==FFT==&lt;br /&gt;
&lt;br /&gt;
(Fast Fourier Transformation, &amp;quot;schnelle&amp;quot; Fouriertransformation)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25095#186536 FFT auf dem AVR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25062#186225 128point FFT in ASM]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/27001#203911 Schnelle FFT in Assembler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131525#1191497 AVR-Lichtorgel per FFT MEGA8 32 644 ]&lt;br /&gt;
&lt;br /&gt;
==Funksteckdosen==&lt;br /&gt;
* (C,A) [http://www.mikrocontroller.net/topic/31408#536372 Ansteuerung von Funksteckdosen mit einem Webserver]&lt;br /&gt;
&lt;br /&gt;
==GPS==&lt;br /&gt;
&lt;br /&gt;
(Global Positioning System, satellitengestütztes System zur weltweiten Positions- und Zeitbestimmung)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/48544#371717 GPS - MOUSE - MINI- NAVIGATOR (Assembler) ATmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/72507#593252 GPS an mega8,88 oder 168]&lt;br /&gt;
&lt;br /&gt;
==IR==&lt;br /&gt;
* siehe auch [[AVR Softwarepool#RC5|RC5]]&lt;br /&gt;
* (C) [[IRMP]] - Infrared Multi Protocol Decoder:&lt;br /&gt;
**[[IRMP| Wiki Seite]]&lt;br /&gt;
**[http://www.mikrocontroller.net/topic/162119#1545798 Thread im Forum]&lt;br /&gt;
&lt;br /&gt;
==Kryptographie==&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/73468 Verschiedene kryptographische Funktionen] &lt;br /&gt;
&lt;br /&gt;
==LANC==&lt;br /&gt;
&lt;br /&gt;
(Steuerprotokoll für Video- und Digitalfotokameras, auch als Control-L bekannt)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/40463#302754 Sony LANC Auswertung mit AVR] (Atmega 128 @ 16 MHz)&lt;br /&gt;
&lt;br /&gt;
==LEDs und LED-Anzeigen==&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/76839#638278 Solarlicht Steuerung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/77863#648213 Taster + LED am selben Draht (4*)]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/73776#606472 LED-Touch-Panel] (ARM)&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/74013#609097 RGB-Moodlight auf ATTiny2313 mit RC5-Fernbedienung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/54561#421940 HSV RGB Led Dimmer, C Code &amp;amp; Video &amp;amp; Doku]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/67567#543492 Mini RGB Lichteffektgenerator mit Menü für Pic16F84]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48464#370871 Ansteuerung einer RGB LED (PWM)]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/87149#737282 3x7 Segment und 1 I/O-Pin (Assembler)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31370#240843 ADC mit Multiplexanzeige] (vier 7-Segmentanzeigen)&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31388#241192 AVR-Lauflicht]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/94746#815809 HSB-&amp;gt;RGB Umrechnung rein in Assembler, auch für ATiny]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/110168 2x7-Segment an nur 3 Leitungen]&lt;br /&gt;
* (A) [[Ambilight in Hardware]]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/145156#1346531 µCke Microcontroller Mücke (Atmel Tiny13)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131525#1191497 AVR-Lichtorgel per FFT MEGA8 32 644 ]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/182305 TLC5940 16-Kanal 12bit LED Treiber ansteuern und HighPower LEDs über MosFETs treiben]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/185730 7Segment Coder]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/244768 RGB-Moodlight, ATMega8, Soft-PWM mit Gammakorrektur, IR-Fernbedienung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/275426 serielles 4x7 Segment Display NSM4202]&lt;br /&gt;
* (C) [https://www.mikrocontroller.net/topic/415651#new SSD1306/1309 Library zum Darstellen von Text/Grafik auf OLED Displays]&lt;br /&gt;
* (A) [https://www.mikrocontroller.net/topic/506738#new SSD1306 text library für oled displays]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==LCD und VFD==&lt;br /&gt;
* (C) [http://bluematrixi.bl.funpic.de/index.php/elektronik-avr/lcd-display-nokia3310 Bibliothek für Nokia 3310 Lcd Ansteuerung in &amp;quot;C&amp;quot; - sehr gut]&lt;br /&gt;
*(C,A)[http://www.mikrocontroller.net/articles/Ansteuerung_Handy_Displays Ansteuerung_Handy_Displays]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/53137#413137 Programm zum Erstellen eigener Schriftarten (LCD)]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/54860#423255 LCD Schriftarten ( Fonts in veschiedenen Größen )]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31403  The Siemens S65 132x176, 65536 color display with AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48501#371218 LCD Ansteuerung im 4bit-Modus]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48456#370782 LCD Library T6963c]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/76399#633680 &amp;quot;Bessere&amp;quot; T6963c Library]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25099#186569 LCD Controller für 640x480 LCD mit mega8515]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/38923#287939 LCD Controller KS0073 Support im 4-Bit Mode]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/79609#664268 KS0066U oder Ähnliche --- LCD Treiber]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/81793#683135 Pollin E0855-2 SED1530-Treiber]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/90449#772843 LCD über nur einen IO-Pin ansteuern]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/120475 VFD Library (Vacuum Fluorescent Display Library)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98321#851423 Grafikfähiger LCD Controller für 320x240 LCD mit 4 Graustufen] (jetzt auch mit 8 Graustufen)&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/140369 Menüsystem für beliebige schwarz-weiß LCDs bis 4096x4096 Pixeln und grafischem Editor]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/194149 Schnelle SED1520 Funktionsbibliothek mit Bildkonverter und Fontgenerator]&lt;br /&gt;
* (PC,C) [http://www.mikrocontroller.net/topic/234304 DOGXL Fontgenerator (SW+Graustufen)]&lt;br /&gt;
* (C,A) [http://www.mikrocontroller.net/topic/236862#2401250 Grafikfähiger LCD Controller für 320x240 LCD mit D-RAM]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/190078 LCD SHARP M078CKA mit LH155]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/287978 EA DOGM162 Textdisplay an SPI]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/305266 HD44780 Display 2x16 Xmega-Assemblerbaustein]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/320791#3524261 Nokia N95 Display 320x240 Arduino Lib.]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/318818#3456758 Library für ST7735 Display Controller mit GLCD Font Unterstützung]&lt;br /&gt;
* (C) [https://www.mikrocontroller.net/topic/415651#new SSD1306/1309 Library zum Darstellen von Text/Grafik auf OLED Displays]&lt;br /&gt;
* (A) [https://www.mikrocontroller.net/topic/506738#new SSD1306 text library für oled displays]&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98923#857451 Ultraschall Entfernungsmesser mit I2C, Eigenbau]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/83871#new  I2C-Master realisiert in Software, ohne TWI für alle ATMEGAs]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/38919#new  RS232 &amp;lt;-&amp;gt; TWI / I2C Interface für ATMega8 (ASM) inkl. Windows Software]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/67698#544930 USI TWI Master]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/235733#2388116 Hardware TWI-MASTER Interrupt basierend für Mega AVR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/272621#new I2C/TWI Master-Interrupt Xmega-Assemblerbaustein]&lt;br /&gt;
* (C) [https://www.mikrocontroller.net/topic/378553 hot-plug fähige Library für DS1621 Temperatursensoren ]&lt;br /&gt;
* (A) [https://www.mikrocontroller.net/topic/506739#new TWI im polling für AVR 0-Series und AVR 1-Series]&lt;br /&gt;
&lt;br /&gt;
==Messgeräte==&lt;br /&gt;
===Drehzahlmesser===&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/1518#8469 Drehzahlmesser 4 mal 7-Segment mit 90S2313]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/Drehzahlmesser Drehzahlmesser mit 4 mal 7-Segment anzeigen mit Tiny2313, Wiki-Artikel]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/231283 einfache Drehzahlmessung mit ATmega88]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/232485 4-Kanal Drehzahlmessung mit ATmega88]&lt;br /&gt;
&lt;br /&gt;
===Klopfsensormessgerät===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/Klopfsensormessgeraet Messgerät für Klopfgeräusche an Verbrennungsmotoren auf Basis des TPIC8101]&lt;br /&gt;
&lt;br /&gt;
===Entfernungsmesser===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98923#857451 Ultraschall Entfernungsmesser mit I2C, Eigenbau]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/130834 3D Umgebungserfassung mit einem auf zwei Servors montiertem Sharp Distanzsensor, Eigenbau]&lt;br /&gt;
&lt;br /&gt;
===Frequenzmesser===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/62610#495030 Frequenzmesser bis 2Mhz -- mit AVR ATmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48582#372072 Frequenzmessung (Seite mit Quellcode nicht erreichbar)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/62517#494146 Input Capture Pin (ICP) auslesen ( Frequenz messen)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25144#187587 Frequenzmessung und Impulszählung über den Parallelport-IR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31394#241251 einfacher 5 MHz Frequenzzähler (Assembler) ATmega8]&lt;br /&gt;
* (A+C) [http://www.mikrocontroller.net/topic/69021#558098 Multimeter]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/173665#new sehr genauer Frequenzmesser Atmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/186801#new  Reziproker Frequenzzähler+ Optimierte 64bit uint Routinen]&lt;br /&gt;
* (C+A) [http://www.mikrocontroller.net/topic/200279#new 6 Stellen von 1Hz bis 40MHz ATmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/241150#2458079 Reziproker Frequenzzähler, GPS-stabilisiert, ATmega162]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/359552#new Reziproker Frequenzzähler mit BASCOM-AVR]&lt;br /&gt;
&lt;br /&gt;
===Frequenzgenerator===&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/152966#1438488 Einstellbarer Frequenzgenerator für 0.12 Hz - 8 MHz mit Atmega 8 und Bascom ]&lt;br /&gt;
&lt;br /&gt;
===Kompass===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/100239#870281 KOMPASS KMZ10A KMZ10B ATmega8 Assembler]&lt;br /&gt;
&lt;br /&gt;
===Messgeräte für elektronische Bauteile===&lt;br /&gt;
* (A+C) [http://www.mikrocontroller.net/topic/69021#558098 Multimeter]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/60797#477026 LC-METER / LC-Messgerät ATmega8 Assembler]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/60591#474873 Widerstandstester]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/56770#438957 Ladungsmessgerät]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31386#241139 Transistortester]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131804#1194273 Transistortester]&lt;br /&gt;
&lt;br /&gt;
===Spannungsmesser===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31370#240843 ADC mit Multiplexanzeige] - Voltmeter&lt;br /&gt;
* (A+C) [http://www.mikrocontroller.net/topic/69021#558098 Multimeter]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31389 Wirkleistungsmessgerät] - &amp;quot;Ein einfaches Wirkleistungsmessgerät für 230V Verbraucher ohne Netztrennung mit 3 stelliger 7-Segment Anzeige für Verbraucher bis 500W.&amp;quot; (+ ähnlicher Aufbau mit Silabs Controller)&lt;br /&gt;
&lt;br /&gt;
===Thermometer===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6516#41903 Zeit + Temperatur auf LCD mit AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/53127#413006 Thermometer mit LED &amp;amp; LM35]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31408#536372 Viele DS18x20-Thermometer in einem Webserver]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/354441#3953900 Auswertung Temperatursensor KTY81 (PT1000), Arduino Uno, 1-6 Kanäle]&lt;br /&gt;
&lt;br /&gt;
===Oszilloskop===&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/53129#413011 Einfaches Oszilloskop - Bascom]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/48586#372093 Oszi- &amp;amp; Logikanalyser mit LCD]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31376#240880 einfaches DIGITAL- Oszilloskop (800 Datenpunkte) Assembler]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/56616#437772 Einfaches &amp;quot;Oszilloskop&amp;quot;]&lt;br /&gt;
* (C) [http://www.christoph-lauer.de/Homepage/Blog/Eintrage/2010/8/1_Embedded_C_based_Spectrumanalyzer.html ATXMega based Oscilloscope and Spectrumanalyzer]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/228997#2308320 Selbstbau Digital Storage Oszilloskop]&lt;br /&gt;
&lt;br /&gt;
===Beschleunigungssensor===&lt;br /&gt;
* (c++) [http://www.mikrocontroller.net/topic/268214 Einfache BMA020 Library, mit I2C]&lt;br /&gt;
&lt;br /&gt;
==MIDI==&lt;br /&gt;
&lt;br /&gt;
(Musical Instrument Digital Interface, Datenübertragungsstandard für Musikinstrumente)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48542#371695 Mr.MidiPlayer - Spielt alle MIDI-Dateien von einer SD-Karte] (siehe auch: [[Midi_Rekorder_mit_MMC/SD-Karte]])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25035#185861 MIDI-Rekorder mit SD/MMC und AVR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/106512# Drum-Trigger mit MIDI-Ausgabe]&lt;br /&gt;
&lt;br /&gt;
==MMC==&lt;br /&gt;
&lt;br /&gt;
(Multimedia Card, digitales Flash-Speichermedium)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25056#186117 SourceCode MMC die Zweite]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48481#370950 MMC/SD-Karte mit FAT16 an AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/67047#538510 MMC/SD Bootloader füt ATMega16]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/14800#102024 MMC/SD ansteuern mit AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25035#185861 MIDI-Rekorder mit SD/MMC und AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/FAT32 MMC/SD - FAT16/32 Bibliothek für AVR  mit Wiki]&lt;br /&gt;
&lt;br /&gt;
==Netzgeräte==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/60786#476904 Labornetzgerät]&lt;br /&gt;
* [[RADLAB-PS1]] [http://www.mikrocontroller.net/topic/124858#1138781 Netzteil um LM317 mit Strombegrenzung und Anzeige!]&lt;br /&gt;
&lt;br /&gt;
==Netzwerk==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/87517#new Kleiner ENC28J60 µWebserver von SimonK]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/82127#new Ulrich Radigs ENC28J60 mit leicht lötbaren/beschaffbaren Bauteilen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131825 Dirk Broßwick Webserver auf ENC28j60 Basis mit einem ATmega2561, es gibt auch einen Port auf das AVR-NET IO]&lt;br /&gt;
&lt;br /&gt;
==Parser==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/64763#517245 Zwei Parser für numerische Ausdrücke]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/76842#638283 uShell - ein universeller Parser für uCs]&lt;br /&gt;
&lt;br /&gt;
==RFID==&lt;br /&gt;
&lt;br /&gt;
(Radio Frequency Identification, Verfahren zur funkbasierten Identifizierung und Lokalisierung von Gegenständen)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/68442#552128 USB RFID Tag Leser]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/228709 Soft-RFID ohne RFID-IC]&lt;br /&gt;
&lt;br /&gt;
==RC - Fernsteuerungen/Servos==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48529#371582 RC Summen Signal erzeugen ]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/192453 RC Summen Signal dekodieren ]&lt;br /&gt;
&lt;br /&gt;
==RC5==&lt;br /&gt;
&lt;br /&gt;
(verbreitetes Datenübertragungsprotokoll für Infrarot-Fernbedienungen)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/14789#101536 RC5 Sender auf einem Attiny11L]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/74013#609097 RGB-Moodlight auf ATTiny2313 mit RC5-Fernbedienung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12216#80856 Fernbedien RC5 Empfänger]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/59235#460765 RC5 Sender selber bauen ???]&lt;br /&gt;
&lt;br /&gt;
==Ringpuffer==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/66789#536189 Ringpuffer AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/101472#882716 AVR-GCC: UART mit FIFO]&lt;br /&gt;
&lt;br /&gt;
==SD==&lt;br /&gt;
&lt;br /&gt;
(Secure Digital Memory Card; digitales Flash-Speichermedium)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48542#371695 Mr.MidiPlayer - Spielt alle MIDI-Dateien von einer SD-Karte] (siehe auch: [[Midi_Rekorder_mit_MMC/SD-Karte]])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25035#185861 MIDI-Rekorder mit SD/MMC und AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/68257#550336 Datenrekorder auf SD-Karte mit mega88]&lt;br /&gt;
&lt;br /&gt;
==Sonstiges==&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/111783#994358 Sonnenstandberechnung mit Atmega 8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/UAC_Mikrocontroller_ASCII_Console uAC Mikrocontroller ASCII Console]&lt;br /&gt;
&lt;br /&gt;
==Spaßprojekte==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/119876#1083044 Miniprojekt: Lagerfeuer-LED (ATtiny25)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/120289#1087905 Klingel mit 100 Melodien - last minute Weihnachtsgeschenk]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/145156#1346531 µCke Microcontroller Mücke (Atmel Tiny13)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/167528#1601077 Toastbrote zählen]&lt;br /&gt;
&lt;br /&gt;
==Spiele==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48505#371259 Tetris auf dem AtMega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/187253# Atmega8 Schachuhr mit Max7219 ]&lt;br /&gt;
&lt;br /&gt;
==Steuerungen==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/123551 Aquarium Controller]&lt;br /&gt;
* () [http://www.mikrocontroller.net/topic/309045 Lüftersteuerung durch zwei SHT75, mega32, LCD und SD-Karte]&lt;br /&gt;
* () [http://www.mikrocontroller.net/topic/307375 Fensteröffner mit Scheibenwischermotor dht11 sht11]&lt;br /&gt;
&lt;br /&gt;
==Taster / Schalter==&lt;br /&gt;
===mechanisch===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6492#41625 Tasten entprellen - Bulletproof] (siehe auch: [[Entprellung]])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48465#370877 Universelle Tastenabfrage]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/6491#41624 Tasten-Matrix entprellen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/64731#517001 Tastenmatrix auslesen über nur 2 Leitungen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/64743#517105 Tasten Entprellen für N00bs]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/77863#648213 Taster + LED am selben Draht (4*)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/1515#8455 Entprellen von Tastern, autorepeat, vintage]&lt;br /&gt;
&lt;br /&gt;
===kapazitiv===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/38904  Sensor mit nur einer Kontaktfläche]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25045 Einfache Sensortaste]&lt;br /&gt;
&lt;br /&gt;
==Tonerzeugung==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/66945#537624 ATMEGA8 Soundgenerator/Synthesizer]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/120289#1087905 Klingel mit 100 Melodien - last minute Weihnachtsgeschenk]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/134362 RTTTL Melodiegenerator mit ATTINY85]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/232702#new RTTTL Melodiegenerator mit ATMEGA8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25051 Melodie ausgeben mit AVR ATTiny12]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/145156#1346531 µCke Microcontroller Mücke (Atmel Tiny13)]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/137629#1259132 Melodieklingel BASCOM ATmega8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/191596 2Kanal Synthesizer ATtiny 2313, 85, ..]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/232845 17 Kanal Avr Synthesizer]&lt;br /&gt;
* (C) [[AVR-Synthesizer]]&lt;br /&gt;
&lt;br /&gt;
==TWI==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/87597#742070 AVR TWI Master und Slave Funtionen in C]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31404#242081 TWI / I2C einf. MASTER SLAVE Beispiel(Assembler) ATmega8]&lt;br /&gt;
&lt;br /&gt;
==USB==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/75254#622120 USB Host Stack für Eingebettete Systeme (LGPL)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/68442#552128 USB RFID Tag Leser]&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/92979#797957 AVR ATmega8TestBoard]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/90791#776280 Relaiskarte für den USB Port]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/130381#1179352 USB-Stick am Mikrocontroller VNC1L]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/155241 PDIUSBD12 Treiber und micro USB-Device stack]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/192453 HID-Joystick mit V-USB ]&lt;br /&gt;
&lt;br /&gt;
==UART==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/101472#882716 AVR-GCC: UART mit FIFO]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/38928#287985 Software UART]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/125651#1147436 Software UART mit FIFO]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/175946#1690682 uParse] - ein kompakter und vielseitiger Parser (Atmega32) für [[RS232]]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/159753#1517744 Einfacher Interpreter für Komandozeilen/Befehlszeilen] (Atmega32) für [[RS232]]&lt;br /&gt;
* (C) [https://sourceforge.net/projects/yambsiavr/ Modbus Slave Library] für [[RS232]] und [[RS485]]&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/53140#413249 AVR ASCII Video Terminal - 40 x 25 - BAS Signal]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/53139#413225 TV VIDEO BILD BAS Frequenzzähler DVM Atmega8 Assembler]&lt;br /&gt;
* (A) [http://www.electronicspit.com/video/ Videosignal in Farbe aus dem ATMega32] (URL nicht mehr erreichbar)&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25091#new VGA Testbildgenerator]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/101429#882288 ATmega8 erzeugt Video in C!]&lt;br /&gt;
&lt;br /&gt;
==Zeitgeber und Uhren==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/12185#80055 Die genaue Sekunde / RTC]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/74673#616226 LCD-Timer für Belichtungsgerät]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/119859#1082804 DS1307 Assembler-Code]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31374#240878 AVR Library für RTC 12C887 in C]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25136#187534 RTC DS1302 in C]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25087#186454 RTC + Scheduler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/53131#413059 Jumbo-LED Uhr]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/6516#41903 Zeit + Temperatur auf LCD mit AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25069 Sekunden in Zeit/Datum umwandeln (mit Sommerzeit/Schaltjahren)]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/48560#371911 BASCOM Uhr mit Butterfly]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48450#370765 Countdown timer für UV Belichter]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98885 Countdown Timer mit ATtiny2313]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12176#79672 Wartezeiten effektiv (Scheduler)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31408#536372 Schaltuhr mit DCF77-Referenz in einem Webserver, Steuerung von Funksteckdosen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/100892#876549 Eieruhr mit ATtiny24V/ATtiny2313V]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/151236 Zeitauslöser für Casio EX F1 mit Attiny2313]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/151260#1419218 DCF77 Uhr 7 Segment LED ATmega8 Assembler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/177688# NIXIE Uhr mit vielen Funktionen in C mit ATTiny2313]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/233699 Stoppuhr – Geschwindigkeit – Pulsweite mit Atmega88]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/275514 Timer bis 99:59 min - LED Display NSM4202, Drehgeber - At90S2313]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/289724 Uhr/Kalender AVR-Assemblerbaustein]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Codesammlung Übersicht]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR]]&lt;br /&gt;
[[Kategorie:Forum]]&lt;br /&gt;
[[Kategorie:Listen]]&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Softwarepool&amp;diff=102648</id>
		<title>AVR Softwarepool</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Softwarepool&amp;diff=102648"/>
		<updated>2020-12-01T18:11:24Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* LCD und VFD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die interessantesten Softwareprojekte aus der Codesammlung...&lt;br /&gt;
&lt;br /&gt;
(A)   ... Projekt ist in &#039;&#039;&#039;Assembler&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(C)   ... Projekt ist in &#039;&#039;&#039;C&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(C++) ... Projekt ist in &#039;&#039;&#039;C++&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(B)   ... Projekt ist in &#039;&#039;&#039;Bascom&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(PC)  ... Projekt ist nicht für einen µC, sondern für den PC&lt;br /&gt;
&lt;br /&gt;
==1-Wire==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/14792  DS1820, DS18B20 in C]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6505 Mehrere DS1820/DS18B20 auslesen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31408#536372 Mehrere DS1820/DS18B20/DS18S20/DS1822 über einen Webserver auslesbar]&lt;br /&gt;
* (C) [https://www.mikrocontroller.net/topic/387139#4890827 Bibliothek für OneWire und DS18x20]&lt;br /&gt;
&lt;br /&gt;
==Akkulader==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/72627#594587 Bleiakku-Lader 12/24V]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
&lt;br /&gt;
==Betriebssysteme und Scheduler==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/190388#1856376 Nano OS] von Tobias W. ([http://sourceforge.net/projects/nanoos/ Sourceforge])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12176#79672 Wartezeiten effektiv (Scheduler)] von Peter Dannegger&lt;br /&gt;
* (C++) [http://www.mikrocontroller.net/topic/96977#837989 Einfacher Scheduler und Timer in C++ für ATMega] von S. Seegel&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/74026#609246 GOS: einfacher preemptive multitasking scheduler] von Günter Greschenz&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/articles/Monitorprogramm_Bamo128 Bamo128] Monitorprogramm und Bootloader&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/319580#new AvRtos] preemtiver real time multitasking scheduler von Harald B. ([http://sourceforge.net/projects/avrtos/ Sourceforge])&lt;br /&gt;
* (C) [https://bitbucket.org/dferreyra/avr-threads/wiki/Home avr-threads] Thread-Library für AVR&lt;br /&gt;
&lt;br /&gt;
==Bootloader==&lt;br /&gt;
* (A,C,PC) [http://www.mikrocontroller.net/topic/12181#79866 AVR Bootloader]&lt;br /&gt;
* (A, PC) [http://www.mikrocontroller.net/topic/146638#1364260 AVR Bootloader für GCC-Toolchain]&lt;br /&gt;
* (A,PC) [http://www.mikrocontroller.net/topic/95839 AVR Bootloader mit Verschlüsselung]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/72308#591159 ATtiny45 Bootloader]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/67047#538510 MMC/SD Bootloader für ATMega16]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/56818#439359 SD/MMC Card Bootloader (passt in 2kb bootsection)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/61170#480765 boofa - Bootloader für AVR über UART (AVR109)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/53130#413058 Bootloader ATmega168]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/73196#600293 UART Bootloader ATtiny13 - ATmega644]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/150816#1414460 UART Bootloader AtMega644P @ 20MHz] (Eclipse Projekt)&lt;br /&gt;
* (C) [[AVR Bootloader in C - eine einfache Anleitung]]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/200645#1971295 LAN-Bootloader für ATmega1284p]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/articles/Monitorprogramm_Bamo128 Bamo128] Monitorprogramm und Bootloader&lt;br /&gt;
Siehe auch: [[Bootloader]]&lt;br /&gt;
&lt;br /&gt;
==DCC==&lt;br /&gt;
&lt;br /&gt;
(Digital Command Control, Standard zur digitalen Steuerung von Modelleisenbahnen)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31397#241300 DCC Decoder]&lt;br /&gt;
&lt;br /&gt;
==DCF77==&lt;br /&gt;
&lt;br /&gt;
(Zeitsignaldienst für funkgesteuerte Uhren auf der Langwellen-Frequenz 77,5 kHz)&lt;br /&gt;
 &lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/38914#287867 DCF77 AVR-Assemblerbaustein ]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6500#41738 DCF77-Uhr mit ATTINY12]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31385#241104 DCF Digital Empfangsmodul - Korrelation - (Assembler)ATmega8 ]&lt;br /&gt;
* (C) [http://pic-projekte.de/wordpress/?p=572 DCF77 PIC-Projekte.de]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25071#186286 DCF 77 ]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/14788#101528 DCF-Uhr mit DotMatrix-Anzeige für avr-gcc]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12154#79501 PC DCF Timer ( PC Zeitschaltuhr)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25116#187197 DCF 77 Uhr mit CodeVision ]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/58769#456232 DCF77 Uhr in C mit ATtiny26]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48597#372164 DCF77 Uhr, zum X.ten Mal, jetzt mit SAF]&lt;br /&gt;
* (C,A) [http://www.mikrocontroller.net/topic/31408#536372 DCF77 mit beliebig gepoltem Eingangssignal innerhalb eines Webservers]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/121049 DCF-Uhr, Sonnenstand, TWI-Port, Alarmfunktion für Atmega8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/151260#1419218 DCF77 Uhr 7 Segment LED ATmega8 Assembler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/168807#1614129 DCF-Uhr mit LCD in C]&lt;br /&gt;
&lt;br /&gt;
== DRAM ==&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/25053#186085 2MB DRAM an AVR] und Anwendung als [http://www.mikrocontroller.net/topic/25053#186089 Audiorekorder]&lt;br /&gt;
* (A,C) [https://www.mikrocontroller.net/topic/236862 Grafikfähiger LCD Controller für 320x240 LCD mit D-RAM]&lt;br /&gt;
&lt;br /&gt;
==Drehgeber==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/6526#41978 Drehgeber auslesen]&lt;br /&gt;
* (C+A) [http://www.mikrocontroller.net/topic/302229#new 4-fach Auswertung für Dreh-/Inkrementalgeber, schnell]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/328348#new Schrittmotor als Drehgeber mit Drehdynamik]&lt;br /&gt;
* (A) [https://www.mikrocontroller.net/topic/478343?goto=5925396#5922395]&lt;br /&gt;
&lt;br /&gt;
==DTMF==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/92444#792954 DTMF dekodieren]&lt;br /&gt;
&lt;br /&gt;
==DMX==&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/92350#new 20 Kanal Relaissteuerung per DMX]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/276885#new DMX512 zu RGB Led Controller use HSV Farbraum]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/290366#3096821 20 Kanal PWM per DMX]&lt;br /&gt;
&lt;br /&gt;
==Ethernet==&lt;br /&gt;
Siehe auch [[AVR Softwarepool#Netzwerk|Netzwerk]]&lt;br /&gt;
&lt;br /&gt;
==Entwicklungssysteme==&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/74198#611404 AVR Code Wizard]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/30110#230503 Multitasking kernel für ATtinys in ASM]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/65156#521012 BASIC-Computer mit ATmega32]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/64129#511368 AVR TinyBASIC Anpassung für ATmega8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/59189#460273 Mini-Computer mit BASIC]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/55807 Forth System für ATmegas in Assembler]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/94193 Forth-Computer mit ATmega32 und Videoausgabe] von Christian Berger&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/62500#493931 Fixpoint-Arithmetik in &amp;quot;C&amp;quot;]&lt;br /&gt;
* (C++) [http://www.mikrocontroller.net/topic/143537 Fixpoint-Arithmetik in &amp;quot;C++&amp;quot;]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/85256#717037 64 Bit float Emulator in C, IEEE754 kompatibel]&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/92979#797957 AVR ATmega8TestBoard]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/94468#812992 Gleitkomma-Bibliothek für AVR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/177481?page=1 AVR CP/M System]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/187390 EMACS Konfiguration]&lt;br /&gt;
* (C) [https://www.mikrocontroller.net/topic/467307 Watchdog-ISR für ATmega328]&lt;br /&gt;
&lt;br /&gt;
==FFT==&lt;br /&gt;
&lt;br /&gt;
(Fast Fourier Transformation, &amp;quot;schnelle&amp;quot; Fouriertransformation)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25095#186536 FFT auf dem AVR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25062#186225 128point FFT in ASM]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/27001#203911 Schnelle FFT in Assembler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131525#1191497 AVR-Lichtorgel per FFT MEGA8 32 644 ]&lt;br /&gt;
&lt;br /&gt;
==Funksteckdosen==&lt;br /&gt;
* (C,A) [http://www.mikrocontroller.net/topic/31408#536372 Ansteuerung von Funksteckdosen mit einem Webserver]&lt;br /&gt;
&lt;br /&gt;
==GPS==&lt;br /&gt;
&lt;br /&gt;
(Global Positioning System, satellitengestütztes System zur weltweiten Positions- und Zeitbestimmung)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/48544#371717 GPS - MOUSE - MINI- NAVIGATOR (Assembler) ATmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/72507#593252 GPS an mega8,88 oder 168]&lt;br /&gt;
&lt;br /&gt;
==IR==&lt;br /&gt;
* siehe auch [[AVR Softwarepool#RC5|RC5]]&lt;br /&gt;
* (C) [[IRMP]] - Infrared Multi Protocol Decoder:&lt;br /&gt;
**[[IRMP| Wiki Seite]]&lt;br /&gt;
**[http://www.mikrocontroller.net/topic/162119#1545798 Thread im Forum]&lt;br /&gt;
&lt;br /&gt;
==Kryptographie==&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/73468 Verschiedene kryptographische Funktionen] &lt;br /&gt;
&lt;br /&gt;
==LANC==&lt;br /&gt;
&lt;br /&gt;
(Steuerprotokoll für Video- und Digitalfotokameras, auch als Control-L bekannt)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/40463#302754 Sony LANC Auswertung mit AVR] (Atmega 128 @ 16 MHz)&lt;br /&gt;
&lt;br /&gt;
==LEDs und LED-Anzeigen==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/76839#638278 Solarlicht Steuerung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/77863#648213 Taster + LED am selben Draht (4*)]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/73776#606472 LED-Touch-Panel] (ARM)&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/74013#609097 RGB-Moodlight auf ATTiny2313 mit RC5-Fernbedienung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/54561#421940 HSV RGB Led Dimmer, C Code &amp;amp; Video &amp;amp; Doku]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/67567#543492 Mini RGB Lichteffektgenerator mit Menü für Pic16F84]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48464#370871 Ansteuerung einer RGB LED (PWM)]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/87149#737282 3x7 Segment und 1 I/O-Pin (Assembler)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31370#240843 ADC mit Multiplexanzeige] (vier 7-Segmentanzeigen)&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31388#241192 AVR-Lauflicht]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/94746#815809 HSB-&amp;gt;RGB Umrechnung rein in Assembler, auch für ATiny]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/110168 2x7-Segment an nur 3 Leitungen]&lt;br /&gt;
* (A) [[Ambilight in Hardware]]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/145156#1346531 µCke Microcontroller Mücke (Atmel Tiny13)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131525#1191497 AVR-Lichtorgel per FFT MEGA8 32 644 ]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/182305 TLC5940 16-Kanal 12bit LED Treiber ansteuern und HighPower LEDs über MosFETs treiben]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/185730 7Segment Coder]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/244768 RGB-Moodlight, ATMega8, Soft-PWM mit Gammakorrektur, IR-Fernbedienung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/275426 serielles 4x7 Segment Display NSM4202]&lt;br /&gt;
&lt;br /&gt;
==LCD und VFD==&lt;br /&gt;
* (C) [http://bluematrixi.bl.funpic.de/index.php/elektronik-avr/lcd-display-nokia3310 Bibliothek für Nokia 3310 Lcd Ansteuerung in &amp;quot;C&amp;quot; - sehr gut]&lt;br /&gt;
*(C,A)[http://www.mikrocontroller.net/articles/Ansteuerung_Handy_Displays Ansteuerung_Handy_Displays]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/53137#413137 Programm zum Erstellen eigener Schriftarten (LCD)]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/54860#423255 LCD Schriftarten ( Fonts in veschiedenen Größen )]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31403  The Siemens S65 132x176, 65536 color display with AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48501#371218 LCD Ansteuerung im 4bit-Modus]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48456#370782 LCD Library T6963c]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/76399#633680 &amp;quot;Bessere&amp;quot; T6963c Library]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25099#186569 LCD Controller für 640x480 LCD mit mega8515]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/38923#287939 LCD Controller KS0073 Support im 4-Bit Mode]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/79609#664268 KS0066U oder Ähnliche --- LCD Treiber]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/81793#683135 Pollin E0855-2 SED1530-Treiber]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/90449#772843 LCD über nur einen IO-Pin ansteuern]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/120475 VFD Library (Vacuum Fluorescent Display Library)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98321#851423 Grafikfähiger LCD Controller für 320x240 LCD mit 4 Graustufen] (jetzt auch mit 8 Graustufen)&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/140369 Menüsystem für beliebige schwarz-weiß LCDs bis 4096x4096 Pixeln und grafischem Editor]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/194149 Schnelle SED1520 Funktionsbibliothek mit Bildkonverter und Fontgenerator]&lt;br /&gt;
* (PC,C) [http://www.mikrocontroller.net/topic/234304 DOGXL Fontgenerator (SW+Graustufen)]&lt;br /&gt;
* (C,A) [http://www.mikrocontroller.net/topic/236862#2401250 Grafikfähiger LCD Controller für 320x240 LCD mit D-RAM]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/190078 LCD SHARP M078CKA mit LH155]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/287978 EA DOGM162 Textdisplay an SPI]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/305266 HD44780 Display 2x16 Xmega-Assemblerbaustein]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/320791#3524261 Nokia N95 Display 320x240 Arduino Lib.]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/318818#3456758 Library für ST7735 Display Controller mit GLCD Font Unterstützung]&lt;br /&gt;
* (C) [https://www.mikrocontroller.net/topic/415651#new SSD1306/1309 Library zum Darstellen von Text/Grafik auf OLED Displays]&lt;br /&gt;
* (A) [https://www.mikrocontroller.net/topic/506738#new SSD1306 text library für oled displays]&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98923#857451 Ultraschall Entfernungsmesser mit I2C, Eigenbau]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/83871#new  I2C-Master realisiert in Software, ohne TWI für alle ATMEGAs]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/38919#new  RS232 &amp;lt;-&amp;gt; TWI / I2C Interface für ATMega8 (ASM) inkl. Windows Software]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/67698#544930 USI TWI Master]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/235733#2388116 Hardware TWI-MASTER Interrupt basierend für Mega AVR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/272621#new I2C/TWI Master-Interrupt Xmega-Assemblerbaustein]&lt;br /&gt;
* (C) [https://www.mikrocontroller.net/topic/378553 hot-plug fähige Library für DS1621 Temperatursensoren ]&lt;br /&gt;
* (A) [https://www.mikrocontroller.net/topic/506739#new TWI im polling für AVR 0-Series und AVR 1-Series]&lt;br /&gt;
&lt;br /&gt;
==Messgeräte==&lt;br /&gt;
===Drehzahlmesser===&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/1518#8469 Drehzahlmesser 4 mal 7-Segment mit 90S2313]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/Drehzahlmesser Drehzahlmesser mit 4 mal 7-Segment anzeigen mit Tiny2313, Wiki-Artikel]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/231283 einfache Drehzahlmessung mit ATmega88]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/232485 4-Kanal Drehzahlmessung mit ATmega88]&lt;br /&gt;
&lt;br /&gt;
===Klopfsensormessgerät===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/Klopfsensormessgeraet Messgerät für Klopfgeräusche an Verbrennungsmotoren auf Basis des TPIC8101]&lt;br /&gt;
&lt;br /&gt;
===Entfernungsmesser===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98923#857451 Ultraschall Entfernungsmesser mit I2C, Eigenbau]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/130834 3D Umgebungserfassung mit einem auf zwei Servors montiertem Sharp Distanzsensor, Eigenbau]&lt;br /&gt;
&lt;br /&gt;
===Frequenzmesser===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/62610#495030 Frequenzmesser bis 2Mhz -- mit AVR ATmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48582#372072 Frequenzmessung (Seite mit Quellcode nicht erreichbar)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/62517#494146 Input Capture Pin (ICP) auslesen ( Frequenz messen)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25144#187587 Frequenzmessung und Impulszählung über den Parallelport-IR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31394#241251 einfacher 5 MHz Frequenzzähler (Assembler) ATmega8]&lt;br /&gt;
* (A+C) [http://www.mikrocontroller.net/topic/69021#558098 Multimeter]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/173665#new sehr genauer Frequenzmesser Atmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/186801#new  Reziproker Frequenzzähler+ Optimierte 64bit uint Routinen]&lt;br /&gt;
* (C+A) [http://www.mikrocontroller.net/topic/200279#new 6 Stellen von 1Hz bis 40MHz ATmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/241150#2458079 Reziproker Frequenzzähler, GPS-stabilisiert, ATmega162]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/359552#new Reziproker Frequenzzähler mit BASCOM-AVR]&lt;br /&gt;
&lt;br /&gt;
===Frequenzgenerator===&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/152966#1438488 Einstellbarer Frequenzgenerator für 0.12 Hz - 8 MHz mit Atmega 8 und Bascom ]&lt;br /&gt;
&lt;br /&gt;
===Kompass===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/100239#870281 KOMPASS KMZ10A KMZ10B ATmega8 Assembler]&lt;br /&gt;
&lt;br /&gt;
===Messgeräte für elektronische Bauteile===&lt;br /&gt;
* (A+C) [http://www.mikrocontroller.net/topic/69021#558098 Multimeter]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/60797#477026 LC-METER / LC-Messgerät ATmega8 Assembler]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/60591#474873 Widerstandstester]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/56770#438957 Ladungsmessgerät]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31386#241139 Transistortester]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131804#1194273 Transistortester]&lt;br /&gt;
&lt;br /&gt;
===Spannungsmesser===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31370#240843 ADC mit Multiplexanzeige] - Voltmeter&lt;br /&gt;
* (A+C) [http://www.mikrocontroller.net/topic/69021#558098 Multimeter]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31389 Wirkleistungsmessgerät] - &amp;quot;Ein einfaches Wirkleistungsmessgerät für 230V Verbraucher ohne Netztrennung mit 3 stelliger 7-Segment Anzeige für Verbraucher bis 500W.&amp;quot; (+ ähnlicher Aufbau mit Silabs Controller)&lt;br /&gt;
&lt;br /&gt;
===Thermometer===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6516#41903 Zeit + Temperatur auf LCD mit AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/53127#413006 Thermometer mit LED &amp;amp; LM35]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31408#536372 Viele DS18x20-Thermometer in einem Webserver]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/354441#3953900 Auswertung Temperatursensor KTY81 (PT1000), Arduino Uno, 1-6 Kanäle]&lt;br /&gt;
&lt;br /&gt;
===Oszilloskop===&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/53129#413011 Einfaches Oszilloskop - Bascom]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/48586#372093 Oszi- &amp;amp; Logikanalyser mit LCD]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31376#240880 einfaches DIGITAL- Oszilloskop (800 Datenpunkte) Assembler]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/56616#437772 Einfaches &amp;quot;Oszilloskop&amp;quot;]&lt;br /&gt;
* (C) [http://www.christoph-lauer.de/Homepage/Blog/Eintrage/2010/8/1_Embedded_C_based_Spectrumanalyzer.html ATXMega based Oscilloscope and Spectrumanalyzer]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/228997#2308320 Selbstbau Digital Storage Oszilloskop]&lt;br /&gt;
&lt;br /&gt;
===Beschleunigungssensor===&lt;br /&gt;
* (c++) [http://www.mikrocontroller.net/topic/268214 Einfache BMA020 Library, mit I2C]&lt;br /&gt;
&lt;br /&gt;
==MIDI==&lt;br /&gt;
&lt;br /&gt;
(Musical Instrument Digital Interface, Datenübertragungsstandard für Musikinstrumente)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48542#371695 Mr.MidiPlayer - Spielt alle MIDI-Dateien von einer SD-Karte] (siehe auch: [[Midi_Rekorder_mit_MMC/SD-Karte]])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25035#185861 MIDI-Rekorder mit SD/MMC und AVR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/106512# Drum-Trigger mit MIDI-Ausgabe]&lt;br /&gt;
&lt;br /&gt;
==MMC==&lt;br /&gt;
&lt;br /&gt;
(Multimedia Card, digitales Flash-Speichermedium)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25056#186117 SourceCode MMC die Zweite]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48481#370950 MMC/SD-Karte mit FAT16 an AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/67047#538510 MMC/SD Bootloader füt ATMega16]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/14800#102024 MMC/SD ansteuern mit AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25035#185861 MIDI-Rekorder mit SD/MMC und AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/FAT32 MMC/SD - FAT16/32 Bibliothek für AVR  mit Wiki]&lt;br /&gt;
&lt;br /&gt;
==Netzgeräte==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/60786#476904 Labornetzgerät]&lt;br /&gt;
* [[RADLAB-PS1]] [http://www.mikrocontroller.net/topic/124858#1138781 Netzteil um LM317 mit Strombegrenzung und Anzeige!]&lt;br /&gt;
&lt;br /&gt;
==Netzwerk==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/87517#new Kleiner ENC28J60 µWebserver von SimonK]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/82127#new Ulrich Radigs ENC28J60 mit leicht lötbaren/beschaffbaren Bauteilen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131825 Dirk Broßwick Webserver auf ENC28j60 Basis mit einem ATmega2561, es gibt auch einen Port auf das AVR-NET IO]&lt;br /&gt;
&lt;br /&gt;
==Parser==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/64763#517245 Zwei Parser für numerische Ausdrücke]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/76842#638283 uShell - ein universeller Parser für uCs]&lt;br /&gt;
&lt;br /&gt;
==RFID==&lt;br /&gt;
&lt;br /&gt;
(Radio Frequency Identification, Verfahren zur funkbasierten Identifizierung und Lokalisierung von Gegenständen)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/68442#552128 USB RFID Tag Leser]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/228709 Soft-RFID ohne RFID-IC]&lt;br /&gt;
&lt;br /&gt;
==RC - Fernsteuerungen/Servos==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48529#371582 RC Summen Signal erzeugen ]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/192453 RC Summen Signal dekodieren ]&lt;br /&gt;
&lt;br /&gt;
==RC5==&lt;br /&gt;
&lt;br /&gt;
(verbreitetes Datenübertragungsprotokoll für Infrarot-Fernbedienungen)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/14789#101536 RC5 Sender auf einem Attiny11L]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/74013#609097 RGB-Moodlight auf ATTiny2313 mit RC5-Fernbedienung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12216#80856 Fernbedien RC5 Empfänger]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/59235#460765 RC5 Sender selber bauen ???]&lt;br /&gt;
&lt;br /&gt;
==Ringpuffer==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/66789#536189 Ringpuffer AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/101472#882716 AVR-GCC: UART mit FIFO]&lt;br /&gt;
&lt;br /&gt;
==SD==&lt;br /&gt;
&lt;br /&gt;
(Secure Digital Memory Card; digitales Flash-Speichermedium)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48542#371695 Mr.MidiPlayer - Spielt alle MIDI-Dateien von einer SD-Karte] (siehe auch: [[Midi_Rekorder_mit_MMC/SD-Karte]])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25035#185861 MIDI-Rekorder mit SD/MMC und AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/68257#550336 Datenrekorder auf SD-Karte mit mega88]&lt;br /&gt;
&lt;br /&gt;
==Sonstiges==&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/111783#994358 Sonnenstandberechnung mit Atmega 8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/UAC_Mikrocontroller_ASCII_Console uAC Mikrocontroller ASCII Console]&lt;br /&gt;
&lt;br /&gt;
==Spaßprojekte==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/119876#1083044 Miniprojekt: Lagerfeuer-LED (ATtiny25)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/120289#1087905 Klingel mit 100 Melodien - last minute Weihnachtsgeschenk]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/145156#1346531 µCke Microcontroller Mücke (Atmel Tiny13)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/167528#1601077 Toastbrote zählen]&lt;br /&gt;
&lt;br /&gt;
==Spiele==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48505#371259 Tetris auf dem AtMega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/187253# Atmega8 Schachuhr mit Max7219 ]&lt;br /&gt;
&lt;br /&gt;
==Steuerungen==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/123551 Aquarium Controller]&lt;br /&gt;
* () [http://www.mikrocontroller.net/topic/309045 Lüftersteuerung durch zwei SHT75, mega32, LCD und SD-Karte]&lt;br /&gt;
* () [http://www.mikrocontroller.net/topic/307375 Fensteröffner mit Scheibenwischermotor dht11 sht11]&lt;br /&gt;
&lt;br /&gt;
==Taster / Schalter==&lt;br /&gt;
===mechanisch===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6492#41625 Tasten entprellen - Bulletproof] (siehe auch: [[Entprellung]])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48465#370877 Universelle Tastenabfrage]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/6491#41624 Tasten-Matrix entprellen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/64731#517001 Tastenmatrix auslesen über nur 2 Leitungen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/64743#517105 Tasten Entprellen für N00bs]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/77863#648213 Taster + LED am selben Draht (4*)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/1515#8455 Entprellen von Tastern, autorepeat, vintage]&lt;br /&gt;
&lt;br /&gt;
===kapazitiv===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/38904  Sensor mit nur einer Kontaktfläche]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25045 Einfache Sensortaste]&lt;br /&gt;
&lt;br /&gt;
==Tonerzeugung==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/66945#537624 ATMEGA8 Soundgenerator/Synthesizer]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/120289#1087905 Klingel mit 100 Melodien - last minute Weihnachtsgeschenk]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/134362 RTTTL Melodiegenerator mit ATTINY85]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/232702#new RTTTL Melodiegenerator mit ATMEGA8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25051 Melodie ausgeben mit AVR ATTiny12]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/145156#1346531 µCke Microcontroller Mücke (Atmel Tiny13)]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/137629#1259132 Melodieklingel BASCOM ATmega8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/191596 2Kanal Synthesizer ATtiny 2313, 85, ..]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/232845 17 Kanal Avr Synthesizer]&lt;br /&gt;
* (C) [[AVR-Synthesizer]]&lt;br /&gt;
&lt;br /&gt;
==TWI==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/87597#742070 AVR TWI Master und Slave Funtionen in C]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31404#242081 TWI / I2C einf. MASTER SLAVE Beispiel(Assembler) ATmega8]&lt;br /&gt;
&lt;br /&gt;
==USB==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/75254#622120 USB Host Stack für Eingebettete Systeme (LGPL)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/68442#552128 USB RFID Tag Leser]&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/92979#797957 AVR ATmega8TestBoard]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/90791#776280 Relaiskarte für den USB Port]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/130381#1179352 USB-Stick am Mikrocontroller VNC1L]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/155241 PDIUSBD12 Treiber und micro USB-Device stack]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/192453 HID-Joystick mit V-USB ]&lt;br /&gt;
&lt;br /&gt;
==UART==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/101472#882716 AVR-GCC: UART mit FIFO]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/38928#287985 Software UART]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/125651#1147436 Software UART mit FIFO]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/175946#1690682 uParse] - ein kompakter und vielseitiger Parser (Atmega32) für [[RS232]]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/159753#1517744 Einfacher Interpreter für Komandozeilen/Befehlszeilen] (Atmega32) für [[RS232]]&lt;br /&gt;
* (C) [https://sourceforge.net/projects/yambsiavr/ Modbus Slave Library] für [[RS232]] und [[RS485]]&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/53140#413249 AVR ASCII Video Terminal - 40 x 25 - BAS Signal]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/53139#413225 TV VIDEO BILD BAS Frequenzzähler DVM Atmega8 Assembler]&lt;br /&gt;
* (A) [http://www.electronicspit.com/video/ Videosignal in Farbe aus dem ATMega32] (URL nicht mehr erreichbar)&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25091#new VGA Testbildgenerator]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/101429#882288 ATmega8 erzeugt Video in C!]&lt;br /&gt;
&lt;br /&gt;
==Zeitgeber und Uhren==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/12185#80055 Die genaue Sekunde / RTC]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/74673#616226 LCD-Timer für Belichtungsgerät]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/119859#1082804 DS1307 Assembler-Code]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31374#240878 AVR Library für RTC 12C887 in C]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25136#187534 RTC DS1302 in C]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25087#186454 RTC + Scheduler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/53131#413059 Jumbo-LED Uhr]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/6516#41903 Zeit + Temperatur auf LCD mit AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25069 Sekunden in Zeit/Datum umwandeln (mit Sommerzeit/Schaltjahren)]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/48560#371911 BASCOM Uhr mit Butterfly]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48450#370765 Countdown timer für UV Belichter]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98885 Countdown Timer mit ATtiny2313]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12176#79672 Wartezeiten effektiv (Scheduler)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31408#536372 Schaltuhr mit DCF77-Referenz in einem Webserver, Steuerung von Funksteckdosen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/100892#876549 Eieruhr mit ATtiny24V/ATtiny2313V]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/151236 Zeitauslöser für Casio EX F1 mit Attiny2313]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/151260#1419218 DCF77 Uhr 7 Segment LED ATmega8 Assembler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/177688# NIXIE Uhr mit vielen Funktionen in C mit ATTiny2313]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/233699 Stoppuhr – Geschwindigkeit – Pulsweite mit Atmega88]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/275514 Timer bis 99:59 min - LED Display NSM4202, Drehgeber - At90S2313]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/289724 Uhr/Kalender AVR-Assemblerbaustein]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Codesammlung Übersicht]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR]]&lt;br /&gt;
[[Kategorie:Forum]]&lt;br /&gt;
[[Kategorie:Listen]]&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Softwarepool&amp;diff=102647</id>
		<title>AVR Softwarepool</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Softwarepool&amp;diff=102647"/>
		<updated>2020-12-01T18:03:35Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* I2C */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die interessantesten Softwareprojekte aus der Codesammlung...&lt;br /&gt;
&lt;br /&gt;
(A)   ... Projekt ist in &#039;&#039;&#039;Assembler&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(C)   ... Projekt ist in &#039;&#039;&#039;C&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(C++) ... Projekt ist in &#039;&#039;&#039;C++&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(B)   ... Projekt ist in &#039;&#039;&#039;Bascom&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(PC)  ... Projekt ist nicht für einen µC, sondern für den PC&lt;br /&gt;
&lt;br /&gt;
==1-Wire==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/14792  DS1820, DS18B20 in C]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6505 Mehrere DS1820/DS18B20 auslesen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31408#536372 Mehrere DS1820/DS18B20/DS18S20/DS1822 über einen Webserver auslesbar]&lt;br /&gt;
* (C) [https://www.mikrocontroller.net/topic/387139#4890827 Bibliothek für OneWire und DS18x20]&lt;br /&gt;
&lt;br /&gt;
==Akkulader==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/72627#594587 Bleiakku-Lader 12/24V]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
&lt;br /&gt;
==Betriebssysteme und Scheduler==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/190388#1856376 Nano OS] von Tobias W. ([http://sourceforge.net/projects/nanoos/ Sourceforge])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12176#79672 Wartezeiten effektiv (Scheduler)] von Peter Dannegger&lt;br /&gt;
* (C++) [http://www.mikrocontroller.net/topic/96977#837989 Einfacher Scheduler und Timer in C++ für ATMega] von S. Seegel&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/74026#609246 GOS: einfacher preemptive multitasking scheduler] von Günter Greschenz&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/articles/Monitorprogramm_Bamo128 Bamo128] Monitorprogramm und Bootloader&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/319580#new AvRtos] preemtiver real time multitasking scheduler von Harald B. ([http://sourceforge.net/projects/avrtos/ Sourceforge])&lt;br /&gt;
* (C) [https://bitbucket.org/dferreyra/avr-threads/wiki/Home avr-threads] Thread-Library für AVR&lt;br /&gt;
&lt;br /&gt;
==Bootloader==&lt;br /&gt;
* (A,C,PC) [http://www.mikrocontroller.net/topic/12181#79866 AVR Bootloader]&lt;br /&gt;
* (A, PC) [http://www.mikrocontroller.net/topic/146638#1364260 AVR Bootloader für GCC-Toolchain]&lt;br /&gt;
* (A,PC) [http://www.mikrocontroller.net/topic/95839 AVR Bootloader mit Verschlüsselung]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/72308#591159 ATtiny45 Bootloader]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/67047#538510 MMC/SD Bootloader für ATMega16]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/56818#439359 SD/MMC Card Bootloader (passt in 2kb bootsection)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/61170#480765 boofa - Bootloader für AVR über UART (AVR109)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/53130#413058 Bootloader ATmega168]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/73196#600293 UART Bootloader ATtiny13 - ATmega644]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/150816#1414460 UART Bootloader AtMega644P @ 20MHz] (Eclipse Projekt)&lt;br /&gt;
* (C) [[AVR Bootloader in C - eine einfache Anleitung]]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/200645#1971295 LAN-Bootloader für ATmega1284p]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/articles/Monitorprogramm_Bamo128 Bamo128] Monitorprogramm und Bootloader&lt;br /&gt;
Siehe auch: [[Bootloader]]&lt;br /&gt;
&lt;br /&gt;
==DCC==&lt;br /&gt;
&lt;br /&gt;
(Digital Command Control, Standard zur digitalen Steuerung von Modelleisenbahnen)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31397#241300 DCC Decoder]&lt;br /&gt;
&lt;br /&gt;
==DCF77==&lt;br /&gt;
&lt;br /&gt;
(Zeitsignaldienst für funkgesteuerte Uhren auf der Langwellen-Frequenz 77,5 kHz)&lt;br /&gt;
 &lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/38914#287867 DCF77 AVR-Assemblerbaustein ]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6500#41738 DCF77-Uhr mit ATTINY12]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31385#241104 DCF Digital Empfangsmodul - Korrelation - (Assembler)ATmega8 ]&lt;br /&gt;
* (C) [http://pic-projekte.de/wordpress/?p=572 DCF77 PIC-Projekte.de]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25071#186286 DCF 77 ]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/14788#101528 DCF-Uhr mit DotMatrix-Anzeige für avr-gcc]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12154#79501 PC DCF Timer ( PC Zeitschaltuhr)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25116#187197 DCF 77 Uhr mit CodeVision ]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/58769#456232 DCF77 Uhr in C mit ATtiny26]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48597#372164 DCF77 Uhr, zum X.ten Mal, jetzt mit SAF]&lt;br /&gt;
* (C,A) [http://www.mikrocontroller.net/topic/31408#536372 DCF77 mit beliebig gepoltem Eingangssignal innerhalb eines Webservers]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/121049 DCF-Uhr, Sonnenstand, TWI-Port, Alarmfunktion für Atmega8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/151260#1419218 DCF77 Uhr 7 Segment LED ATmega8 Assembler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/168807#1614129 DCF-Uhr mit LCD in C]&lt;br /&gt;
&lt;br /&gt;
== DRAM ==&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/25053#186085 2MB DRAM an AVR] und Anwendung als [http://www.mikrocontroller.net/topic/25053#186089 Audiorekorder]&lt;br /&gt;
* (A,C) [https://www.mikrocontroller.net/topic/236862 Grafikfähiger LCD Controller für 320x240 LCD mit D-RAM]&lt;br /&gt;
&lt;br /&gt;
==Drehgeber==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/6526#41978 Drehgeber auslesen]&lt;br /&gt;
* (C+A) [http://www.mikrocontroller.net/topic/302229#new 4-fach Auswertung für Dreh-/Inkrementalgeber, schnell]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/328348#new Schrittmotor als Drehgeber mit Drehdynamik]&lt;br /&gt;
* (A) [https://www.mikrocontroller.net/topic/478343?goto=5925396#5922395]&lt;br /&gt;
&lt;br /&gt;
==DTMF==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/92444#792954 DTMF dekodieren]&lt;br /&gt;
&lt;br /&gt;
==DMX==&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/92350#new 20 Kanal Relaissteuerung per DMX]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/276885#new DMX512 zu RGB Led Controller use HSV Farbraum]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/290366#3096821 20 Kanal PWM per DMX]&lt;br /&gt;
&lt;br /&gt;
==Ethernet==&lt;br /&gt;
Siehe auch [[AVR Softwarepool#Netzwerk|Netzwerk]]&lt;br /&gt;
&lt;br /&gt;
==Entwicklungssysteme==&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/74198#611404 AVR Code Wizard]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/30110#230503 Multitasking kernel für ATtinys in ASM]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/65156#521012 BASIC-Computer mit ATmega32]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/64129#511368 AVR TinyBASIC Anpassung für ATmega8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/59189#460273 Mini-Computer mit BASIC]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/55807 Forth System für ATmegas in Assembler]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/94193 Forth-Computer mit ATmega32 und Videoausgabe] von Christian Berger&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/62500#493931 Fixpoint-Arithmetik in &amp;quot;C&amp;quot;]&lt;br /&gt;
* (C++) [http://www.mikrocontroller.net/topic/143537 Fixpoint-Arithmetik in &amp;quot;C++&amp;quot;]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/85256#717037 64 Bit float Emulator in C, IEEE754 kompatibel]&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/92979#797957 AVR ATmega8TestBoard]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/94468#812992 Gleitkomma-Bibliothek für AVR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/177481?page=1 AVR CP/M System]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/187390 EMACS Konfiguration]&lt;br /&gt;
* (C) [https://www.mikrocontroller.net/topic/467307 Watchdog-ISR für ATmega328]&lt;br /&gt;
&lt;br /&gt;
==FFT==&lt;br /&gt;
&lt;br /&gt;
(Fast Fourier Transformation, &amp;quot;schnelle&amp;quot; Fouriertransformation)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25095#186536 FFT auf dem AVR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25062#186225 128point FFT in ASM]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/27001#203911 Schnelle FFT in Assembler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131525#1191497 AVR-Lichtorgel per FFT MEGA8 32 644 ]&lt;br /&gt;
&lt;br /&gt;
==Funksteckdosen==&lt;br /&gt;
* (C,A) [http://www.mikrocontroller.net/topic/31408#536372 Ansteuerung von Funksteckdosen mit einem Webserver]&lt;br /&gt;
&lt;br /&gt;
==GPS==&lt;br /&gt;
&lt;br /&gt;
(Global Positioning System, satellitengestütztes System zur weltweiten Positions- und Zeitbestimmung)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/48544#371717 GPS - MOUSE - MINI- NAVIGATOR (Assembler) ATmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/72507#593252 GPS an mega8,88 oder 168]&lt;br /&gt;
&lt;br /&gt;
==IR==&lt;br /&gt;
* siehe auch [[AVR Softwarepool#RC5|RC5]]&lt;br /&gt;
* (C) [[IRMP]] - Infrared Multi Protocol Decoder:&lt;br /&gt;
**[[IRMP| Wiki Seite]]&lt;br /&gt;
**[http://www.mikrocontroller.net/topic/162119#1545798 Thread im Forum]&lt;br /&gt;
&lt;br /&gt;
==Kryptographie==&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/73468 Verschiedene kryptographische Funktionen] &lt;br /&gt;
&lt;br /&gt;
==LANC==&lt;br /&gt;
&lt;br /&gt;
(Steuerprotokoll für Video- und Digitalfotokameras, auch als Control-L bekannt)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/40463#302754 Sony LANC Auswertung mit AVR] (Atmega 128 @ 16 MHz)&lt;br /&gt;
&lt;br /&gt;
==LEDs und LED-Anzeigen==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/76839#638278 Solarlicht Steuerung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/77863#648213 Taster + LED am selben Draht (4*)]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/73776#606472 LED-Touch-Panel] (ARM)&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/74013#609097 RGB-Moodlight auf ATTiny2313 mit RC5-Fernbedienung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/54561#421940 HSV RGB Led Dimmer, C Code &amp;amp; Video &amp;amp; Doku]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/67567#543492 Mini RGB Lichteffektgenerator mit Menü für Pic16F84]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48464#370871 Ansteuerung einer RGB LED (PWM)]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/87149#737282 3x7 Segment und 1 I/O-Pin (Assembler)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31370#240843 ADC mit Multiplexanzeige] (vier 7-Segmentanzeigen)&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31388#241192 AVR-Lauflicht]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/94746#815809 HSB-&amp;gt;RGB Umrechnung rein in Assembler, auch für ATiny]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/110168 2x7-Segment an nur 3 Leitungen]&lt;br /&gt;
* (A) [[Ambilight in Hardware]]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/145156#1346531 µCke Microcontroller Mücke (Atmel Tiny13)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131525#1191497 AVR-Lichtorgel per FFT MEGA8 32 644 ]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/182305 TLC5940 16-Kanal 12bit LED Treiber ansteuern und HighPower LEDs über MosFETs treiben]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/185730 7Segment Coder]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/244768 RGB-Moodlight, ATMega8, Soft-PWM mit Gammakorrektur, IR-Fernbedienung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/275426 serielles 4x7 Segment Display NSM4202]&lt;br /&gt;
&lt;br /&gt;
==LCD und VFD==&lt;br /&gt;
* (C) [http://bluematrixi.bl.funpic.de/index.php/elektronik-avr/lcd-display-nokia3310 Bibliothek für Nokia 3310 Lcd Ansteuerung in &amp;quot;C&amp;quot; - sehr gut]&lt;br /&gt;
*(C,A)[http://www.mikrocontroller.net/articles/Ansteuerung_Handy_Displays Ansteuerung_Handy_Displays]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/53137#413137 Programm zum Erstellen eigener Schriftarten (LCD)]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/54860#423255 LCD Schriftarten ( Fonts in veschiedenen Größen )]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31403  The Siemens S65 132x176, 65536 color display with AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48501#371218 LCD Ansteuerung im 4bit-Modus]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48456#370782 LCD Library T6963c]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/76399#633680 &amp;quot;Bessere&amp;quot; T6963c Library]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25099#186569 LCD Controller für 640x480 LCD mit mega8515]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/38923#287939 LCD Controller KS0073 Support im 4-Bit Mode]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/79609#664268 KS0066U oder Ähnliche --- LCD Treiber]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/81793#683135 Pollin E0855-2 SED1530-Treiber]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/90449#772843 LCD über nur einen IO-Pin ansteuern]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/120475 VFD Library (Vacuum Fluorescent Display Library)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98321#851423 Grafikfähiger LCD Controller für 320x240 LCD mit 4 Graustufen] (jetzt auch mit 8 Graustufen)&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/140369 Menüsystem für beliebige schwarz-weiß LCDs bis 4096x4096 Pixeln und grafischem Editor]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/194149 Schnelle SED1520 Funktionsbibliothek mit Bildkonverter und Fontgenerator]&lt;br /&gt;
* (PC,C) [http://www.mikrocontroller.net/topic/234304 DOGXL Fontgenerator (SW+Graustufen)]&lt;br /&gt;
* (C,A) [http://www.mikrocontroller.net/topic/236862#2401250 Grafikfähiger LCD Controller für 320x240 LCD mit D-RAM]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/190078 LCD SHARP M078CKA mit LH155]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/287978 EA DOGM162 Textdisplay an SPI]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/305266 HD44780 Display 2x16 Xmega-Assemblerbaustein]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/320791#3524261 Nokia N95 Display 320x240 Arduino Lib.]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/318818#3456758 Library für ST7735 Display Controller mit GLCD Font Unterstützung]&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98923#857451 Ultraschall Entfernungsmesser mit I2C, Eigenbau]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/83871#new  I2C-Master realisiert in Software, ohne TWI für alle ATMEGAs]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/38919#new  RS232 &amp;lt;-&amp;gt; TWI / I2C Interface für ATMega8 (ASM) inkl. Windows Software]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/67698#544930 USI TWI Master]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/235733#2388116 Hardware TWI-MASTER Interrupt basierend für Mega AVR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/272621#new I2C/TWI Master-Interrupt Xmega-Assemblerbaustein]&lt;br /&gt;
* (C) [https://www.mikrocontroller.net/topic/378553 hot-plug fähige Library für DS1621 Temperatursensoren ]&lt;br /&gt;
* (A) [https://www.mikrocontroller.net/topic/506739#new TWI im polling für AVR 0-Series und AVR 1-Series]&lt;br /&gt;
&lt;br /&gt;
==Messgeräte==&lt;br /&gt;
===Drehzahlmesser===&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/1518#8469 Drehzahlmesser 4 mal 7-Segment mit 90S2313]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/Drehzahlmesser Drehzahlmesser mit 4 mal 7-Segment anzeigen mit Tiny2313, Wiki-Artikel]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/231283 einfache Drehzahlmessung mit ATmega88]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/232485 4-Kanal Drehzahlmessung mit ATmega88]&lt;br /&gt;
&lt;br /&gt;
===Klopfsensormessgerät===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/Klopfsensormessgeraet Messgerät für Klopfgeräusche an Verbrennungsmotoren auf Basis des TPIC8101]&lt;br /&gt;
&lt;br /&gt;
===Entfernungsmesser===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98923#857451 Ultraschall Entfernungsmesser mit I2C, Eigenbau]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/130834 3D Umgebungserfassung mit einem auf zwei Servors montiertem Sharp Distanzsensor, Eigenbau]&lt;br /&gt;
&lt;br /&gt;
===Frequenzmesser===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/62610#495030 Frequenzmesser bis 2Mhz -- mit AVR ATmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48582#372072 Frequenzmessung (Seite mit Quellcode nicht erreichbar)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/62517#494146 Input Capture Pin (ICP) auslesen ( Frequenz messen)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25144#187587 Frequenzmessung und Impulszählung über den Parallelport-IR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31394#241251 einfacher 5 MHz Frequenzzähler (Assembler) ATmega8]&lt;br /&gt;
* (A+C) [http://www.mikrocontroller.net/topic/69021#558098 Multimeter]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/173665#new sehr genauer Frequenzmesser Atmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/186801#new  Reziproker Frequenzzähler+ Optimierte 64bit uint Routinen]&lt;br /&gt;
* (C+A) [http://www.mikrocontroller.net/topic/200279#new 6 Stellen von 1Hz bis 40MHz ATmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/241150#2458079 Reziproker Frequenzzähler, GPS-stabilisiert, ATmega162]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/359552#new Reziproker Frequenzzähler mit BASCOM-AVR]&lt;br /&gt;
&lt;br /&gt;
===Frequenzgenerator===&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/152966#1438488 Einstellbarer Frequenzgenerator für 0.12 Hz - 8 MHz mit Atmega 8 und Bascom ]&lt;br /&gt;
&lt;br /&gt;
===Kompass===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/100239#870281 KOMPASS KMZ10A KMZ10B ATmega8 Assembler]&lt;br /&gt;
&lt;br /&gt;
===Messgeräte für elektronische Bauteile===&lt;br /&gt;
* (A+C) [http://www.mikrocontroller.net/topic/69021#558098 Multimeter]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/60797#477026 LC-METER / LC-Messgerät ATmega8 Assembler]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/60591#474873 Widerstandstester]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/56770#438957 Ladungsmessgerät]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31386#241139 Transistortester]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131804#1194273 Transistortester]&lt;br /&gt;
&lt;br /&gt;
===Spannungsmesser===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31370#240843 ADC mit Multiplexanzeige] - Voltmeter&lt;br /&gt;
* (A+C) [http://www.mikrocontroller.net/topic/69021#558098 Multimeter]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31389 Wirkleistungsmessgerät] - &amp;quot;Ein einfaches Wirkleistungsmessgerät für 230V Verbraucher ohne Netztrennung mit 3 stelliger 7-Segment Anzeige für Verbraucher bis 500W.&amp;quot; (+ ähnlicher Aufbau mit Silabs Controller)&lt;br /&gt;
&lt;br /&gt;
===Thermometer===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6516#41903 Zeit + Temperatur auf LCD mit AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/53127#413006 Thermometer mit LED &amp;amp; LM35]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31408#536372 Viele DS18x20-Thermometer in einem Webserver]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/354441#3953900 Auswertung Temperatursensor KTY81 (PT1000), Arduino Uno, 1-6 Kanäle]&lt;br /&gt;
&lt;br /&gt;
===Oszilloskop===&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/53129#413011 Einfaches Oszilloskop - Bascom]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/48586#372093 Oszi- &amp;amp; Logikanalyser mit LCD]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31376#240880 einfaches DIGITAL- Oszilloskop (800 Datenpunkte) Assembler]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/56616#437772 Einfaches &amp;quot;Oszilloskop&amp;quot;]&lt;br /&gt;
* (C) [http://www.christoph-lauer.de/Homepage/Blog/Eintrage/2010/8/1_Embedded_C_based_Spectrumanalyzer.html ATXMega based Oscilloscope and Spectrumanalyzer]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/228997#2308320 Selbstbau Digital Storage Oszilloskop]&lt;br /&gt;
&lt;br /&gt;
===Beschleunigungssensor===&lt;br /&gt;
* (c++) [http://www.mikrocontroller.net/topic/268214 Einfache BMA020 Library, mit I2C]&lt;br /&gt;
&lt;br /&gt;
==MIDI==&lt;br /&gt;
&lt;br /&gt;
(Musical Instrument Digital Interface, Datenübertragungsstandard für Musikinstrumente)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48542#371695 Mr.MidiPlayer - Spielt alle MIDI-Dateien von einer SD-Karte] (siehe auch: [[Midi_Rekorder_mit_MMC/SD-Karte]])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25035#185861 MIDI-Rekorder mit SD/MMC und AVR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/106512# Drum-Trigger mit MIDI-Ausgabe]&lt;br /&gt;
&lt;br /&gt;
==MMC==&lt;br /&gt;
&lt;br /&gt;
(Multimedia Card, digitales Flash-Speichermedium)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25056#186117 SourceCode MMC die Zweite]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48481#370950 MMC/SD-Karte mit FAT16 an AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/67047#538510 MMC/SD Bootloader füt ATMega16]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/14800#102024 MMC/SD ansteuern mit AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25035#185861 MIDI-Rekorder mit SD/MMC und AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/FAT32 MMC/SD - FAT16/32 Bibliothek für AVR  mit Wiki]&lt;br /&gt;
&lt;br /&gt;
==Netzgeräte==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/60786#476904 Labornetzgerät]&lt;br /&gt;
* [[RADLAB-PS1]] [http://www.mikrocontroller.net/topic/124858#1138781 Netzteil um LM317 mit Strombegrenzung und Anzeige!]&lt;br /&gt;
&lt;br /&gt;
==Netzwerk==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/87517#new Kleiner ENC28J60 µWebserver von SimonK]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/82127#new Ulrich Radigs ENC28J60 mit leicht lötbaren/beschaffbaren Bauteilen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131825 Dirk Broßwick Webserver auf ENC28j60 Basis mit einem ATmega2561, es gibt auch einen Port auf das AVR-NET IO]&lt;br /&gt;
&lt;br /&gt;
==Parser==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/64763#517245 Zwei Parser für numerische Ausdrücke]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/76842#638283 uShell - ein universeller Parser für uCs]&lt;br /&gt;
&lt;br /&gt;
==RFID==&lt;br /&gt;
&lt;br /&gt;
(Radio Frequency Identification, Verfahren zur funkbasierten Identifizierung und Lokalisierung von Gegenständen)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/68442#552128 USB RFID Tag Leser]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/228709 Soft-RFID ohne RFID-IC]&lt;br /&gt;
&lt;br /&gt;
==RC - Fernsteuerungen/Servos==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48529#371582 RC Summen Signal erzeugen ]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/192453 RC Summen Signal dekodieren ]&lt;br /&gt;
&lt;br /&gt;
==RC5==&lt;br /&gt;
&lt;br /&gt;
(verbreitetes Datenübertragungsprotokoll für Infrarot-Fernbedienungen)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/14789#101536 RC5 Sender auf einem Attiny11L]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/74013#609097 RGB-Moodlight auf ATTiny2313 mit RC5-Fernbedienung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12216#80856 Fernbedien RC5 Empfänger]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/59235#460765 RC5 Sender selber bauen ???]&lt;br /&gt;
&lt;br /&gt;
==Ringpuffer==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/66789#536189 Ringpuffer AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/101472#882716 AVR-GCC: UART mit FIFO]&lt;br /&gt;
&lt;br /&gt;
==SD==&lt;br /&gt;
&lt;br /&gt;
(Secure Digital Memory Card; digitales Flash-Speichermedium)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48542#371695 Mr.MidiPlayer - Spielt alle MIDI-Dateien von einer SD-Karte] (siehe auch: [[Midi_Rekorder_mit_MMC/SD-Karte]])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25035#185861 MIDI-Rekorder mit SD/MMC und AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/68257#550336 Datenrekorder auf SD-Karte mit mega88]&lt;br /&gt;
&lt;br /&gt;
==Sonstiges==&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/111783#994358 Sonnenstandberechnung mit Atmega 8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/UAC_Mikrocontroller_ASCII_Console uAC Mikrocontroller ASCII Console]&lt;br /&gt;
&lt;br /&gt;
==Spaßprojekte==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/119876#1083044 Miniprojekt: Lagerfeuer-LED (ATtiny25)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/120289#1087905 Klingel mit 100 Melodien - last minute Weihnachtsgeschenk]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/145156#1346531 µCke Microcontroller Mücke (Atmel Tiny13)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/167528#1601077 Toastbrote zählen]&lt;br /&gt;
&lt;br /&gt;
==Spiele==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48505#371259 Tetris auf dem AtMega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/187253# Atmega8 Schachuhr mit Max7219 ]&lt;br /&gt;
&lt;br /&gt;
==Steuerungen==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/123551 Aquarium Controller]&lt;br /&gt;
* () [http://www.mikrocontroller.net/topic/309045 Lüftersteuerung durch zwei SHT75, mega32, LCD und SD-Karte]&lt;br /&gt;
* () [http://www.mikrocontroller.net/topic/307375 Fensteröffner mit Scheibenwischermotor dht11 sht11]&lt;br /&gt;
&lt;br /&gt;
==Taster / Schalter==&lt;br /&gt;
===mechanisch===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6492#41625 Tasten entprellen - Bulletproof] (siehe auch: [[Entprellung]])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48465#370877 Universelle Tastenabfrage]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/6491#41624 Tasten-Matrix entprellen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/64731#517001 Tastenmatrix auslesen über nur 2 Leitungen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/64743#517105 Tasten Entprellen für N00bs]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/77863#648213 Taster + LED am selben Draht (4*)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/1515#8455 Entprellen von Tastern, autorepeat, vintage]&lt;br /&gt;
&lt;br /&gt;
===kapazitiv===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/38904  Sensor mit nur einer Kontaktfläche]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25045 Einfache Sensortaste]&lt;br /&gt;
&lt;br /&gt;
==Tonerzeugung==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/66945#537624 ATMEGA8 Soundgenerator/Synthesizer]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/120289#1087905 Klingel mit 100 Melodien - last minute Weihnachtsgeschenk]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/134362 RTTTL Melodiegenerator mit ATTINY85]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/232702#new RTTTL Melodiegenerator mit ATMEGA8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25051 Melodie ausgeben mit AVR ATTiny12]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/145156#1346531 µCke Microcontroller Mücke (Atmel Tiny13)]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/137629#1259132 Melodieklingel BASCOM ATmega8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/191596 2Kanal Synthesizer ATtiny 2313, 85, ..]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/232845 17 Kanal Avr Synthesizer]&lt;br /&gt;
* (C) [[AVR-Synthesizer]]&lt;br /&gt;
&lt;br /&gt;
==TWI==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/87597#742070 AVR TWI Master und Slave Funtionen in C]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31404#242081 TWI / I2C einf. MASTER SLAVE Beispiel(Assembler) ATmega8]&lt;br /&gt;
&lt;br /&gt;
==USB==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/75254#622120 USB Host Stack für Eingebettete Systeme (LGPL)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/68442#552128 USB RFID Tag Leser]&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/92979#797957 AVR ATmega8TestBoard]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/90791#776280 Relaiskarte für den USB Port]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/130381#1179352 USB-Stick am Mikrocontroller VNC1L]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/155241 PDIUSBD12 Treiber und micro USB-Device stack]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/192453 HID-Joystick mit V-USB ]&lt;br /&gt;
&lt;br /&gt;
==UART==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/101472#882716 AVR-GCC: UART mit FIFO]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/38928#287985 Software UART]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/125651#1147436 Software UART mit FIFO]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/175946#1690682 uParse] - ein kompakter und vielseitiger Parser (Atmega32) für [[RS232]]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/159753#1517744 Einfacher Interpreter für Komandozeilen/Befehlszeilen] (Atmega32) für [[RS232]]&lt;br /&gt;
* (C) [https://sourceforge.net/projects/yambsiavr/ Modbus Slave Library] für [[RS232]] und [[RS485]]&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/53140#413249 AVR ASCII Video Terminal - 40 x 25 - BAS Signal]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/53139#413225 TV VIDEO BILD BAS Frequenzzähler DVM Atmega8 Assembler]&lt;br /&gt;
* (A) [http://www.electronicspit.com/video/ Videosignal in Farbe aus dem ATMega32] (URL nicht mehr erreichbar)&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25091#new VGA Testbildgenerator]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/101429#882288 ATmega8 erzeugt Video in C!]&lt;br /&gt;
&lt;br /&gt;
==Zeitgeber und Uhren==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/12185#80055 Die genaue Sekunde / RTC]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/74673#616226 LCD-Timer für Belichtungsgerät]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/119859#1082804 DS1307 Assembler-Code]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31374#240878 AVR Library für RTC 12C887 in C]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25136#187534 RTC DS1302 in C]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25087#186454 RTC + Scheduler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/53131#413059 Jumbo-LED Uhr]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/6516#41903 Zeit + Temperatur auf LCD mit AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25069 Sekunden in Zeit/Datum umwandeln (mit Sommerzeit/Schaltjahren)]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/48560#371911 BASCOM Uhr mit Butterfly]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48450#370765 Countdown timer für UV Belichter]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98885 Countdown Timer mit ATtiny2313]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12176#79672 Wartezeiten effektiv (Scheduler)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31408#536372 Schaltuhr mit DCF77-Referenz in einem Webserver, Steuerung von Funksteckdosen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/100892#876549 Eieruhr mit ATtiny24V/ATtiny2313V]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/151236 Zeitauslöser für Casio EX F1 mit Attiny2313]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/151260#1419218 DCF77 Uhr 7 Segment LED ATmega8 Assembler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/177688# NIXIE Uhr mit vielen Funktionen in C mit ATTiny2313]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/233699 Stoppuhr – Geschwindigkeit – Pulsweite mit Atmega88]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/275514 Timer bis 99:59 min - LED Display NSM4202, Drehgeber - At90S2313]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/289724 Uhr/Kalender AVR-Assemblerbaustein]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Codesammlung Übersicht]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR]]&lt;br /&gt;
[[Kategorie:Forum]]&lt;br /&gt;
[[Kategorie:Listen]]&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Softwarepool&amp;diff=102646</id>
		<title>AVR Softwarepool</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Softwarepool&amp;diff=102646"/>
		<updated>2020-12-01T18:00:34Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* DRAM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Die interessantesten Softwareprojekte aus der Codesammlung...&lt;br /&gt;
&lt;br /&gt;
(A)   ... Projekt ist in &#039;&#039;&#039;Assembler&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(C)   ... Projekt ist in &#039;&#039;&#039;C&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(C++) ... Projekt ist in &#039;&#039;&#039;C++&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(B)   ... Projekt ist in &#039;&#039;&#039;Bascom&#039;&#039;&#039;&amp;lt;br&amp;gt;&lt;br /&gt;
(PC)  ... Projekt ist nicht für einen µC, sondern für den PC&lt;br /&gt;
&lt;br /&gt;
==1-Wire==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/14792  DS1820, DS18B20 in C]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6505 Mehrere DS1820/DS18B20 auslesen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31408#536372 Mehrere DS1820/DS18B20/DS18S20/DS1822 über einen Webserver auslesbar]&lt;br /&gt;
* (C) [https://www.mikrocontroller.net/topic/387139#4890827 Bibliothek für OneWire und DS18x20]&lt;br /&gt;
&lt;br /&gt;
==Akkulader==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/72627#594587 Bleiakku-Lader 12/24V]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
&lt;br /&gt;
==Betriebssysteme und Scheduler==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/190388#1856376 Nano OS] von Tobias W. ([http://sourceforge.net/projects/nanoos/ Sourceforge])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12176#79672 Wartezeiten effektiv (Scheduler)] von Peter Dannegger&lt;br /&gt;
* (C++) [http://www.mikrocontroller.net/topic/96977#837989 Einfacher Scheduler und Timer in C++ für ATMega] von S. Seegel&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/74026#609246 GOS: einfacher preemptive multitasking scheduler] von Günter Greschenz&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/articles/Monitorprogramm_Bamo128 Bamo128] Monitorprogramm und Bootloader&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/319580#new AvRtos] preemtiver real time multitasking scheduler von Harald B. ([http://sourceforge.net/projects/avrtos/ Sourceforge])&lt;br /&gt;
* (C) [https://bitbucket.org/dferreyra/avr-threads/wiki/Home avr-threads] Thread-Library für AVR&lt;br /&gt;
&lt;br /&gt;
==Bootloader==&lt;br /&gt;
* (A,C,PC) [http://www.mikrocontroller.net/topic/12181#79866 AVR Bootloader]&lt;br /&gt;
* (A, PC) [http://www.mikrocontroller.net/topic/146638#1364260 AVR Bootloader für GCC-Toolchain]&lt;br /&gt;
* (A,PC) [http://www.mikrocontroller.net/topic/95839 AVR Bootloader mit Verschlüsselung]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/72308#591159 ATtiny45 Bootloader]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/67047#538510 MMC/SD Bootloader für ATMega16]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/56818#439359 SD/MMC Card Bootloader (passt in 2kb bootsection)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/61170#480765 boofa - Bootloader für AVR über UART (AVR109)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/53130#413058 Bootloader ATmega168]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/73196#600293 UART Bootloader ATtiny13 - ATmega644]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/150816#1414460 UART Bootloader AtMega644P @ 20MHz] (Eclipse Projekt)&lt;br /&gt;
* (C) [[AVR Bootloader in C - eine einfache Anleitung]]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/200645#1971295 LAN-Bootloader für ATmega1284p]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/articles/Monitorprogramm_Bamo128 Bamo128] Monitorprogramm und Bootloader&lt;br /&gt;
Siehe auch: [[Bootloader]]&lt;br /&gt;
&lt;br /&gt;
==DCC==&lt;br /&gt;
&lt;br /&gt;
(Digital Command Control, Standard zur digitalen Steuerung von Modelleisenbahnen)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31397#241300 DCC Decoder]&lt;br /&gt;
&lt;br /&gt;
==DCF77==&lt;br /&gt;
&lt;br /&gt;
(Zeitsignaldienst für funkgesteuerte Uhren auf der Langwellen-Frequenz 77,5 kHz)&lt;br /&gt;
 &lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/38914#287867 DCF77 AVR-Assemblerbaustein ]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6500#41738 DCF77-Uhr mit ATTINY12]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31385#241104 DCF Digital Empfangsmodul - Korrelation - (Assembler)ATmega8 ]&lt;br /&gt;
* (C) [http://pic-projekte.de/wordpress/?p=572 DCF77 PIC-Projekte.de]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25071#186286 DCF 77 ]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/14788#101528 DCF-Uhr mit DotMatrix-Anzeige für avr-gcc]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12154#79501 PC DCF Timer ( PC Zeitschaltuhr)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25116#187197 DCF 77 Uhr mit CodeVision ]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/58769#456232 DCF77 Uhr in C mit ATtiny26]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48597#372164 DCF77 Uhr, zum X.ten Mal, jetzt mit SAF]&lt;br /&gt;
* (C,A) [http://www.mikrocontroller.net/topic/31408#536372 DCF77 mit beliebig gepoltem Eingangssignal innerhalb eines Webservers]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/121049 DCF-Uhr, Sonnenstand, TWI-Port, Alarmfunktion für Atmega8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/151260#1419218 DCF77 Uhr 7 Segment LED ATmega8 Assembler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/168807#1614129 DCF-Uhr mit LCD in C]&lt;br /&gt;
&lt;br /&gt;
== DRAM ==&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/25053#186085 2MB DRAM an AVR] und Anwendung als [http://www.mikrocontroller.net/topic/25053#186089 Audiorekorder]&lt;br /&gt;
* (A,C) [https://www.mikrocontroller.net/topic/236862 Grafikfähiger LCD Controller für 320x240 LCD mit D-RAM]&lt;br /&gt;
&lt;br /&gt;
==Drehgeber==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/6526#41978 Drehgeber auslesen]&lt;br /&gt;
* (C+A) [http://www.mikrocontroller.net/topic/302229#new 4-fach Auswertung für Dreh-/Inkrementalgeber, schnell]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/328348#new Schrittmotor als Drehgeber mit Drehdynamik]&lt;br /&gt;
* (A) [https://www.mikrocontroller.net/topic/478343?goto=5925396#5922395]&lt;br /&gt;
&lt;br /&gt;
==DTMF==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/92444#792954 DTMF dekodieren]&lt;br /&gt;
&lt;br /&gt;
==DMX==&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/92350#new 20 Kanal Relaissteuerung per DMX]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/276885#new DMX512 zu RGB Led Controller use HSV Farbraum]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/290366#3096821 20 Kanal PWM per DMX]&lt;br /&gt;
&lt;br /&gt;
==Ethernet==&lt;br /&gt;
Siehe auch [[AVR Softwarepool#Netzwerk|Netzwerk]]&lt;br /&gt;
&lt;br /&gt;
==Entwicklungssysteme==&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/74198#611404 AVR Code Wizard]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/30110#230503 Multitasking kernel für ATtinys in ASM]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/65156#521012 BASIC-Computer mit ATmega32]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/64129#511368 AVR TinyBASIC Anpassung für ATmega8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/59189#460273 Mini-Computer mit BASIC]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/55807 Forth System für ATmegas in Assembler]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/94193 Forth-Computer mit ATmega32 und Videoausgabe] von Christian Berger&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/62500#493931 Fixpoint-Arithmetik in &amp;quot;C&amp;quot;]&lt;br /&gt;
* (C++) [http://www.mikrocontroller.net/topic/143537 Fixpoint-Arithmetik in &amp;quot;C++&amp;quot;]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/85256#717037 64 Bit float Emulator in C, IEEE754 kompatibel]&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/92979#797957 AVR ATmega8TestBoard]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/94468#812992 Gleitkomma-Bibliothek für AVR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/177481?page=1 AVR CP/M System]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/187390 EMACS Konfiguration]&lt;br /&gt;
* (C) [https://www.mikrocontroller.net/topic/467307 Watchdog-ISR für ATmega328]&lt;br /&gt;
&lt;br /&gt;
==FFT==&lt;br /&gt;
&lt;br /&gt;
(Fast Fourier Transformation, &amp;quot;schnelle&amp;quot; Fouriertransformation)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25095#186536 FFT auf dem AVR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25062#186225 128point FFT in ASM]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/27001#203911 Schnelle FFT in Assembler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131525#1191497 AVR-Lichtorgel per FFT MEGA8 32 644 ]&lt;br /&gt;
&lt;br /&gt;
==Funksteckdosen==&lt;br /&gt;
* (C,A) [http://www.mikrocontroller.net/topic/31408#536372 Ansteuerung von Funksteckdosen mit einem Webserver]&lt;br /&gt;
&lt;br /&gt;
==GPS==&lt;br /&gt;
&lt;br /&gt;
(Global Positioning System, satellitengestütztes System zur weltweiten Positions- und Zeitbestimmung)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/48544#371717 GPS - MOUSE - MINI- NAVIGATOR (Assembler) ATmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/72507#593252 GPS an mega8,88 oder 168]&lt;br /&gt;
&lt;br /&gt;
==IR==&lt;br /&gt;
* siehe auch [[AVR Softwarepool#RC5|RC5]]&lt;br /&gt;
* (C) [[IRMP]] - Infrared Multi Protocol Decoder:&lt;br /&gt;
**[[IRMP| Wiki Seite]]&lt;br /&gt;
**[http://www.mikrocontroller.net/topic/162119#1545798 Thread im Forum]&lt;br /&gt;
&lt;br /&gt;
==Kryptographie==&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/73468 Verschiedene kryptographische Funktionen] &lt;br /&gt;
&lt;br /&gt;
==LANC==&lt;br /&gt;
&lt;br /&gt;
(Steuerprotokoll für Video- und Digitalfotokameras, auch als Control-L bekannt)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/40463#302754 Sony LANC Auswertung mit AVR] (Atmega 128 @ 16 MHz)&lt;br /&gt;
&lt;br /&gt;
==LEDs und LED-Anzeigen==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/76839#638278 Solarlicht Steuerung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/77863#648213 Taster + LED am selben Draht (4*)]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/73776#606472 LED-Touch-Panel] (ARM)&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/74013#609097 RGB-Moodlight auf ATTiny2313 mit RC5-Fernbedienung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/54561#421940 HSV RGB Led Dimmer, C Code &amp;amp; Video &amp;amp; Doku]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/67567#543492 Mini RGB Lichteffektgenerator mit Menü für Pic16F84]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48464#370871 Ansteuerung einer RGB LED (PWM)]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/87149#737282 3x7 Segment und 1 I/O-Pin (Assembler)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31370#240843 ADC mit Multiplexanzeige] (vier 7-Segmentanzeigen)&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31388#241192 AVR-Lauflicht]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/94746#815809 HSB-&amp;gt;RGB Umrechnung rein in Assembler, auch für ATiny]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/110168 2x7-Segment an nur 3 Leitungen]&lt;br /&gt;
* (A) [[Ambilight in Hardware]]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/145156#1346531 µCke Microcontroller Mücke (Atmel Tiny13)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131525#1191497 AVR-Lichtorgel per FFT MEGA8 32 644 ]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/182305 TLC5940 16-Kanal 12bit LED Treiber ansteuern und HighPower LEDs über MosFETs treiben]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/185730 7Segment Coder]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/244768 RGB-Moodlight, ATMega8, Soft-PWM mit Gammakorrektur, IR-Fernbedienung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/275426 serielles 4x7 Segment Display NSM4202]&lt;br /&gt;
&lt;br /&gt;
==LCD und VFD==&lt;br /&gt;
* (C) [http://bluematrixi.bl.funpic.de/index.php/elektronik-avr/lcd-display-nokia3310 Bibliothek für Nokia 3310 Lcd Ansteuerung in &amp;quot;C&amp;quot; - sehr gut]&lt;br /&gt;
*(C,A)[http://www.mikrocontroller.net/articles/Ansteuerung_Handy_Displays Ansteuerung_Handy_Displays]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/53137#413137 Programm zum Erstellen eigener Schriftarten (LCD)]&lt;br /&gt;
* (PC) [http://www.mikrocontroller.net/topic/54860#423255 LCD Schriftarten ( Fonts in veschiedenen Größen )]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31403  The Siemens S65 132x176, 65536 color display with AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48501#371218 LCD Ansteuerung im 4bit-Modus]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48456#370782 LCD Library T6963c]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/76399#633680 &amp;quot;Bessere&amp;quot; T6963c Library]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25099#186569 LCD Controller für 640x480 LCD mit mega8515]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/38923#287939 LCD Controller KS0073 Support im 4-Bit Mode]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/79609#664268 KS0066U oder Ähnliche --- LCD Treiber]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/81793#683135 Pollin E0855-2 SED1530-Treiber]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/90449#772843 LCD über nur einen IO-Pin ansteuern]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/120475 VFD Library (Vacuum Fluorescent Display Library)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98321#851423 Grafikfähiger LCD Controller für 320x240 LCD mit 4 Graustufen] (jetzt auch mit 8 Graustufen)&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/140369 Menüsystem für beliebige schwarz-weiß LCDs bis 4096x4096 Pixeln und grafischem Editor]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/194149 Schnelle SED1520 Funktionsbibliothek mit Bildkonverter und Fontgenerator]&lt;br /&gt;
* (PC,C) [http://www.mikrocontroller.net/topic/234304 DOGXL Fontgenerator (SW+Graustufen)]&lt;br /&gt;
* (C,A) [http://www.mikrocontroller.net/topic/236862#2401250 Grafikfähiger LCD Controller für 320x240 LCD mit D-RAM]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/190078 LCD SHARP M078CKA mit LH155]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/287978 EA DOGM162 Textdisplay an SPI]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/305266 HD44780 Display 2x16 Xmega-Assemblerbaustein]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/320791#3524261 Nokia N95 Display 320x240 Arduino Lib.]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/318818#3456758 Library für ST7735 Display Controller mit GLCD Font Unterstützung]&lt;br /&gt;
&lt;br /&gt;
==I2C==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98923#857451 Ultraschall Entfernungsmesser mit I2C, Eigenbau]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/83871#new  I2C-Master realisiert in Software, ohne TWI für alle ATMEGAs]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/38919#new  RS232 &amp;lt;-&amp;gt; TWI / I2C Interface für ATMega8 (ASM) inkl. Windows Software]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/67698#544930 USI TWI Master]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/235733#2388116 Hardware TWI-MASTER Interrupt basierend für Mega AVR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/272621#new I2C/TWI Master-Interrupt Xmega-Assemblerbaustein]&lt;br /&gt;
* (C) [https://www.mikrocontroller.net/topic/378553 hot-plug fähige Library für DS1621 Temperatursensoren ]&lt;br /&gt;
&lt;br /&gt;
==Messgeräte==&lt;br /&gt;
===Drehzahlmesser===&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/1518#8469 Drehzahlmesser 4 mal 7-Segment mit 90S2313]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/Drehzahlmesser Drehzahlmesser mit 4 mal 7-Segment anzeigen mit Tiny2313, Wiki-Artikel]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/231283 einfache Drehzahlmessung mit ATmega88]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/232485 4-Kanal Drehzahlmessung mit ATmega88]&lt;br /&gt;
&lt;br /&gt;
===Klopfsensormessgerät===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/Klopfsensormessgeraet Messgerät für Klopfgeräusche an Verbrennungsmotoren auf Basis des TPIC8101]&lt;br /&gt;
&lt;br /&gt;
===Entfernungsmesser===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98923#857451 Ultraschall Entfernungsmesser mit I2C, Eigenbau]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/130834 3D Umgebungserfassung mit einem auf zwei Servors montiertem Sharp Distanzsensor, Eigenbau]&lt;br /&gt;
&lt;br /&gt;
===Frequenzmesser===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/62610#495030 Frequenzmesser bis 2Mhz -- mit AVR ATmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48582#372072 Frequenzmessung (Seite mit Quellcode nicht erreichbar)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/62517#494146 Input Capture Pin (ICP) auslesen ( Frequenz messen)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25144#187587 Frequenzmessung und Impulszählung über den Parallelport-IR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31394#241251 einfacher 5 MHz Frequenzzähler (Assembler) ATmega8]&lt;br /&gt;
* (A+C) [http://www.mikrocontroller.net/topic/69021#558098 Multimeter]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/173665#new sehr genauer Frequenzmesser Atmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/186801#new  Reziproker Frequenzzähler+ Optimierte 64bit uint Routinen]&lt;br /&gt;
* (C+A) [http://www.mikrocontroller.net/topic/200279#new 6 Stellen von 1Hz bis 40MHz ATmega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/241150#2458079 Reziproker Frequenzzähler, GPS-stabilisiert, ATmega162]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/359552#new Reziproker Frequenzzähler mit BASCOM-AVR]&lt;br /&gt;
&lt;br /&gt;
===Frequenzgenerator===&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/152966#1438488 Einstellbarer Frequenzgenerator für 0.12 Hz - 8 MHz mit Atmega 8 und Bascom ]&lt;br /&gt;
&lt;br /&gt;
===Kompass===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/100239#870281 KOMPASS KMZ10A KMZ10B ATmega8 Assembler]&lt;br /&gt;
&lt;br /&gt;
===Messgeräte für elektronische Bauteile===&lt;br /&gt;
* (A+C) [http://www.mikrocontroller.net/topic/69021#558098 Multimeter]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/60797#477026 LC-METER / LC-Messgerät ATmega8 Assembler]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/60591#474873 Widerstandstester]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/56770#438957 Ladungsmessgerät]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31386#241139 Transistortester]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131804#1194273 Transistortester]&lt;br /&gt;
&lt;br /&gt;
===Spannungsmesser===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31370#240843 ADC mit Multiplexanzeige] - Voltmeter&lt;br /&gt;
* (A+C) [http://www.mikrocontroller.net/topic/69021#558098 Multimeter]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31389 Wirkleistungsmessgerät] - &amp;quot;Ein einfaches Wirkleistungsmessgerät für 230V Verbraucher ohne Netztrennung mit 3 stelliger 7-Segment Anzeige für Verbraucher bis 500W.&amp;quot; (+ ähnlicher Aufbau mit Silabs Controller)&lt;br /&gt;
&lt;br /&gt;
===Thermometer===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6516#41903 Zeit + Temperatur auf LCD mit AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/53127#413006 Thermometer mit LED &amp;amp; LM35]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31408#536372 Viele DS18x20-Thermometer in einem Webserver]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/354441#3953900 Auswertung Temperatursensor KTY81 (PT1000), Arduino Uno, 1-6 Kanäle]&lt;br /&gt;
&lt;br /&gt;
===Oszilloskop===&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/53129#413011 Einfaches Oszilloskop - Bascom]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/48586#372093 Oszi- &amp;amp; Logikanalyser mit LCD]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31376#240880 einfaches DIGITAL- Oszilloskop (800 Datenpunkte) Assembler]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/56616#437772 Einfaches &amp;quot;Oszilloskop&amp;quot;]&lt;br /&gt;
* (C) [http://www.christoph-lauer.de/Homepage/Blog/Eintrage/2010/8/1_Embedded_C_based_Spectrumanalyzer.html ATXMega based Oscilloscope and Spectrumanalyzer]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/228997#2308320 Selbstbau Digital Storage Oszilloskop]&lt;br /&gt;
&lt;br /&gt;
===Beschleunigungssensor===&lt;br /&gt;
* (c++) [http://www.mikrocontroller.net/topic/268214 Einfache BMA020 Library, mit I2C]&lt;br /&gt;
&lt;br /&gt;
==MIDI==&lt;br /&gt;
&lt;br /&gt;
(Musical Instrument Digital Interface, Datenübertragungsstandard für Musikinstrumente)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48542#371695 Mr.MidiPlayer - Spielt alle MIDI-Dateien von einer SD-Karte] (siehe auch: [[Midi_Rekorder_mit_MMC/SD-Karte]])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25035#185861 MIDI-Rekorder mit SD/MMC und AVR]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/106512# Drum-Trigger mit MIDI-Ausgabe]&lt;br /&gt;
&lt;br /&gt;
==MMC==&lt;br /&gt;
&lt;br /&gt;
(Multimedia Card, digitales Flash-Speichermedium)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25056#186117 SourceCode MMC die Zweite]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48481#370950 MMC/SD-Karte mit FAT16 an AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/67047#538510 MMC/SD Bootloader füt ATMega16]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/14800#102024 MMC/SD ansteuern mit AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25035#185861 MIDI-Rekorder mit SD/MMC und AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/FAT32 MMC/SD - FAT16/32 Bibliothek für AVR  mit Wiki]&lt;br /&gt;
&lt;br /&gt;
==Netzgeräte==&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/60786#476904 Labornetzgerät]&lt;br /&gt;
* [[RADLAB-PS1]] [http://www.mikrocontroller.net/topic/124858#1138781 Netzteil um LM317 mit Strombegrenzung und Anzeige!]&lt;br /&gt;
&lt;br /&gt;
==Netzwerk==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/87517#new Kleiner ENC28J60 µWebserver von SimonK]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/82127#new Ulrich Radigs ENC28J60 mit leicht lötbaren/beschaffbaren Bauteilen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/131825 Dirk Broßwick Webserver auf ENC28j60 Basis mit einem ATmega2561, es gibt auch einen Port auf das AVR-NET IO]&lt;br /&gt;
&lt;br /&gt;
==Parser==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/64763#517245 Zwei Parser für numerische Ausdrücke]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/76842#638283 uShell - ein universeller Parser für uCs]&lt;br /&gt;
&lt;br /&gt;
==RFID==&lt;br /&gt;
&lt;br /&gt;
(Radio Frequency Identification, Verfahren zur funkbasierten Identifizierung und Lokalisierung von Gegenständen)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/68442#552128 USB RFID Tag Leser]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/228709 Soft-RFID ohne RFID-IC]&lt;br /&gt;
&lt;br /&gt;
==RC - Fernsteuerungen/Servos==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48529#371582 RC Summen Signal erzeugen ]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/192453 RC Summen Signal dekodieren ]&lt;br /&gt;
&lt;br /&gt;
==RC5==&lt;br /&gt;
&lt;br /&gt;
(verbreitetes Datenübertragungsprotokoll für Infrarot-Fernbedienungen)&lt;br /&gt;
&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/14789#101536 RC5 Sender auf einem Attiny11L]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/74013#609097 RGB-Moodlight auf ATTiny2313 mit RC5-Fernbedienung]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12216#80856 Fernbedien RC5 Empfänger]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/59235#460765 RC5 Sender selber bauen ???]&lt;br /&gt;
&lt;br /&gt;
==Ringpuffer==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/66789#536189 Ringpuffer AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/101472#882716 AVR-GCC: UART mit FIFO]&lt;br /&gt;
&lt;br /&gt;
==SD==&lt;br /&gt;
&lt;br /&gt;
(Secure Digital Memory Card; digitales Flash-Speichermedium)&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48542#371695 Mr.MidiPlayer - Spielt alle MIDI-Dateien von einer SD-Karte] (siehe auch: [[Midi_Rekorder_mit_MMC/SD-Karte]])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25035#185861 MIDI-Rekorder mit SD/MMC und AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/68257#550336 Datenrekorder auf SD-Karte mit mega88]&lt;br /&gt;
&lt;br /&gt;
==Sonstiges==&lt;br /&gt;
&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/111783#994358 Sonnenstandberechnung mit Atmega 8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/articles/UAC_Mikrocontroller_ASCII_Console uAC Mikrocontroller ASCII Console]&lt;br /&gt;
&lt;br /&gt;
==Spaßprojekte==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/99803#866081 Glühwürmchen in Rotkohlglas gefangen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/119876#1083044 Miniprojekt: Lagerfeuer-LED (ATtiny25)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/120289#1087905 Klingel mit 100 Melodien - last minute Weihnachtsgeschenk]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/145156#1346531 µCke Microcontroller Mücke (Atmel Tiny13)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/167528#1601077 Toastbrote zählen]&lt;br /&gt;
&lt;br /&gt;
==Spiele==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48505#371259 Tetris auf dem AtMega8]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/187253# Atmega8 Schachuhr mit Max7219 ]&lt;br /&gt;
&lt;br /&gt;
==Steuerungen==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/123551 Aquarium Controller]&lt;br /&gt;
* () [http://www.mikrocontroller.net/topic/309045 Lüftersteuerung durch zwei SHT75, mega32, LCD und SD-Karte]&lt;br /&gt;
* () [http://www.mikrocontroller.net/topic/307375 Fensteröffner mit Scheibenwischermotor dht11 sht11]&lt;br /&gt;
&lt;br /&gt;
==Taster / Schalter==&lt;br /&gt;
===mechanisch===&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/6492#41625 Tasten entprellen - Bulletproof] (siehe auch: [[Entprellung]])&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48465#370877 Universelle Tastenabfrage]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/6491#41624 Tasten-Matrix entprellen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/64731#517001 Tastenmatrix auslesen über nur 2 Leitungen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/64743#517105 Tasten Entprellen für N00bs]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/77863#648213 Taster + LED am selben Draht (4*)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/1515#8455 Entprellen von Tastern, autorepeat, vintage]&lt;br /&gt;
&lt;br /&gt;
===kapazitiv===&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/38904  Sensor mit nur einer Kontaktfläche]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25045 Einfache Sensortaste]&lt;br /&gt;
&lt;br /&gt;
==Tonerzeugung==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/66945#537624 ATMEGA8 Soundgenerator/Synthesizer]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/120289#1087905 Klingel mit 100 Melodien - last minute Weihnachtsgeschenk]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/134362 RTTTL Melodiegenerator mit ATTINY85]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/232702#new RTTTL Melodiegenerator mit ATMEGA8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25051 Melodie ausgeben mit AVR ATTiny12]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/145156#1346531 µCke Microcontroller Mücke (Atmel Tiny13)]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/137629#1259132 Melodieklingel BASCOM ATmega8]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/191596 2Kanal Synthesizer ATtiny 2313, 85, ..]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/232845 17 Kanal Avr Synthesizer]&lt;br /&gt;
* (C) [[AVR-Synthesizer]]&lt;br /&gt;
&lt;br /&gt;
==TWI==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/87597#742070 AVR TWI Master und Slave Funtionen in C]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/31404#242081 TWI / I2C einf. MASTER SLAVE Beispiel(Assembler) ATmega8]&lt;br /&gt;
&lt;br /&gt;
==USB==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/75254#622120 USB Host Stack für Eingebettete Systeme (LGPL)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/68442#552128 USB RFID Tag Leser]&lt;br /&gt;
* (A,C) [http://www.mikrocontroller.net/topic/92979#797957 AVR ATmega8TestBoard]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/90791#776280 Relaiskarte für den USB Port]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/130381#1179352 USB-Stick am Mikrocontroller VNC1L]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/155241 PDIUSBD12 Treiber und micro USB-Device stack]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/192453 HID-Joystick mit V-USB ]&lt;br /&gt;
&lt;br /&gt;
==UART==&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/101472#882716 AVR-GCC: UART mit FIFO]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/38928#287985 Software UART]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/125651#1147436 Software UART mit FIFO]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/175946#1690682 uParse] - ein kompakter und vielseitiger Parser (Atmega32) für [[RS232]]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/159753#1517744 Einfacher Interpreter für Komandozeilen/Befehlszeilen] (Atmega32) für [[RS232]]&lt;br /&gt;
* (C) [https://sourceforge.net/projects/yambsiavr/ Modbus Slave Library] für [[RS232]] und [[RS485]]&lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/53140#413249 AVR ASCII Video Terminal - 40 x 25 - BAS Signal]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/53139#413225 TV VIDEO BILD BAS Frequenzzähler DVM Atmega8 Assembler]&lt;br /&gt;
* (A) [http://www.electronicspit.com/video/ Videosignal in Farbe aus dem ATMega32] (URL nicht mehr erreichbar)&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/25091#new VGA Testbildgenerator]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/101429#882288 ATmega8 erzeugt Video in C!]&lt;br /&gt;
&lt;br /&gt;
==Zeitgeber und Uhren==&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/12185#80055 Die genaue Sekunde / RTC]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/74673#616226 LCD-Timer für Belichtungsgerät]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/119859#1082804 DS1307 Assembler-Code]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31374#240878 AVR Library für RTC 12C887 in C]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25136#187534 RTC DS1302 in C]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25087#186454 RTC + Scheduler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/53131#413059 Jumbo-LED Uhr]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/6516#41903 Zeit + Temperatur auf LCD mit AVR]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/25069 Sekunden in Zeit/Datum umwandeln (mit Sommerzeit/Schaltjahren)]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/48560#371911 BASCOM Uhr mit Butterfly]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/48450#370765 Countdown timer für UV Belichter]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/98885 Countdown Timer mit ATtiny2313]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/12176#79672 Wartezeiten effektiv (Scheduler)]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/31408#536372 Schaltuhr mit DCF77-Referenz in einem Webserver, Steuerung von Funksteckdosen]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/100892#876549 Eieruhr mit ATtiny24V/ATtiny2313V]&lt;br /&gt;
* (B) [http://www.mikrocontroller.net/topic/151236 Zeitauslöser für Casio EX F1 mit Attiny2313]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/151260#1419218 DCF77 Uhr 7 Segment LED ATmega8 Assembler]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/177688# NIXIE Uhr mit vielen Funktionen in C mit ATTiny2313]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/233699 Stoppuhr – Geschwindigkeit – Pulsweite mit Atmega88]&lt;br /&gt;
* (C) [http://www.mikrocontroller.net/topic/275514 Timer bis 99:59 min - LED Display NSM4202, Drehgeber - At90S2313]&lt;br /&gt;
* (A) [http://www.mikrocontroller.net/topic/289724 Uhr/Kalender AVR-Assemblerbaustein]&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[AVR-Codesammlung Übersicht]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:AVR]]&lt;br /&gt;
[[Kategorie:Forum]]&lt;br /&gt;
[[Kategorie:Listen]]&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Luftdrucksensor&amp;diff=102645</id>
		<title>Luftdrucksensor</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Luftdrucksensor&amp;diff=102645"/>
		<updated>2020-12-01T17:43:34Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* BME680 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der Luftdruck auf der Erdoberfläche liegt bei etwa 1000 hPa (hektoPascal) = 1000 mBar. In technischen Anwendungen werden Drücke oft in kPa (kiloPascal) angegeben, das sind demzufolge 100 kPa.&lt;br /&gt;
&lt;br /&gt;
=== MS5534 ===&lt;br /&gt;
Aktuell ist der MS5534C. Hergestellt von [http://www.intersema.ch/ Intersema]. Dort findet sich auch das [http://www.intersema.ch/products/guide/calibrated/ms5534c/ Datenblatt]&lt;br /&gt;
&lt;br /&gt;
Der Sensor gibt seine Werte digital aus und enthält auch einen Temperatursensor für die nötige Temperaturkompensationsberechnung. Diese muss der Anwender selber machen, die Beschreibung dazu findet sich im Datenblatt.&lt;br /&gt;
&lt;br /&gt;
Daten:&lt;br /&gt;
* Versorgungsspannung: 2,2 ... 3,6V&lt;br /&gt;
* Auflösung: 0.1 mbar&lt;br /&gt;
* Genauigkeit absolut bei 25°C: +-1,5 mbar&lt;br /&gt;
* Messfrequenz: ca. 28 Hz&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Kalibriert&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* lichtempfindlich&lt;br /&gt;
* Eigenes Protokoll über 3 Adern, kein Bussystem&lt;br /&gt;
* Benötigt Oszillator mit 32768 kHz&lt;br /&gt;
&lt;br /&gt;
Bezugsquellen:&lt;br /&gt;
* ELV 20,47&amp;amp;euro;&lt;br /&gt;
&lt;br /&gt;
Beispielcode:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/20869 C-Code für PIC]&lt;br /&gt;
&lt;br /&gt;
=== MPX4115A ===&lt;br /&gt;
Analoger Drucksensor von Freescale (früher Motorola). Dort findet sich auch das [http://www.freescale.com/files/sensors/doc/data_sheet/MPX4115A.pdf Datenblatt]. &lt;br /&gt;
&lt;br /&gt;
Daten:&lt;br /&gt;
* Der Sensor gibt 45.9mV/kPa aus. &lt;br /&gt;
* Versorgungsspannung: 5V&lt;br /&gt;
* Genauigkeit (0-85°C): +-15 mbar&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* teilweise (0..90°C) temperaturkompensiert&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* geringe Genauigkeit im Vergleich zu den anderen Sensoren&lt;br /&gt;
&lt;br /&gt;
Bezugsquellen:&lt;br /&gt;
* Reichelt 13,70 &amp;amp;euro; (20.11.2012)&lt;br /&gt;
&lt;br /&gt;
=== MPL3115A2 ===&lt;br /&gt;
Drucksensor von Freescale (früher Motorola) mit digitaler Datenausgabe über I2C. Dort findet sich auch das [http://www.freescale.com/files/sensors/doc/data_sheet/MPL3115A2.pdf Datenblatt]. &lt;br /&gt;
&lt;br /&gt;
Daten:&lt;br /&gt;
* Messbereich 500..1100&amp;amp;nbsp;hPa&lt;br /&gt;
* Versorgungsspannung: 1.95 .. 3.6&amp;amp;nbsp;V&lt;br /&gt;
* Genauigkeit (0-50°C): 4&amp;amp;nbsp;hPa&lt;br /&gt;
* Auflösung: 1.5&amp;amp;nbsp;Pa bzw. 0.3&amp;amp;nbsp;m&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Datenaufbereitung On-Chip, Ausgabe Druck, Höhe, Temperatur&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* t.b.d.&lt;br /&gt;
&lt;br /&gt;
Bezugsquellen:&lt;br /&gt;
* DigiKey 2,31&amp;amp;nbsp;&amp;amp;euro;, RS-Components3,02&amp;amp;nbsp;&amp;amp;euro; (10.11.2013)&lt;br /&gt;
&lt;br /&gt;
=== SCP1000 ===&lt;br /&gt;
&lt;br /&gt;
Digitaler Absolutdruck-Sensor von VTI.&lt;br /&gt;
&lt;br /&gt;
[http://www.vti.fi/en/support/obsolete_products/pressure_sensors/ Datenblatt]&lt;br /&gt;
&lt;br /&gt;
Daten:&lt;br /&gt;
* Versorgung mit 2,4 bis 3,3 V&lt;br /&gt;
* Auflösung: 0,015 mbar&lt;br /&gt;
* Genauigkeit absolut (10 - 40°C): 1,5 mbar&lt;br /&gt;
* Messfrequenz (reduzierte Auflösung): max 9 Hz&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* SPI- oder I2C-Schnittstelle&lt;br /&gt;
* fertig kalibriert&lt;br /&gt;
* bis zu 17-bit Auflösung (entspricht 8cm)&lt;br /&gt;
* keine komplexen Kompensationsberechnungen beim Auslesen nötig&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* kleines SMD-Gehäuse (QFN-ähnlich), darf nicht mit Heißluft oder Lötkolben gelötet werden&lt;br /&gt;
* Beim Hersteller unter &amp;quot;Obsolete products&amp;quot; gelistet, aber noch gut verfügbar&lt;br /&gt;
&lt;br /&gt;
Bezugsquellen:&lt;br /&gt;
* Aevum-Mechatronik (ca. 17 EUR)&lt;br /&gt;
* Breakout-Boards bei Sparkfun&lt;br /&gt;
&lt;br /&gt;
=== BMP085 ===&lt;br /&gt;
&lt;br /&gt;
Digitaler Absolutdrucksensor von Bosch Sensortec.&lt;br /&gt;
&lt;br /&gt;
[http://www.bosch-sensortec.com/content/language1/downloads/BST-BMP085-DS000-05.pdf Datenblatt]&lt;br /&gt;
&lt;br /&gt;
Daten:&lt;br /&gt;
* Versorgung mit 1,8 bis 3,6 V&lt;br /&gt;
* Auflösung: 0,01 mbar&lt;br /&gt;
* Genauigkeit absolut (0-65°C): max. Fehler +-2,5 mbar&lt;br /&gt;
* Messfrequenz (reduzierte Auflösung): max 220 Hz&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* I2C-Schnittstelle&lt;br /&gt;
* fertig kalibriert&lt;br /&gt;
* hohe Auflösung und Genauigkeit&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* aufwendige Kompensationsberechnungen nötig&lt;br /&gt;
&lt;br /&gt;
Bezugsquellen:&lt;br /&gt;
* Digikey (ca. 8 EUR)&lt;br /&gt;
* [http://jeelabs.org/pp1 Breakout-Board von Jeelabs]&lt;br /&gt;
* Rutronik&lt;br /&gt;
* ACAL&lt;br /&gt;
* sparkfun&lt;br /&gt;
* Watterott&lt;br /&gt;
&lt;br /&gt;
Beispielcode:&lt;br /&gt;
* [http://code.jeelabs.org/viewvc/svn/jeelabs/trunk/libraries/Ports/ Jeelabs Ports Library] C++ mit Floatingpoint (Toter Link)&lt;br /&gt;
* [https://github.com/jcw/jeelib Jeelabs PortsBMP085 Library] C++/Arduino Library (Port library interface to BMP085 sensors connected via I2C)&lt;br /&gt;
&lt;br /&gt;
=== BMP180 ===&lt;br /&gt;
Der Nachfolger des &amp;lt;u&amp;gt;BMP085&amp;lt;/u&amp;gt; (siehe oben).&lt;br /&gt;
   &lt;br /&gt;
Dieser ist noch ein wenig kleiner, ansonsten laut Datenblatt identisch.&lt;br /&gt;
   &lt;br /&gt;
Das neue Datenblatt und Beispielcode kann hier [http://www.bosch-sensortec.com/de/homepage/products_3/environmental_sensors_1/bmp180_1/bmp180 (Herstellerseite)] gefunden werden.&lt;br /&gt;
   &lt;br /&gt;
Das Datenblatt des BMP180 erklärt auch den BMP085 etwas besser ;) (interne Register, Power-On-Reset ...)&lt;br /&gt;
&lt;br /&gt;
Bezugsquelle (mit etwas Glück) :&lt;br /&gt;
ebay - internationale Suche&lt;br /&gt;
* BMP085 ab ca.3,5 $US (aktuell unter 3 Euro)&lt;br /&gt;
* BMP180 ab ca.6,0 $US (aktuell unter 5 Euro)&lt;br /&gt;
dort findet Ihr teilweise auch fertig aufgebaute Module (Chip auf Platine mit ein paar Bauteilen) z.B. als Modul für ARDUINO&lt;br /&gt;
&lt;br /&gt;
PS : Für viele Anwendungen kann auf die Kompensation verzichtet werden (zB. nur Luftdruckanzeige) -&amp;gt; Druck (in Pascal) = UP*3&lt;br /&gt;
&lt;br /&gt;
Februar 2016: Leider auch schon wieder abgekündigt, Nachfolger ist der sehr ähnliche BMP280.&lt;br /&gt;
&lt;br /&gt;
=== BMP280 ===&lt;br /&gt;
Der Nachfolger des &amp;lt;u&amp;gt;BMP180&amp;lt;/u&amp;gt; (siehe oben).&lt;br /&gt;
&lt;br /&gt;
Sehr ähnlich dem BMP180, leicht verbesserte Kennwerte&lt;br /&gt;
* Siehe auch: [https://www.mikrocontroller.net/articles/Temperatursensor#Bosch_Sensortec_BME280_.2F_BME680 Temperatursensor Bosch / Sensortec BME280 / BME680]&lt;br /&gt;
&lt;br /&gt;
=== BME680 ===&lt;br /&gt;
Auch von Bosch, kann Luftfeuchtigkeit, Druck, Luftqualität&lt;br /&gt;
&lt;br /&gt;
[https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bme680-ds001.pdf Datenblatt vom Hersteller]&lt;br /&gt;
&lt;br /&gt;
* Betriebsspannung 1.71 bis 3.6 V&lt;br /&gt;
* Interface I²C, SPI&lt;br /&gt;
&lt;br /&gt;
Kennwerte der Druckmessung&lt;br /&gt;
* RMS Noise                                  0.12 Pa (equiv. to 1.7 cm).&lt;br /&gt;
* Sensitivity Error                          ± 0.25 % (equiv. to 1 m at 400 m height change).&lt;br /&gt;
* Temperature coefficient offset  ±1.3 Pa/K (equiv. to ±10.9 cm at 1°C temperature change),&lt;br /&gt;
&lt;br /&gt;
150 Messungen/s bei niedrigster Auflösung, bis zu 16 fach oversampling&lt;br /&gt;
Ein Entwicklungsboard ist für ca 20€ zu bekommen.&lt;br /&gt;
&lt;br /&gt;
* Siehe auch: [https://www.mikrocontroller.net/articles/Temperatursensor#Bosch_Sensortec_BME280_.2F_BME680 Temperatursensor Bosch / Sensortec BME280 / BME680]&lt;br /&gt;
&lt;br /&gt;
=== LPS331 ===&lt;br /&gt;
Digitaler Absolutdrucksensor von STMicroelectronics &lt;br /&gt;
[http://www.st.com/web/en/resource/technical/document/datasheet/DM00036196.pdf (Datenblatt)]&lt;br /&gt;
* Betriebsspannung 1,8 bis 3.6 Volt&lt;br /&gt;
* Interface I²C, SPI&lt;br /&gt;
&lt;br /&gt;
=== MS5611 ===&lt;br /&gt;
Digitaler Absolutdrucksensor von Measurement Specialties/MEAS&lt;br /&gt;
[http://www.amsys.info/sheets/amsys.en.ms5611_01ba03.pdf (Datenblatt)]&lt;br /&gt;
* Betriebsspannung 1,8 bis 3.6 Volt&lt;br /&gt;
* Interface I²C, SPI&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Sensorik]]&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Luftdrucksensor&amp;diff=102644</id>
		<title>Luftdrucksensor</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Luftdrucksensor&amp;diff=102644"/>
		<updated>2020-12-01T17:43:13Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* BMP280 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Der Luftdruck auf der Erdoberfläche liegt bei etwa 1000 hPa (hektoPascal) = 1000 mBar. In technischen Anwendungen werden Drücke oft in kPa (kiloPascal) angegeben, das sind demzufolge 100 kPa.&lt;br /&gt;
&lt;br /&gt;
=== MS5534 ===&lt;br /&gt;
Aktuell ist der MS5534C. Hergestellt von [http://www.intersema.ch/ Intersema]. Dort findet sich auch das [http://www.intersema.ch/products/guide/calibrated/ms5534c/ Datenblatt]&lt;br /&gt;
&lt;br /&gt;
Der Sensor gibt seine Werte digital aus und enthält auch einen Temperatursensor für die nötige Temperaturkompensationsberechnung. Diese muss der Anwender selber machen, die Beschreibung dazu findet sich im Datenblatt.&lt;br /&gt;
&lt;br /&gt;
Daten:&lt;br /&gt;
* Versorgungsspannung: 2,2 ... 3,6V&lt;br /&gt;
* Auflösung: 0.1 mbar&lt;br /&gt;
* Genauigkeit absolut bei 25°C: +-1,5 mbar&lt;br /&gt;
* Messfrequenz: ca. 28 Hz&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Kalibriert&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* lichtempfindlich&lt;br /&gt;
* Eigenes Protokoll über 3 Adern, kein Bussystem&lt;br /&gt;
* Benötigt Oszillator mit 32768 kHz&lt;br /&gt;
&lt;br /&gt;
Bezugsquellen:&lt;br /&gt;
* ELV 20,47&amp;amp;euro;&lt;br /&gt;
&lt;br /&gt;
Beispielcode:&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/20869 C-Code für PIC]&lt;br /&gt;
&lt;br /&gt;
=== MPX4115A ===&lt;br /&gt;
Analoger Drucksensor von Freescale (früher Motorola). Dort findet sich auch das [http://www.freescale.com/files/sensors/doc/data_sheet/MPX4115A.pdf Datenblatt]. &lt;br /&gt;
&lt;br /&gt;
Daten:&lt;br /&gt;
* Der Sensor gibt 45.9mV/kPa aus. &lt;br /&gt;
* Versorgungsspannung: 5V&lt;br /&gt;
* Genauigkeit (0-85°C): +-15 mbar&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* teilweise (0..90°C) temperaturkompensiert&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* geringe Genauigkeit im Vergleich zu den anderen Sensoren&lt;br /&gt;
&lt;br /&gt;
Bezugsquellen:&lt;br /&gt;
* Reichelt 13,70 &amp;amp;euro; (20.11.2012)&lt;br /&gt;
&lt;br /&gt;
=== MPL3115A2 ===&lt;br /&gt;
Drucksensor von Freescale (früher Motorola) mit digitaler Datenausgabe über I2C. Dort findet sich auch das [http://www.freescale.com/files/sensors/doc/data_sheet/MPL3115A2.pdf Datenblatt]. &lt;br /&gt;
&lt;br /&gt;
Daten:&lt;br /&gt;
* Messbereich 500..1100&amp;amp;nbsp;hPa&lt;br /&gt;
* Versorgungsspannung: 1.95 .. 3.6&amp;amp;nbsp;V&lt;br /&gt;
* Genauigkeit (0-50°C): 4&amp;amp;nbsp;hPa&lt;br /&gt;
* Auflösung: 1.5&amp;amp;nbsp;Pa bzw. 0.3&amp;amp;nbsp;m&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Datenaufbereitung On-Chip, Ausgabe Druck, Höhe, Temperatur&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* t.b.d.&lt;br /&gt;
&lt;br /&gt;
Bezugsquellen:&lt;br /&gt;
* DigiKey 2,31&amp;amp;nbsp;&amp;amp;euro;, RS-Components3,02&amp;amp;nbsp;&amp;amp;euro; (10.11.2013)&lt;br /&gt;
&lt;br /&gt;
=== SCP1000 ===&lt;br /&gt;
&lt;br /&gt;
Digitaler Absolutdruck-Sensor von VTI.&lt;br /&gt;
&lt;br /&gt;
[http://www.vti.fi/en/support/obsolete_products/pressure_sensors/ Datenblatt]&lt;br /&gt;
&lt;br /&gt;
Daten:&lt;br /&gt;
* Versorgung mit 2,4 bis 3,3 V&lt;br /&gt;
* Auflösung: 0,015 mbar&lt;br /&gt;
* Genauigkeit absolut (10 - 40°C): 1,5 mbar&lt;br /&gt;
* Messfrequenz (reduzierte Auflösung): max 9 Hz&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* SPI- oder I2C-Schnittstelle&lt;br /&gt;
* fertig kalibriert&lt;br /&gt;
* bis zu 17-bit Auflösung (entspricht 8cm)&lt;br /&gt;
* keine komplexen Kompensationsberechnungen beim Auslesen nötig&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* kleines SMD-Gehäuse (QFN-ähnlich), darf nicht mit Heißluft oder Lötkolben gelötet werden&lt;br /&gt;
* Beim Hersteller unter &amp;quot;Obsolete products&amp;quot; gelistet, aber noch gut verfügbar&lt;br /&gt;
&lt;br /&gt;
Bezugsquellen:&lt;br /&gt;
* Aevum-Mechatronik (ca. 17 EUR)&lt;br /&gt;
* Breakout-Boards bei Sparkfun&lt;br /&gt;
&lt;br /&gt;
=== BMP085 ===&lt;br /&gt;
&lt;br /&gt;
Digitaler Absolutdrucksensor von Bosch Sensortec.&lt;br /&gt;
&lt;br /&gt;
[http://www.bosch-sensortec.com/content/language1/downloads/BST-BMP085-DS000-05.pdf Datenblatt]&lt;br /&gt;
&lt;br /&gt;
Daten:&lt;br /&gt;
* Versorgung mit 1,8 bis 3,6 V&lt;br /&gt;
* Auflösung: 0,01 mbar&lt;br /&gt;
* Genauigkeit absolut (0-65°C): max. Fehler +-2,5 mbar&lt;br /&gt;
* Messfrequenz (reduzierte Auflösung): max 220 Hz&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* I2C-Schnittstelle&lt;br /&gt;
* fertig kalibriert&lt;br /&gt;
* hohe Auflösung und Genauigkeit&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* aufwendige Kompensationsberechnungen nötig&lt;br /&gt;
&lt;br /&gt;
Bezugsquellen:&lt;br /&gt;
* Digikey (ca. 8 EUR)&lt;br /&gt;
* [http://jeelabs.org/pp1 Breakout-Board von Jeelabs]&lt;br /&gt;
* Rutronik&lt;br /&gt;
* ACAL&lt;br /&gt;
* sparkfun&lt;br /&gt;
* Watterott&lt;br /&gt;
&lt;br /&gt;
Beispielcode:&lt;br /&gt;
* [http://code.jeelabs.org/viewvc/svn/jeelabs/trunk/libraries/Ports/ Jeelabs Ports Library] C++ mit Floatingpoint (Toter Link)&lt;br /&gt;
* [https://github.com/jcw/jeelib Jeelabs PortsBMP085 Library] C++/Arduino Library (Port library interface to BMP085 sensors connected via I2C)&lt;br /&gt;
&lt;br /&gt;
=== BMP180 ===&lt;br /&gt;
Der Nachfolger des &amp;lt;u&amp;gt;BMP085&amp;lt;/u&amp;gt; (siehe oben).&lt;br /&gt;
   &lt;br /&gt;
Dieser ist noch ein wenig kleiner, ansonsten laut Datenblatt identisch.&lt;br /&gt;
   &lt;br /&gt;
Das neue Datenblatt und Beispielcode kann hier [http://www.bosch-sensortec.com/de/homepage/products_3/environmental_sensors_1/bmp180_1/bmp180 (Herstellerseite)] gefunden werden.&lt;br /&gt;
   &lt;br /&gt;
Das Datenblatt des BMP180 erklärt auch den BMP085 etwas besser ;) (interne Register, Power-On-Reset ...)&lt;br /&gt;
&lt;br /&gt;
Bezugsquelle (mit etwas Glück) :&lt;br /&gt;
ebay - internationale Suche&lt;br /&gt;
* BMP085 ab ca.3,5 $US (aktuell unter 3 Euro)&lt;br /&gt;
* BMP180 ab ca.6,0 $US (aktuell unter 5 Euro)&lt;br /&gt;
dort findet Ihr teilweise auch fertig aufgebaute Module (Chip auf Platine mit ein paar Bauteilen) z.B. als Modul für ARDUINO&lt;br /&gt;
&lt;br /&gt;
PS : Für viele Anwendungen kann auf die Kompensation verzichtet werden (zB. nur Luftdruckanzeige) -&amp;gt; Druck (in Pascal) = UP*3&lt;br /&gt;
&lt;br /&gt;
Februar 2016: Leider auch schon wieder abgekündigt, Nachfolger ist der sehr ähnliche BMP280.&lt;br /&gt;
&lt;br /&gt;
=== BMP280 ===&lt;br /&gt;
Der Nachfolger des &amp;lt;u&amp;gt;BMP180&amp;lt;/u&amp;gt; (siehe oben).&lt;br /&gt;
&lt;br /&gt;
Sehr ähnlich dem BMP180, leicht verbesserte Kennwerte&lt;br /&gt;
* Siehe auch: [https://www.mikrocontroller.net/articles/Temperatursensor#Bosch_Sensortec_BME280_.2F_BME680 Temperatursensor Bosch / Sensortec BME280 / BME680]&lt;br /&gt;
&lt;br /&gt;
=== BME680 ===&lt;br /&gt;
Auch von Bosch, kann Luftfeuchtigkeit, Druck, Luftqualität&lt;br /&gt;
&lt;br /&gt;
[https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bme680-ds001.pdf Datenblatt vom Hersteller]&lt;br /&gt;
&lt;br /&gt;
* Betriebsspannung 1.71 bis 3.6 V&lt;br /&gt;
* Interface I²C, SPI&lt;br /&gt;
&lt;br /&gt;
Kennwerte der Druckmessung&lt;br /&gt;
* RMS Noise                                  0.12 Pa (equiv. to 1.7 cm).&lt;br /&gt;
* Sensitivity Error                          ± 0.25 % (equiv. to 1 m at 400 m height change).&lt;br /&gt;
* Temperature coefficient offset  ±1.3 Pa/K (equiv. to ±10.9 cm at 1°C temperature change),&lt;br /&gt;
&lt;br /&gt;
150 Messungen/s bei niedrigster Auflösung, bis zu 16 fach oversampling&lt;br /&gt;
Ein Entwicklungsboard ist für ca 20€ zu bekommen.&lt;br /&gt;
&lt;br /&gt;
=== LPS331 ===&lt;br /&gt;
Digitaler Absolutdrucksensor von STMicroelectronics &lt;br /&gt;
[http://www.st.com/web/en/resource/technical/document/datasheet/DM00036196.pdf (Datenblatt)]&lt;br /&gt;
* Betriebsspannung 1,8 bis 3.6 Volt&lt;br /&gt;
* Interface I²C, SPI&lt;br /&gt;
&lt;br /&gt;
=== MS5611 ===&lt;br /&gt;
Digitaler Absolutdrucksensor von Measurement Specialties/MEAS&lt;br /&gt;
[http://www.amsys.info/sheets/amsys.en.ms5611_01ba03.pdf (Datenblatt)]&lt;br /&gt;
* Betriebsspannung 1,8 bis 3.6 Volt&lt;br /&gt;
* Interface I²C, SPI&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Sensorik]]&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Feuchtesensor&amp;diff=102643</id>
		<title>Feuchtesensor</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Feuchtesensor&amp;diff=102643"/>
		<updated>2020-12-01T17:39:38Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* Typen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Feuchtigkeitssensoren bzw. Feuchtesensoren arbeiten meist nach dem Prinzip eines feuchtigkeitsabhängigen Kondensators.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Typen==&lt;br /&gt;
=== Bosch/Sensortec BME280, BME680 ===&lt;br /&gt;
I2C-Sensor Kombiniert für Temperatur, Luftfeuchtigkeit, Luftdruck (BME680 = BME280 + Luftgüte)&lt;br /&gt;
* Siehe auch: [https://www.mikrocontroller.net/articles/Temperatursensor#Bosch_Sensortec_BME280_.2F_BME680 Temperatursensor Bosch / Sensortec BME280 / BME680]&lt;br /&gt;
&lt;br /&gt;
===Dallas/Maxim DS1923===&lt;br /&gt;
Eigentlich ein Temperatur-&amp;amp; Feuchtelogger, aber auch nur als Sensor verwendbar.&amp;lt;br&amp;gt;&lt;br /&gt;
Edelstahl-1wire-iButton mit Lithiumzelle&amp;lt;br&amp;gt;&lt;br /&gt;
Gibt es nicht mehr als Sample, kostet etwa 50 Euro bei www.spezial.de.&amp;lt;br&amp;gt;&lt;br /&gt;
Hygrochron Temperature/Humidity Logger iButton with 8KB Data-Log Memory&amp;lt;br&amp;gt;&lt;br /&gt;
http://www.maxim-ic.com/quick_view2.cfm/qv_pk/4379/t/al&lt;br /&gt;
&lt;br /&gt;
===Philips H1 2322 691 90001===&lt;br /&gt;
vom Reichelt (Datenblatt dort downloaden):&amp;lt;br&amp;gt;&lt;br /&gt;
jetzt von vishay hergestellt: http://www.vishay.com/docs/29001/23226919.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
Applikation von Valvo dazu:&lt;br /&gt;
http://docs.poulter.de/Elektronik/Sensoren/Luftfeuchtesensor%20VALVO.pdf&amp;lt;br&amp;gt; (link down)&amp;lt;br&amp;gt;&lt;br /&gt;
https://web.archive.org/web/20060618143150/http://docs.poulter.de/Elektronik/Sensoren/Luftfeuchtesensor%20VALVO.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
FEUCHTESENSOR Sensor für Feuchtigkeit  € 10.00&amp;lt;br&amp;gt;&lt;br /&gt;
Feuchtesensor zur Messung und Regelung der relativen Luftfeuchte&amp;lt;br&amp;gt;&lt;br /&gt;
Kapazität: 122pF +/-15%&lt;br /&gt;
Empf.(Frel=43%): 0,4pF/%Frel&amp;lt;br&amp;gt;&lt;br /&gt;
Meßfrequenz: 1kHz...1MHz&lt;br /&gt;
Meßbereich: 10%...90%&amp;lt;br&amp;gt;&lt;br /&gt;
Top: 0°C...+85°C&lt;br /&gt;
Vmax: 15V&amp;lt;br&amp;gt;&lt;br /&gt;
Weitere Informationen zu diesem Artikel finden Sie in den Datenblättern &lt;br /&gt;
&lt;br /&gt;
Auswerten z.&amp;amp;nbsp;B. mit einem Oszillator muss man selbst!&lt;br /&gt;
&lt;br /&gt;
===ChipCap2 von Amphenol Advanced Sensors (früher GE Measurement &amp;amp; Control)===&lt;br /&gt;
Temperatur- und Luftfeuchtesensor&amp;lt;br&amp;gt;&lt;br /&gt;
Analogausgang oder Digitalausgang (I²C)&amp;lt;br&amp;gt;&lt;br /&gt;
Bei Analogausgang ist ein einfacher RC-Filter nötig (Pulsdichtemodulation)&amp;lt;br&amp;gt;&lt;br /&gt;
Beide Varianten verfügen über einen bzw. mehrere Alarmausgänge (Push-Pull, Open Collector)&amp;lt;br&amp;gt;&lt;br /&gt;
Messbereich: &amp;lt;br&amp;gt;&lt;br /&gt;
0% rH - 100% rH nicht kondensierend, -40 °C - 125 °C&amp;lt;br&amp;gt;&lt;br /&gt;
Genauigkeit: &amp;lt;br&amp;gt;&lt;br /&gt;
+-2% rH von 20% rH - 80 % rH, außerhalb +-4% rH&amp;lt;br&amp;gt;&lt;br /&gt;
+-0,3 °C von 20 °C - 40 °C&amp;lt;br&amp;gt;&lt;br /&gt;
Versorgungsspannung je nach Variante 3,3V oder 5V&amp;lt;br&amp;gt;&lt;br /&gt;
Gehäuse: SMD oder SIP (1,27 mm, ähnlich SHT71)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datenblätter:&amp;lt;br&amp;gt;&lt;br /&gt;
http://www.ge-mcs.com/download/moisture-humidity/920-558B-LR.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
http://www.ge-mcs.com/download/moisture-humidity/920-628A-LR.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
Anwendungsdatenblatt:&amp;lt;br&amp;gt;&lt;br /&gt;
http://www.ge-mcs.com/download/moisture-humidity/916-127B.pdf&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Preise (Stand 3/2014): ab 6,38 € (Mouser)&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===KM33 von Innovative Computer===&lt;br /&gt;
ab € 43,00&amp;lt;br&amp;gt;&lt;br /&gt;
Schuricht 115-245057&amp;lt;br&amp;gt;&lt;br /&gt;
vermutlich auch nur ein variabler Kondensator&lt;br /&gt;
&lt;br /&gt;
===HIH-3610, HIH3610===&lt;br /&gt;
von Honeywell (sehr linear, aber über € 23,00)&amp;lt;br&amp;gt;&lt;br /&gt;
analoger Ausgang 0..4V&amp;lt;br&amp;gt;&lt;br /&gt;
Versionen:&lt;br /&gt;
* -001 RM 2,54 unkalibriert&lt;br /&gt;
* -002 RM 1,27 unkalibriert&lt;br /&gt;
* -003 RM 2,54 kalibriert&lt;br /&gt;
* -004 RM 1,27 kalibriert&lt;br /&gt;
Nachtrag: sind abgekündigt, Nachfolger: &amp;lt;br&amp;gt;&lt;br /&gt;
HIH-4000-00x, HIH-4010-00x, HIH-4021-00x, HIH-4030-00x und HIH-4031-00x&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mittlerweile ist der HIH-5030/31 aktuell. (Stand: Sep. 2009)&lt;br /&gt;
&lt;br /&gt;
http://catalog.sensing.honeywell.com/ss.asp?FAM=humiditymoisture &amp;lt;p&amp;gt;&lt;br /&gt;
Für den Sensor HIH-3605 gibt es eine Applikation, in der der Sensor an den 1-wire Bus von Dallas angeschlossen wird. Der Sensor läßt sich so mit einer verdrillten Leitung betreiben und auslesen.&amp;lt;br&amp;gt;&lt;br /&gt;
http://www.sensorsmag.com/sensors/humidity-moisture/a-1-wire-humidity-sensor-1080&lt;br /&gt;
&lt;br /&gt;
===H25K5A===&lt;br /&gt;
von Sencera (&amp;lt;4€ bei CSD)&amp;lt;br&amp;gt;&lt;br /&gt;
Variabler Widerstand bei Wechselspannung.&amp;lt;br&amp;gt;&lt;br /&gt;
Bereich 0..+60°C, 20..90%RH. Achtung: auch Lagerung nur bis 90%RH&amp;lt;br&amp;gt;&lt;br /&gt;
Temperaturkompensierte Messung über Spannungsteiler mit handelsüblichem NTC.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===HS1101===&lt;br /&gt;
von Humirel (~14€ bei CSD)&amp;lt;br&amp;gt;&lt;br /&gt;
Variable Kapazität, 164..200pF.&amp;lt;br&amp;gt;&lt;br /&gt;
Temperaturbereich -40..+100°C.&amp;lt;br&amp;gt;&lt;br /&gt;
Temperaturkompensierter Oszillator mit CMOS-Timer 555 im Datasheet.&lt;br /&gt;
&lt;br /&gt;
===HYT371===&lt;br /&gt;
von Hygrosens (~11€ bei Reichelt)&amp;lt;br&amp;gt;&lt;br /&gt;
Temperaturbereich -40..+100°C.&amp;lt;br&amp;gt;&lt;br /&gt;
Genauigkeit 3% rF, 0.4°C&amp;lt;br&amp;gt;&lt;br /&gt;
Interface I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C&amp;lt;br&amp;gt;&lt;br /&gt;
Me&amp;amp;szlig;prinzip kapazitiv&amp;lt;br&amp;gt;&lt;br /&gt;
Es gibt diverse weitere Sensoren, die Dokumentation ist allerdings bei allen sehr schlecht bzw. steht in separaten Dokumenten unter [http://www.hygrosens.com/produkte/sensorelemente/digitale-feuchtesensoren.html Doku].&amp;lt;br&amp;gt;&lt;br /&gt;
Für Parallelbetrieb mehrerer Sensoren läßt sich die I2C Adresse im EEPROM ändern (Beitrag: [http://www.mikrocontroller.net/topic/222242#2234294 I2C Adresse ändern]).&lt;br /&gt;
sieht auch: HYT Serie von [http://www.hygrosens.com/produkte/sensorelemente/digitale-feuchtesensoren.html Hygrosens Instruments Web-Seiten]&lt;br /&gt;
&lt;br /&gt;
===INSED===&lt;br /&gt;
* HIH3602A Feuchtigkeit und Temperatur (ab € 79,00) bei RS-Components&lt;br /&gt;
* HIH3602C Feuchtigkeit und Temperatur (ab € 82,00) bei RS-Components&lt;br /&gt;
&lt;br /&gt;
Bezugsquellen:&amp;lt;br&amp;gt;&lt;br /&gt;
INSED GmbH + Co KG Sensoren für die Industrie  Kronenstr 10  70794 Filderstadt  0711-9972758 Fax 9972762&amp;lt;br&amp;gt;&lt;br /&gt;
IBA GmbH Ingenieurbüro für Sensorik&lt;br /&gt;
Am Sandborn 14  63500 Seligenstadt  06182 95980&amp;lt;br&amp;gt;&lt;br /&gt;
Schuricht, RS-Components, Farnell&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===www.vaisala.be===&lt;br /&gt;
* 17204HM-humichip- mit Temp-Sensor KTY85-110 (special selection), analog 0..1V&amp;lt;br&amp;gt;&lt;br /&gt;
* 17205HM ohne Temp-Sensor analog 0..1V&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Datenblatt fand ich nicht auf deren Homepage, aber im Forum:&amp;lt;br&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/forum/read-1-15717.html#48616 &amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vermutlich verkaufen sie lieber fertige Module:&amp;lt;br&amp;gt;&lt;br /&gt;
http://www.vaisala.com/businessareas/instruments/products/humidity&amp;lt;br&amp;gt;&lt;br /&gt;
http://www.vaisala.com/businessareas/instruments/products/humidity/modules/oemmodules&lt;br /&gt;
&lt;br /&gt;
===Sensirion===&lt;br /&gt;
Von [http://www.sensirion.com Sensirion] gibt es eine ganze Reihe kombinierter Feuchte- und Temperatursensoren mit digitaler Schnittstelle.&lt;br /&gt;
* Sensoren mit digitaler 2-Draht Schnittstelle (nicht kompatibel zu I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C): SHT10, SHT11, SHT15, SHT71, SHT75&lt;br /&gt;
* Sensoren mit I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C-Schnittstelle: SHT21, SHT25&lt;br /&gt;
* Eval-Kits: EK-H4  EK-H5 (für SHT1x, 2x, 7x)&lt;br /&gt;
&lt;br /&gt;
Siehe hierzu auch:&lt;br /&gt;
* [http://pic-projekte.de/phpBB3/viewtopic.php?f=39&amp;amp;t=94 Assembler Ansteuerung]&lt;br /&gt;
&lt;br /&gt;
===Silicon Labs===&lt;br /&gt;
Von [http://www.silabs.com Silicon Labs] gibt es einen kombinierten Feuchte- Temperatursensor mit I&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;C. Temperaturbereich -45 °C - 85 °C, Feuchte 0% bis 100%, [http://www.silabs.com/products/sensors/humidity-sensors/Pages/Si7005.aspx Si7005]&lt;br /&gt;
Bezugsquelle: SiLabs direkt bzw. über Mouser&lt;br /&gt;
&lt;br /&gt;
===E+E Elektronik===&lt;br /&gt;
&lt;br /&gt;
[http://www.epluse.com www.epluse.com]&lt;br /&gt;
&lt;br /&gt;
Von E+E Elektronik gibt es einige Sensoren für verschiedene Anwendungsbereiche und Montagearten:&lt;br /&gt;
&lt;br /&gt;
*HC1000 High End Feuchtesensor für hochpräzise Anwendung &lt;br /&gt;
*HC201  Sensor für Standardanwendungen&lt;br /&gt;
&lt;br /&gt;
Erhältlich bei Distrelec HC1000 [https://www.distrelec.at/feuchtesensor/e-e-elektronik/hc1000-0-100/241104] und HC201 [https://www.distrelec.at/feuchtesensor/e-e-elektronik/hc201/245000]&lt;br /&gt;
&lt;br /&gt;
*HCT01  kombinierter Feuchte- und Temperatursensor im SMD Gehäuse mit Schutzbeschichtung; Datenblatt [http://www.epluse.com/fileadmin/data/product/hct01/Datenblatt_HCT01.pdf]&lt;br /&gt;
&lt;br /&gt;
Module&lt;br /&gt;
&lt;br /&gt;
*Gut geschützes Modul EE04 [https://www.distrelec.at/feuchte-temperatur-messumformer/e-e-elektronik/ee04-ftb4a7-ha010305/245002]&lt;br /&gt;
&lt;br /&gt;
*Kleiner Messumformer für Temperatur und Feuchte EE06 [https://www.distrelec.at/feuchte-temperatur-messumformer/e-e-elektronik/ee06-ft1a1/245284]&lt;br /&gt;
&lt;br /&gt;
===Hoperf===&lt;br /&gt;
HH10D Humidity sensor&lt;br /&gt;
*C-F Wandler mit Kalibrierdaten im EEPROM [http://www.hoperf.com/sensor/app/HH10D.htm]&lt;br /&gt;
&lt;br /&gt;
==Informationen==&lt;br /&gt;
&lt;br /&gt;
* Applikationnote [http://www.sensirion.com/images/getFile?id=91 #91 (PDF)] und [http://www.sensirion.com/images/getFile?id=95 #95 (C-Quellcode)] des Herstellers&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/48590#372123 C-Bibliothek] von Timo Dittmar im Forum&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/145736 C-Bibliothek] in der Codesammlung&lt;br /&gt;
* Fertige Ansteuerung durch AVR ATMega in [http://www.ethersex.de/index.php/SHT Ethersex]&lt;br /&gt;
&lt;br /&gt;
Bezugsquellen u.a.: &lt;br /&gt;
* http://www.driesen-kern.de/ und CSD (SHT11, 20€)&lt;br /&gt;
* [http://www.tme.eu/de/katalog/#id_category%3D100525%26cleanParameters%3D1%26path%3D%3B100124%3B100249%3B100525 TME]&lt;br /&gt;
* [http://www.csd-electronics.de/de/index.htm CSD] (Klick: ICs &amp;gt;&amp;gt; Sensoren &amp;gt;&amp;gt; Feuchtigkeit)&lt;br /&gt;
&lt;br /&gt;
==Übersicht==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; id=&amp;quot;tabelleabc&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;tabellarische Übersicht 11/2013&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Bauteil         || Hersteller              || Schnittstelle || Temperatur inkl.&lt;br /&gt;
|-&lt;br /&gt;
|DS1923           || Maxim                   || digital       || ja&lt;br /&gt;
|-&lt;br /&gt;
|2381 691 90001   || Vishay                  || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|P14              || ISTAG                   || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|MK 33            || ISTAG                   || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|HYT-271          || ISTAG                   || I2C           || ja&lt;br /&gt;
|-&lt;br /&gt;
|HYT-221          || ISTAG                   || I2C           || ja&lt;br /&gt;
|-&lt;br /&gt;
|HYT-939          || ISTAG                   || I2C           || ja&lt;br /&gt;
|-&lt;br /&gt;
|HIH-6000 series  || Honeywell               || I2C/SPI       || ja&lt;br /&gt;
|-&lt;br /&gt;
|HIH-4000 series  || Honeywell               || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|HIH-1000 series  || Honeywell               || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|H25K5A           || Sencera                 || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|818              || Sencera                 || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|H23K5A           || Sencera                 || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|H12K5            || Sencera                 || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|HTS2030SMD       || Measurement Specialties || analog        || ja&lt;br /&gt;
|-&lt;br /&gt;
|HTU21D           || Measurement Specialties || I2C           || ja&lt;br /&gt;
|-&lt;br /&gt;
|HS1101LF         || Measurement Specialties || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|KFS140-D         || B+B Thermo-Technik      || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|KFS33LC          || B+B Thermo-Technik      || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|SHT10            || Sensirion               || digital       || ja&lt;br /&gt;
|-&lt;br /&gt;
|SHT11            || Sensirion               || digital       || ja&lt;br /&gt;
|-&lt;br /&gt;
|SHT15            || Sensirion               || digital       || ja&lt;br /&gt;
|-&lt;br /&gt;
|SHT20            || Sensirion               || I2C           || ja&lt;br /&gt;
|-&lt;br /&gt;
|SHT21            || Sensirion               || I2C           || ja&lt;br /&gt;
|-&lt;br /&gt;
|SHT25            || Sensirion               || I2C           || ja&lt;br /&gt;
|-&lt;br /&gt;
|SHT71            || Sensirion               || digital       || ja&lt;br /&gt;
|-&lt;br /&gt;
|SHT75            || Sensirion               || digital       || ja&lt;br /&gt;
|-&lt;br /&gt;
|Si7005-B         || Silicon Labs            || digital       || ja&lt;br /&gt;
|-&lt;br /&gt;
|HCT01            || E+E Elektronik          || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|HC109            || E+E Elektronik          || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|HC201            || E+E Elektronik          || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|HC103M2          || E+E Elektronik          || analog        || nein&lt;br /&gt;
|-&lt;br /&gt;
|AM2321           || Aosong                  || I2C           || ja&lt;br /&gt;
|-&lt;br /&gt;
|DHT11            || Aosong                  || I2C           || ja  &lt;br /&gt;
|-&lt;br /&gt;
|AM2305           || Aosong                  || I2C           || ja&lt;br /&gt;
|-&lt;br /&gt;
|AM2301           || Aosong                  || I2C           || ja&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Sensorik]]&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Temperatursensor&amp;diff=102642</id>
		<title>Temperatursensor</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Temperatursensor&amp;diff=102642"/>
		<updated>2020-12-01T17:30:42Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* Bosch Sensortec BME280 / BME680 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Will man mit einem [[Mikrocontroller]] Temperaturen messen, dann braucht man&lt;br /&gt;
* einen [[Sensor]], der die Temperatur z.&amp;amp;nbsp;B. in eine Spannung oder einen Strom umsetzt&lt;br /&gt;
* einen [[ADC | AD-Wandler]], der das Signal digitalisiert. Der kann auf dem Sensor oder dem Mikrocontroller integriert sein.&lt;br /&gt;
&lt;br /&gt;
Temperatursensoren gibt es nun in allen möglichen Varianten. Vom temperaturabhängigen [[Widerstand]] bis zum fertig abgeglichenen All-in-one-Bauteil mit digitalem Ausgang. Wie bei allen Sensoren sollte man auch hier genau hinschauen und [[Auflösung und Genauigkeit]] unterscheiden.&lt;br /&gt;
&lt;br /&gt;
== Analoge Temperatursensoren ==&lt;br /&gt;
&lt;br /&gt;
=== PT100 ===&lt;br /&gt;
&lt;br /&gt;
Unter einem PT100 versteht man einen Platinwiderstand, der bei 0°C einen Widerstand von 100Ω hat.&lt;br /&gt;
Platinwiderstände sind temperaturabhängige Widerstände mit hoher Wiederholgenauigkeit und Konstanz[http://de.wikipedia.org/wiki/Konstante].  Wegen der relativ geringen Widerstandsänderung von nur ca. 0,4Ω pro Grad ist etwas mehr Schaltungsaufwand erforderlich als bei anderen Sensoren. Genauere Formeln zur Temperaturbestimmung gibt es u.a. bei [http://de.wikipedia.org/wiki/Pt100 Wikipedia]. Ein Schaltplan findet sich bei der [http://www.heise.de/ct/artikel/Sensibelchen-289608.html c&#039;t].&lt;br /&gt;
&lt;br /&gt;
Die Sensoren gibt es auch mit anderen Widerstandswerten, z.&amp;amp;nbsp;B. mit 1000&amp;amp;Omega; und heißen dann entsprechend PT1000.&lt;br /&gt;
&lt;br /&gt;
Vorteil:&lt;br /&gt;
* genormt&lt;br /&gt;
* großer Meßbereich&lt;br /&gt;
* hohe Linearität&lt;br /&gt;
* hohe Wiederholgenauigkeit&lt;br /&gt;
* einfach austauschbar&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* brauchen aufwändigere Auswerteschaltung&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://de.wikibooks.org/wiki/Linearisierung_von_resistiven_Sensoren/_Pt100 Wikibooks: Linearisierung von resistiven Sensoren - PT100]&lt;br /&gt;
* [https://www.heise.de/ct/artikel/Sensibelchen-289608.html c&#039;t-Artikel: Mikrocontroller-Programmierung: Timer, Sensoren und Drehgeber (mit PT100 Schaltung)]&lt;br /&gt;
* [http://www.maxim-ic.com/app-notes/index.mvp/id/3450 Maxim AN3450 Positive Analog Feedback Compensates PT100 Transducer]&lt;br /&gt;
* [http://www.maxim-ic.com/app-notes/index.mvp/id/4875 Maxim AN4875 High-Accuracy Temperature Measurements Call for Platinum Resistance Temperature Detectors (PRTDs) and Precision Delta-Sigma ADCs]&lt;br /&gt;
* [http://ww1.microchip.com/downloads/en/AppNotes/01154a.pdf Microchip AN1154 Precision RTD Instrumentation for Temperature Sensing]&lt;br /&gt;
* [http://www.analog.com/static/imported-files/application_notes/AN709_0.pdf Analog Devices AN709 RTD Interfacing and Linearization Using an ADuC8xx MicroConverter]&lt;br /&gt;
&lt;br /&gt;
=== NTC/PTC ===&lt;br /&gt;
&lt;br /&gt;
NTC und PTC sind temperaturabhängige Widerstände.&lt;br /&gt;
&lt;br /&gt;
* NTC (engl. &#039;&#039;&#039;N&#039;&#039;&#039;egative &#039;&#039;&#039;T&#039;&#039;&#039;emperature &#039;&#039;&#039;C&#039;&#039;&#039;oefficient, Heißleiter), hat bei hohen Temperaturen seinen niedrigsten Widerstand, z.&amp;amp;nbsp;B. Silizium&lt;br /&gt;
* PTC (engl. &#039;&#039;&#039;P&#039;&#039;&#039;ositive &#039;&#039;&#039;T&#039;&#039;&#039;emperature &#039;&#039;&#039;C&#039;&#039;&#039;oefficient, Kaltleiter), hat bei niedrigen Temperaturen seinen geringsten Widerstand, z.&amp;amp;nbsp;B. Glühlampe&lt;br /&gt;
&lt;br /&gt;
Um den Widerstandswert zu messen schaltet man sie mit einem normalen Widerstand oder einer [[Konstantstromquelle]] in Reihe zu einem [[Spannungsteiler]] und misst den Spannungsabfall. Eine Beispielschaltung findet sich [http://www.mathar.com/msp_thermo1.html hier].&lt;br /&gt;
&lt;br /&gt;
Vorteil:&lt;br /&gt;
* billig (z.B. [https://www.reichelt.de/index.html?ACTION=446&amp;amp;LA=446&amp;amp;SEARCH=kty81 KTY81-x] bei Reichelt  0,52-0,75 &amp;amp;euro; 2018-01-03)&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* müssen für höhere Genauigkeiten abgeglichen werden&lt;br /&gt;
* brauchen A/D-Wandler&lt;br /&gt;
* sind nichtlinear&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
* KTY10-5&lt;br /&gt;
* KTY13-6&lt;br /&gt;
* KTY81-121&lt;br /&gt;
* KTY81-122&lt;br /&gt;
* KTY81-210&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://www.sprut.de/electronic/temeratur/temp.htm Temperaturabhängige Stromquelle und NTC/PTC inclusive Linearisierung]&lt;br /&gt;
*[http://www.umnicom.de/Elektronik/Mikrokontroller/Atmel/AtFan/AtFan.html#2.2.2 Berechnung des Linearisierungswiderstandes für gewünschten Temperaturbereich] der fällt sonst immer vom Himmel&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/208587#2065880 KTY 10-5 Formelprobleme]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/225563 Codesammlung: Beispiel mit 0,5°C Auflösung]&lt;br /&gt;
* [http://preis-ing.de/extras/alle-berechnungen-im-schnellzugriff/automatisches-erzeugen-einer-ntc-tabelle/ Automatisches Erzeugen von C-Code zur NTC Auswertung] Aus den NTC Parametern und den Anforderungen wird  ein schneller und schlanker C-Code generiert.&lt;br /&gt;
&lt;br /&gt;
=== LMx35 ===&lt;br /&gt;
&lt;br /&gt;
Eine IC-Familie, die pro Kelvin Temperaturänderung ihre Ausgangsspannung um 10&amp;amp;nbsp;mV ändert. Die ICs gibt es in verschiedenen Genauigkeiten und Temperaturbereichen mit den Bezeichnungen LM135(A), LM235(A) und LM335(A). Der günstigste ist der LM335 mit einem Temperaturbereich von −40 … +100°C.&lt;br /&gt;
In verschiedenen Bauformen erhältlich. Beispielschaltungen finden sich im [http://www.national.com/ds.cgi/LM/LM135.pdf Datenblatt] und [http://www.suessbrich.info/elek/elektherm1.html hier]&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* hat auch ohne Kalibrierung eine Genauigkeit von einem Grad (bei 25°C)&lt;br /&gt;
* relativ billig (LM335 bei Reichelt ab 0,76&amp;amp;nbsp;€)&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* benötigt A/D-Wandler&lt;br /&gt;
* bei längerer Anschlussleitung störanfällig&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://www.schramm-software.de/tipps/temperaturmessung/analogsensoren.htm Test-Schaltungen und -Code zur Auswertung mit ADC (AVR-Assembler)]&lt;br /&gt;
&lt;br /&gt;
=== LM334 ===&lt;br /&gt;
&lt;br /&gt;
Ein IC ähnlich dem LM335 mit dem Unterschied, dass der durch das IC fließende Strom proportional von der Temperatur abhängt. Mit einer einfachen Schaltung aus nur zwei Widerständen kann man dann den Strom in einer Weise wandeln, dass pro Kelvin eine Spannungsänderung von 10mV ausgegeben wird. Da die Strom-Spannungswandlung auf der Platine (und damit nahe am AD-Wandler) stattfindet und die Übertragung des Messwerts durch einen Strom stattfindet, sind Störungen durch Netzbrummen etc. viel geringer als beim LM335&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
&amp;lt;!-- * hat auch ohne Kalibrierung eine Genauigkeit von einem Grad (bei 25°C) &lt;br /&gt;
Laut Datenblatt +-3°C&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
* relativ billig ([http://www.reichelt.de/?ARTICLE=10468 Reichelt 0,54 &amp;amp;euro;])&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* benötigt A/D-Wandler&lt;br /&gt;
* Bereich 0°C-70°C&lt;br /&gt;
&lt;br /&gt;
Ähnliche ICs:&lt;br /&gt;
* AD592 (Ausgangsstrom 1µA pro Kelvin, absolute Temperatur) [http://www.reichelt.de/?ARTICLE=3825 Reichelt: 3,75 €], Conrad 174912 8,50 &amp;amp;euro;&lt;br /&gt;
&lt;br /&gt;
=== SMT160-30 ===&lt;br /&gt;
&lt;br /&gt;
Ist ein Zwischending zwischen Digital und Analog. Sein Ausgangssignal ist ein digitales PWM-Signal, zu dessen Messung man am besten den Input-Capture-Eingang eines Mikrocontrollers verwendet. Man kann ihn also wie einen analogen Sensor nur indirekt auslesen, anstatt über einen AD-Wandler hier über einen Timer.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Digitales PWM-Signal ist unempfindlich gegen Störeinflüsse&lt;br /&gt;
* gibt es in SO8, TO18, TO92 und &amp;lt;b&amp;gt;TO220&amp;lt;/b&amp;gt;, gut befestigbar, z.B am Kühlkörper&lt;br /&gt;
* linear&lt;br /&gt;
* kein Abgleich nötig&lt;br /&gt;
&lt;br /&gt;
Nachteile (viele):&lt;br /&gt;
* benötigt Timer&lt;br /&gt;
* jittert extrem, genaue Messungen nur über Mittelung / Filterung möglich&lt;br /&gt;
* nicht nur das PWM-Verhältnis, sondern auch die Frequenz ist temp-abhängig (1-4kHz)&lt;br /&gt;
* teuer (Farnell 10,90&amp;amp;euro; +16%, Conrad 9,xx&amp;amp;euro; , www.hy-line.de ??).&lt;br /&gt;
* TO92 Gehäuse ist günstiger, dafür weniger genau&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* http://www.hy-line.de/co/sensor-tec/hersteller/smartec/smt-160-30/index.html&lt;br /&gt;
&lt;br /&gt;
=== Thermoelement ===&lt;br /&gt;
&lt;br /&gt;
Ein Thermoelement besteht im einfachsten Fall aus zwei ungleichen Metallendrähten, die an einem Punkt miteinander verbunden sind und bei dem die Verbindungsstelle einer anderen Temperatur ausgesetzt ist als die offenen Enden der Drähte. An den offenen Enden der Drähten entsteht eine Spannung (Thermospannung). Dieser Effekt wurde 1821 von Thomas Seebeck entdeckt ([http://de.wikipedia.org/wiki/Seebeck-Effekt Seebeck-Effekt] bei Wikipedia). Eine weitere Anwendung ist der thermoelektrische Generator (&amp;quot;Thermogenerator&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
* MCP3421 18bit ADC 15SPS, I2C, auch mit andere Auflösungen erhältlich, Thermoelement kann direkt angeschlossen werden! (Reichelt : 2,10€)&lt;br /&gt;
&lt;br /&gt;
Vorteil:&lt;br /&gt;
* über einen sehr weiten Temperaturbereich einsetzbar&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* die sehr geringen Temperaturspannungen im Mikrovoltbereich benötigen eine sehr gute Auswertelektronik (guter Analogteil + AD-Wandler). (aber: beachte MCP3421)&lt;br /&gt;
&lt;br /&gt;
* Misst nur Temperaturdifferenz&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
&amp;lt;!-- Der Link wird von NI umgebogen zur Homepage. Recherche nach dem Autor brachte nix hervor :-(&lt;br /&gt;
* [http://digital.ni.com/worldwide/germany.nsf/web/all/7A4F02BAEFEC22AC802567F6003E0D6E  Temperaturmessung mit Thermoelementen] - Eine Einführung von David Potter (deutsche Überarbeitung: G.Sinkovic) (inkl. Erläuterung der Kaltstellenkompensation) --&amp;gt;&lt;br /&gt;
* [http://www.sensorwell.at/fileadmin/templates/images/data_sheets/temperatur_messtechnik.pdf Warum Thermoelemente Relativtemperaturen messen! oder Was ist eine Kaltstelle?] - Technische Information von www.sensorwell.at (PDF, ca. 600kB)&lt;br /&gt;
&lt;br /&gt;
=== indirekte Messung über die Temperaturabhängigkeit der Schallgeschwindigkeit ===&lt;br /&gt;
&lt;br /&gt;
Acoustic Thermometry Measures Temperature To 0.1 Degree&lt;br /&gt;
http://www.linear.com/solutions/1558&lt;br /&gt;
AN131  http://www.linear.com/docs/39793 (PDF momentan nicht verfügbar) --&amp;gt;&lt;br /&gt;
http://www.mikrocontroller.net/topic/307557#new&lt;br /&gt;
&lt;br /&gt;
== Digitale Temperatursensoren ==&lt;br /&gt;
&lt;br /&gt;
=== AM2301 / DHT21 ===&lt;br /&gt;
&lt;br /&gt;
Low Cost One-Wire Sensoren&lt;br /&gt;
&lt;br /&gt;
*    Stromversorgung: DC 3.3 - 5.2 V&lt;br /&gt;
*    Ausgangssignal: 1-Draht-Bus - digitales Signal (One wire)&lt;br /&gt;
*    Sensorelement: Polymer Feuchtigkeits-Kondensator&lt;br /&gt;
*    Messbereich:    &lt;br /&gt;
*        Luftfeuchtigkeit: 0 - 100 % relative Luftfeuchte&lt;br /&gt;
*        Temperatur: -40 °C  bis +80 °C&lt;br /&gt;
*    Genauigkeit:&lt;br /&gt;
*        + - 3 % (Luftfeuchtigkeit)&lt;br /&gt;
*        + - 0.5 °C (Temperatur)&lt;br /&gt;
*    Auflösung oder Empfindlichkeit:&lt;br /&gt;
*        Feuchtigkeit 0,1 % RH&lt;br /&gt;
*        Temperatur 0.1 °C&lt;br /&gt;
&lt;br /&gt;
Relativ großer Sensor, gibt es auch kleiner als DHT11 / DHT22 mit Drahtanschlüssen.&lt;br /&gt;
DHT11 :&lt;br /&gt;
*    Genauigkeit:&lt;br /&gt;
*        + - 5 % (Luftfeuchtigkeit)&lt;br /&gt;
*        + - 2 °C (Temperatur)&lt;br /&gt;
&lt;br /&gt;
Kosten ca. 2,00 € (Ali) ... 8,00 € (deutsche eBay Versender)&lt;br /&gt;
&lt;br /&gt;
=== DS1621 ===&lt;br /&gt;
&lt;br /&gt;
Der DS1621 ist Temperatursensor und A/D-Wandler in einem. Er gibt seine Daten per [[I²C]]-[[Bus]] aus. Ein Schaltplan für einen elektronischen Thermometer mit diesem IC findet sich [http://www.myplace.nu/avr/thermo/ hier].&lt;br /&gt;
&lt;br /&gt;
Eine Library für den AVR: https://sourceforge.net/projects/ds1621avr/&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* bereits kalibriert&lt;br /&gt;
* kein A/D-Wandler nötig&lt;br /&gt;
* da I²C ein Bus ist, kann man mehrere DS1621 und andere I²C-Bausteine zusammen anschließen und braucht dafür trotzdem nur zwei I/O-Ports.&lt;br /&gt;
* Messbereich -55°C to +125°C &lt;br /&gt;
* Genauigkeit +-0,5°C&lt;br /&gt;
* Auflösung besser 0,01°C, wenn man die beiden Zählerregister (Count-Remain und Count-per-C) auswertet&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* teuer (Segor 5,80&amp;amp;euro;; RS 3,95&amp;amp;euro;; Conrad 5,22&amp;amp;euro;)&lt;br /&gt;
* obwohl die meisten Register [[Speicher#NVRAM | nichtflüchtig]] sind, kann man ihn nicht als Stand-Alone-Thermostat einsetzen, da er erst nach einem Start-Conversion-Befehl zu messen beginnt.&lt;br /&gt;
&lt;br /&gt;
Nachfolger:&lt;br /&gt;
* DS1631, DS1631A (Auto-Start-&amp;gt; Stand-Alone-Thermostat), DS1731&lt;br /&gt;
* weitere Stand-Alone-Thermostaten: DS1821, DS1629&lt;br /&gt;
&lt;br /&gt;
=== LM75 ===&lt;br /&gt;
&lt;br /&gt;
Der LM75 ist so ähnlich wie der DS1621, allerdings nur in SMD erhältlich und nicht so genau. Er ist aber öfters mal auf PC-Mainboards zu finden, so dass man beim Schlachten eines solchen günstig an einen Temperatursensor kommen kann. Eine Beispiel Schaltplan mit einem ATmega8 findet man [http://www.ucblog.de/2010/09/mikrocontroller-thermometer-schaltplan/ hier]&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* bereits kalibriert&lt;br /&gt;
* kein A/D-Wandler nötig&lt;br /&gt;
* I²C-Bus Ausgang&lt;br /&gt;
* billiger als DS1621 (Reichelt 1,45 &amp;amp;euro;; RS 3V: 3,75&amp;amp;euro;; 5V: 2,72&amp;amp;euro;)&lt;br /&gt;
* Auflösung +-0,5°C&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* nur im SMD-Gehäuse erhältlich&lt;br /&gt;
* relativ ungenau (+-2°C), kann man jedoch kalibrieren / kompensieren&lt;br /&gt;
&lt;br /&gt;
Kompatible Typen:&lt;br /&gt;
* AD7415ART&lt;br /&gt;
* DS7505S+&lt;br /&gt;
&lt;br /&gt;
=== LM76 ===&lt;br /&gt;
&lt;br /&gt;
Der LM76 ähnlich dem LM75, bietet aber eine 8-fach höhere Auflösung und eine Genauigkeit von 0.5 bzw. 1°C.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* höhere Auflösung&lt;br /&gt;
* höhere Genauigkeit&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* schwerer zu beschaffen&lt;br /&gt;
&lt;br /&gt;
=== TMP175 / TMP75 ===&lt;br /&gt;
&lt;br /&gt;
Ähnelt dem LM75 stark! Temperatursensor von Texas Instruments.&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
&lt;br /&gt;
[https://github.com/ManuelSchneid3r/RaspberryPi/blob/master/sensors/src/tmp.c Linux Kommandozeilen Tool für den Zugriff]&lt;br /&gt;
&lt;br /&gt;
=== DS18S20 / DS18B20 ===&lt;br /&gt;
&lt;br /&gt;
Der DS18S20 (Nachfolger des DS1820) und DS18B20 sind scheinbar Temperatursensoren und A/D-Wandler in einem. Wenn man genauer hinschaut, stellt man fest, dass es sich um direktwandelnde Sensoren handelt. Die Temperatur wird ohne Umweg über eine analoge Zwischengröße (Spannung oder Strom) in ein digitales Signal überführt.&lt;br /&gt;
&lt;br /&gt;
Die Datenkommunikation erfolgt über ein 1-Wire-Interface, wodurch man am [[Mikrocontroller]] mit nur einem einzigen I/O-Pin auskommen kann. Außerdem beherrschen sie die parasitäre Stromversorgung, d.h., man braucht für Daten und Stromversorgung zusammen nur zwei Leitungen.&lt;br /&gt;
&lt;br /&gt;
Beim DS18B20 sind Auflösungen von 9, 10, 11 und 12 Bits konfigurierbar. Je kleiner die Auflösung, desto kürzer ist die Messzeit. Der DS18S20 hat eine feste Auflösung von 12 Bits, wobei die unteren 4 Bits aufwändiger auszuwerten sind als beim DS18B20. Der DS18S20 ist als Ersatz für den DS1820 gedacht. Der Hersteller empfiehlt den DS18B20 für Neuentwicklungen.&lt;br /&gt;
&lt;br /&gt;
Fehlervermeidung&lt;br /&gt;
    * An jeden Sensor einen 100 nF Keramikkondensator.&lt;br /&gt;
    * Pull Up kleiner, statt 4k7 nur 2k2 oder 1k0.&lt;br /&gt;
    * Noch einen Widerstand von 10 Ohm, oder 46 ... 100 Ohm in REIHE zum AVR-Ausgang schalten, damit die Flanken flacher werden und Reflektionen unterdrückt werden.&lt;br /&gt;
    * Dünne Anschlussleitungen verwenden, damit wenig Wärme durch die Anschlussleitungen übertragen wird. z.B: 0.2mm Cu-Lack-Draht verwenden, zumindest für die letzten 5 cm.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* bereits kalibriert&lt;br /&gt;
* Genauigkeit +-0,5°C&lt;br /&gt;
* 1-Wire-Ausgang&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* Reichelt: 1,60&amp;amp;euro; / CSD: 1,59&amp;amp;euro; / Conrad 5,08&amp;amp;euro;&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
* [http://www.avr-projekte.de/ds18b20.htm Ein oder mehrere DS18B20 DS18S20 über Romcode einlesen. AVR-Assembler]&lt;br /&gt;
* [http://pic-projekte.de/wiki/index.php?title=Ansteuerung_eines_DS18S20 Ansteuern eines DS18S20 in C (PIC)]&lt;br /&gt;
* [http://pdfserv.maxim-ic.com/en/ds/DS18S20.pdf Datenblatt DS18S20] &lt;br /&gt;
* [http://pdfserv.maxim-ic.com/en/ds/DS18B20.pdf Datenblatt DS18B20]&lt;br /&gt;
* [http://www.maxim-ic.com/app-notes/index.mvp/id/4377 Vergleich DS18B20 &amp;lt;-&amp;gt; DS18S20]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/6505 Code zur Ansteuerung (ASM ATTiny12)]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/14792 Code zur Ansteuerung (AVR-GCC)]&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/494918 Fehlervermeidung]&lt;br /&gt;
* [http://gandalf.arubi.uni-kl.de/avr_projects/tempsensor/ Code zur Ansteuerung mit CRC-Prüfung (AVR-GCC)]&lt;br /&gt;
* [http://www.schramm-software.de/tipps/temperaturmessung/digitalsensoren.htm Code zur Ansteuerung mit CRC-Prüfung (AVR-Assembler)]&lt;br /&gt;
* [http://chaokhun.kmitl.ac.th/~kswichit/avrthermo/avrthermo.html LED-Thermometer mit AT90S2313 (C)]&lt;br /&gt;
* [http://www.mikrocontroller.net/forum/read-4-248219.html Webserver zur Ansteuerung von bis zu 63 Bausteinen]&lt;br /&gt;
* [http://www.teslabs.com/openplayer/docs/docs/other/ds18b20_pre1.pdf PDF Anleitung zur Beschaltung und Programmierung (C)]&lt;br /&gt;
*[http://www.digitemp.com/building.shtml Anleitung Sensorfühleraufbau (DigiTemp)]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/14792 Forumsbeitrag]: Onewire + DS18x20 Ansteuerung in C&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/232156 Forumsbeitrag]: Timing der parasitären Versorgung&lt;br /&gt;
* [https://www.mikrocontroller.net/topic/387139#4602608 Projekt]: Onewire + DS18x20 Bibliothek&lt;br /&gt;
&lt;br /&gt;
=== DS1822 ===&lt;br /&gt;
&lt;br /&gt;
Ähnlich wie DS18S20, aber weniger genau (+-2°) und in großen Stückzahlen billiger. Wegen der geringeren Verbreitung kommt der Preisvorteil aber bei Einzelstücken nicht beim Kunden an. So kostet er bei Reichelt mit 3,50&amp;amp;euro; mehr als der DS18S20.&lt;br /&gt;
&lt;br /&gt;
=== DS1921 / DS1922 ===&lt;br /&gt;
&lt;br /&gt;
Sind wie die DS1821 1-wire-Sensoren mit zusätzlicher Logging-Funktion.&lt;br /&gt;
Im iButton-Gehäuse befindet sich eine Lithium-Zelle, eine RTC, CMOS-RAM und der Temp-Sensor. Nach umfangreicher Progammierung startet der Button seine Mission (Aufzeichnung des Temperaturverlaufs).&lt;br /&gt;
Gibt es auch mit zusätzlicher Feuchtemessung (DS1923).&lt;br /&gt;
&lt;br /&gt;
=== TSic ===&lt;br /&gt;
&lt;br /&gt;
Die TSic Sensoren werden baugleich von 2 Herstellern angeboten:&lt;br /&gt;
* IST AG ([http://www.ist-ag.com/en/products-services/temperature-sensors Homepage])&lt;br /&gt;
* B+B Thermo-Technik ([https://shop.bb-sensors.com/Temperaturmesstechnik/Temperatursensoren/Digitaler-TSic-Temperatursensor-TO92.html Homepage])&lt;br /&gt;
&lt;br /&gt;
Die TSic Sensoren ([https://shop.bb-sensors.com/out/media/Datasheet_Digital_Semiconductor_temperatur_sensor_TSIC.pdf Datenblatt]) geben ihre Temperaturmessdaten automatisch in einem festen Intervall aus. Daher muss der Host nur warten bis die nächsten Messdaten rausgeschickt werden. Die TSic Sensoren die es im freien Handel gibt, geben ihre Messdaten alle 100ms (10Hz) aus. &lt;br /&gt;
Zur Übertragung wird das [http://www.ist-ag.com/eh/ist-ag/resource.nsf/imgref/Download_ZACWireAppNotes.pdf/$FILE/ZACWireAppNotes.pdf ZACwire] Protokoll benutzt. Es handelt sich um eine einfach zwei Byte Übertragung per Manchester-Code. Diese zwei Byte repräsentieren den digital gewandelten Temperaturwert. Im Gegensatz zu Sensoren wie den DS18xxx von Dallas muss dieser Wert aber erst auf einen dezimalen Wert umgerechnet werden. &lt;br /&gt;
Die Sensoren kommen mit 3 Pins aus (VCC, GND, Dout).&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Bereits kalibriert&lt;br /&gt;
* Verschiedene Genauigkeiten lieferbar&lt;br /&gt;
* Sehr einfaches Kommunikationsprotokoll&lt;br /&gt;
* Geringer Stromverbrauch&lt;br /&gt;
* Hochgenau: bis zu +/- 0.1°C (TSic 50x)&lt;br /&gt;
&lt;br /&gt;
Nachteil:&lt;br /&gt;
* Recht teuer (Reichelt: 4,70&amp;amp;euro; für den TSic206)&lt;br /&gt;
* Nur ein Sensor an einem I/O nutzbar (Kein Bussystem)&lt;br /&gt;
&lt;br /&gt;
Achtung! &lt;br /&gt;
Die TSic Sensoren gibt es auch als Version mit analog Ausgang. Bei der Typenbezeichnung gibt die 3. Stelle an ob es sich um die analog- oder Digitalversion handelt (1 = analog, 6 = digital). &lt;br /&gt;
Der TSic201 ist also analog, wärend der TSic206 ein digitaler ist.&lt;br /&gt;
&lt;br /&gt;
Links:&lt;br /&gt;
&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/283615#3025721 ZACwire Protokoll im Logic Analyzer]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/159774?goto=3157908#3157908 C-Code, (ohne Interrupt und ohne Timer) Sensor wird eingeschaltet-&amp;gt;gelesen-&amp;gt;ausgeschaltet]&lt;br /&gt;
* [http://www.avr-projekte.de/zacwireasm.htm Zacwire Protokoll, AVR-Assembler]&lt;br /&gt;
* [http://www.loetstelle.net/projekte2/tsic306/tsic306.php GCC AtMega8 Interruptgesteuerte Statemachine für TSIC206/306]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/45573#347765 Ansatz zum Empfang der Daten]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/225554# Beispiel mit Strobe ohne Interrupt]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/82087 Diskussion mit Beispielcode (MSP430, AVR, PIC) blockierend]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/144424#1367539 C++ Interrupt]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/88847 noch mehr C, problematisch Interrupt]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/151791#1426974 C für ATmega8]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/159149#1510455 auch problematisch]&lt;br /&gt;
* [http://www.mikrocontroller.net/topic/188462#1837622 fertiger Code zum Einlesen des Zacwire-Protokolls für PIC in ASM]&lt;br /&gt;
* [http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=55103 RN: Bascom]&lt;br /&gt;
* [http://www.avr-projekte.de/tinyclock.htm TSIC206 Thermometer mit Uhr und Kalender. Komplette Bauanleitung mit ASM Quellcode für AT-Tiny2313]&lt;br /&gt;
* [http://www.andeanelectronic.com/?Supporte___Arduino_con_TSic306%2CTSic506_y_TSic716 TSIC Routinen für Arduino von Andean Electronic aus Peru - Quelltext Dokumentation in Englisch]&lt;br /&gt;
&lt;br /&gt;
=== SHT3x ===&lt;br /&gt;
&lt;br /&gt;
Von [http://www.sensirion.com Sensirion] die aktuellen Versionen (2020) der Temperatur/Feuchte Sensoren&lt;br /&gt;
    &lt;br /&gt;
Vorteile:&lt;br /&gt;
* I2C&lt;br /&gt;
* Tempertur: +-0.3°C (SHT30) - +-0.1°C (SHT35)&lt;br /&gt;
* Temperaturbereich von -40 – +90°C&lt;br /&gt;
* Feuchtigkeit mit einer Genauigkeit von +-3 (SHT30) - 1.5%RH (SHT35)&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* nur als SMD-Package, gibt aber diverse Breakout-Boards zum Beispiel bei Adafruit oder Tindie [https://www.tindie.com/products/closedcube/sht35-d-digital-humidity-temperature-sensor/]&lt;br /&gt;
&lt;br /&gt;
=== SHT1x/SHT7x (End of Life) ===&lt;br /&gt;
&lt;br /&gt;
Der SHT1x/SHT7x (SHT10, SHT11, SHT15, STH71, SHT75) sind kombinierte Temperatur- und Feuchtesensoren von [http://www.sensirion.com Sensirion]. Sie unterscheiden sich in Bauform und Genauigkeit.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* digitale Schnittstelle mit einfacher [[I²C]]-&#039;&#039;ähnlicher&#039;&#039; Ansteuerung&lt;br /&gt;
* keine Kalibrierung notwendig&lt;br /&gt;
* Beispielcode (C, MC51) auf der Sensirion-Seite verfügbar (relativ leicht portierbar)&lt;br /&gt;
* interne Heizelemente (Funktionsprüfung, &amp;quot;raue&amp;quot; Umgebung)&lt;br /&gt;
* Spannungsmonitor (&amp;quot;Battery fail&amp;quot;)&lt;br /&gt;
* sehr hohe Genauigkeit&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* kann nicht am [[I²C]] Bus betrieben werden, theoretisch gleiche Clockleitung möglich, fixe Adresse&lt;br /&gt;
* relativ teuer (Farnell 18,60&amp;amp;euro;)(SHT11 bei CSD 14€)&lt;br /&gt;
&lt;br /&gt;
[http://www.sensirion.com/de/produkte/feuchte-und-temperatur/ Übersicht] der Temperatur- und Feuchtigkeitssensoren von Sensirion.&lt;br /&gt;
&lt;br /&gt;
=== SHT21 (End of Life) ===&lt;br /&gt;
&lt;br /&gt;
[http://www.sensirion.com Sensirion] bietet auch den SHT21 Feuchtigkeits- und Temperatursensor an, welcher wesentlich genauer ist.&lt;br /&gt;
    &lt;br /&gt;
Vorteile:&lt;br /&gt;
* I2C digital, PWM and SDM/analog Volt Ausgabe&lt;br /&gt;
* Maximal 5 Messungen/s @ 14bit&lt;br /&gt;
* Temperaturbereich von -40 – +125°C&lt;br /&gt;
* Feuchtigkeit mit einer Genauigkeit von +-2%RH&lt;br /&gt;
* Günstig (3-4€ Farnell/RS 2014)&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* nur als SMD-Package&lt;br /&gt;
&lt;br /&gt;
Application Notes und Datenblätter findet man [http://www.sensirion.com/en/products/humidity-temperature/humidity-sensor-sht2x/ hier].&lt;br /&gt;
&lt;br /&gt;
=== ADT7310 / ADT7xxx-Familie von AD ===&lt;br /&gt;
&lt;br /&gt;
Der [http://www.analog.com/en/sensors/digital-temperature-sensors/adt7310/products/product.html ADT7310] von [http://www.analog.com/ Analog Devices] besitzt eine Auflösung von 16 Bit und eine Genauigkeit von ±0.5°C im Bereich von −40°C bis +105°C.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Ansteuerung per [[SPI]] ADT73xx  oder  [[I2C]] ADT74xx&lt;br /&gt;
* keine Kalibrierung notwendig&lt;br /&gt;
* hohe [[Auflösung und Genauigkeit]]: 16 Bit&lt;br /&gt;
** ADT7x02 2,00°&lt;br /&gt;
** ADT7x01 1,00°&lt;br /&gt;
** ADT7x10 0,40 / 0,50°&lt;br /&gt;
** ADT7x20 0,20 / 0,25°&lt;br /&gt;
* auch für automotive / als Die lieferbar&lt;br /&gt;
* programmierbarer [[Interrupt]]ausgang für Unter- und Übertemperatur&lt;br /&gt;
* relativ günstig (ca. 3-8€ bei Digi-Key, Stand 12/2011)&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* TBD&lt;br /&gt;
&lt;br /&gt;
NB: ONsemi hat auch Temperatursensoren mit der Bezeichnung ADT7xxx, verwendet aber ein anderes Namensschema&lt;br /&gt;
&lt;br /&gt;
=== TSYS01 / G-NICO-018 von Measurement Specialties Inc. ===&lt;br /&gt;
* sehr hohe [[Auflösung und Genauigkeit]]:  0,10° @ -5°C … +50°C   16/24 Bit&lt;br /&gt;
* Gehäuse 16-VQFN Exposed Pad&lt;br /&gt;
* SPI / I2C über Pin auswählbar&lt;br /&gt;
* Preis: 8,60 (4,40 @1k) bei Digikey&lt;br /&gt;
kleiner Nachteil: der Sensor liefert den ADC-Wert und die Kompensationskonstanten (5 Polynom-Koeffizienten), mit denen im µC die Temperatur berechnet werden muss.&lt;br /&gt;
&lt;br /&gt;
=== SE95 ===&lt;br /&gt;
&lt;br /&gt;
Der [http://www.nxp.com/documents/data_sheet/SE95.pdf SE95] von NXP hat 13 Bit Auflösung, Genauigkeit ±2°C im Messbereich von -55°C bis +125°C, I²C, Gehäuse SO8 und TSSOP8. Einzelstück-Preis bei Segor 1,50€ (2012/I)&lt;br /&gt;
&lt;br /&gt;
=== Bosch Sensortec BMP085 / BMP180 ===&lt;br /&gt;
Die BMP085 (bzw. der verbesserte, aber Pin- und Software-komapatible Nachfolger BMP180) sind eigentlich Luftdrucksensoren, die jedoch auch einen Temperatursensor mitbringen. Der Anschluss erfolgt über I2C.&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Wenig Stromverbrauch (5µA bei 1 Messung/s)&lt;br /&gt;
* Liefern Luftdruck gleich mit&lt;br /&gt;
* Absolute Genauigkeit (+-1°C typ. über kompletten Temperaturbereich). Relative Genauigkeit ist im Datenblatt nicht spezifiziert, gemessen gegen einen SHT11 ca. +-0.1°C. &lt;br /&gt;
* Auflösung: 0.1°C mit Herstellercode, mehr ist möglich (16Bit)&lt;br /&gt;
* Fertige Platinen für wenig Geld verfügbar (ca. 1,70€ inkl. Versand aus China)&lt;br /&gt;
&lt;br /&gt;
Nachteile:&lt;br /&gt;
* Sehr aufwändige Linearisierung (Kalibrationskoeffizienten sind im Sensor gespeichert, müssen aber vom Host-µC verrechnet werden. Code ist im Datenblatt)&lt;br /&gt;
* Nur als SMD&lt;br /&gt;
* Bei Reichelt und Conrad nicht erhältlich. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Preis: Ebay 1,70€ (mit Platine, China), Aliexpress 1,10€ (nackter Chip, China, mind. 10 Stück sonst auch ca. 1,70€)&lt;br /&gt;
&lt;br /&gt;
=== Bosch Sensortec BME280 / BME680 ===&lt;br /&gt;
* I2C-Sensor für Temperatur, Luftfeuchtigkeit, Luftdruck (BME680 = BME280 + Luftgüte)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Vorteile:&lt;br /&gt;
* Breakout-Board BME280 Aliexpress ~2,20€, BME680 Watterott 15,95€&lt;br /&gt;
* Bosch-eigene Bibliotheken für gängige Mikrocontroller, Android und RaspberryPi&lt;br /&gt;
* Arduino-Bibliotheken von Adafruit, Sparkfun und Watterott&lt;br /&gt;
* Minimaler Platzbedarf&lt;br /&gt;
* SMT ermöglicht doppelseite Platine mit BME280/BME680 auf Frontseite und restlicher Elektronik auf Rückseite&lt;br /&gt;
&lt;br /&gt;
Nachteile&lt;br /&gt;
* Ball-Grid-Array Reflow, manuelles Löten nur mit Breakout-Board oder Vias möglich&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bibliotheken/Datenblätter/Herstellerinformation:&lt;br /&gt;
* BME280: https://www.bosch-sensortec.com/bst/products/all_products/bme280&lt;br /&gt;
* BME680: https://www.bosch-sensortec.com/bst/products/all_products/bme680&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Projekte/Code&lt;br /&gt;
* [ASM] [https://www.mikrocontroller.net/topic/506743#6473604 BME280 mit OLED Display am ATmega808]&lt;br /&gt;
* [ASM] [https://www.mikrocontroller.net/topic/506743#6495985 BME280 mit OLED Display am ATtiny85]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Preis: BME280 / BME680 Reichelt 5,20€ / 9,45€, Conrad 8,33€ / xxx, Aliexpress ~2,50€ / ~15,-€&lt;br /&gt;
&lt;br /&gt;
=== HDC1080 ===&lt;br /&gt;
Der HDC1080 von Texas Instruments kombiniert einen digitalen Luftfeuchtesensor mit Temperaturmessung. Der Anschluss erfolgt über IC2.&lt;br /&gt;
&lt;br /&gt;
Merkmale:&lt;br /&gt;
* geringe Stromaufnahme (1,3 µA bei 1 Messung/s)&lt;br /&gt;
* gleichzeitige Luftfeuchtemessung möglich&lt;br /&gt;
* Spannungsversorgung: 2,7 bis 5,5 V&lt;br /&gt;
* Genauigkeit: +/-0,2 °C typ. (im Temperaturbereich zwischen 5 bis 60 °C)&lt;br /&gt;
* Auflösung Temperatur: 11/14 bit wählbar&lt;br /&gt;
* Maximale Dauer einer Messung: 6,5 ms&lt;br /&gt;
* eingebautes Heizelement (gegen Feuchtigkeitskondensation, per Konfigurationsregister einschaltbar)&lt;br /&gt;
* Herstellerseitig kalibriert&lt;br /&gt;
* einfache Umrechnung&lt;br /&gt;
* Gehäuse: SMD 6-Pin PWSON (3x3 mm)&lt;br /&gt;
&lt;br /&gt;
Erhältich als Pmod (&#039;&#039;PmodHygro&#039;&#039; von Digilentic) und in Breakoutboards zahlreicher anderer Hersteller.&lt;br /&gt;
&lt;br /&gt;
== Preisübersicht ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Preisübersicht 11/2012&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
! Bauteil   || Segor || RS-Components || Conrad || Farnell || Reichelt || DigiKey&lt;br /&gt;
|-&lt;br /&gt;
| AD592     || 21,40 || 5,74          || 6,43   || 5,90    || 3,95     || 4,61&lt;br /&gt;
|-&lt;br /&gt;
| ADT7310   ||  -    || -             || -      || 4,56    || -        || 3,02&lt;br /&gt;
|-&lt;br /&gt;
| ADT7410   ||  -    || 3,35          || -      || 2,71    || -        || 3,02&lt;br /&gt;
|-&lt;br /&gt;
| DS1621    ||  7,60 || 5,29          || 5,08   || 5,65    || -        || 4,54&lt;br /&gt;
|-&lt;br /&gt;
| DS1629    ||  8,70 || 8,68          || -      || 5,00    || 6,50     || 7,65&lt;br /&gt;
|-&lt;br /&gt;
| DS1631    ||  8,00 || 2,91          || -      || 3,11    || -        || 3,94&lt;br /&gt;
|-&lt;br /&gt;
| DS1731    ||  -    || -             || -      || 9,79    || -        || 3,81&lt;br /&gt;
|-&lt;br /&gt;
| DS1821    ||  5,90 || 5,27          || 6,27   || -       || -        || 5,05&lt;br /&gt;
|-&lt;br /&gt;
| DS18B20   ||  2,50 || 3,06          || -      || 3,26    || 3,20     || 3,93&lt;br /&gt;
|-&lt;br /&gt;
| DS1921    ||  -    || 26,15         || -      || -       || -        || 21,13&lt;br /&gt;
|-&lt;br /&gt;
| DS1922    ||  -    || 62,00         || -      || -       || -        || 43,11&lt;br /&gt;
|-&lt;br /&gt;
| DS1923    ||  -    || 97,96         || -      || -       || -        || 80,30&lt;br /&gt;
|-&lt;br /&gt;
| KTY81/121 ||  -    || -             || -      || 0,79    || 0,59     || 0,85&lt;br /&gt;
|-&lt;br /&gt;
| LM75      ||  1,50 || 0,68          || 3,64   || 0,81    || 1,45     || 0,82&lt;br /&gt;
|-&lt;br /&gt;
| LM76      ||  -    || 2,83          || -      || 3,02    || -        || 2,39&lt;br /&gt;
|-&lt;br /&gt;
| LM135     || 10,10 || 10,28         || -      || 8,95    || 7,95     || 10,26&lt;br /&gt;
|-&lt;br /&gt;
| LM235     ||  -    || -             || -      || 1,80    || 1,40     || 1,26&lt;br /&gt;
|-&lt;br /&gt;
| LM334     ||  0,90 || 0,72          || 1,67   || 1,01    || 0,49     || 0,74&lt;br /&gt;
|-&lt;br /&gt;
| LM335     ||  1,30 || 0,56          || 1,92   || 0,55    || 0,71     || 0,80&lt;br /&gt;
|-&lt;br /&gt;
| PT100     ||  3,80 || 3,99          || 4,00   || 9,79    || 4,27     || 0,68&lt;br /&gt;
|-&lt;br /&gt;
| SE95      ||  1,50 || 0,63          || -      || 1,45    || -        || 1,00&lt;br /&gt;
|-&lt;br /&gt;
| SHT11     || 26,00 || 24,38         || 33,20  || 25,65   || -        || 36,76&lt;br /&gt;
|-&lt;br /&gt;
| SHT15     ||  -    || 27,69         || 36,30  || 28,72   || -        || -&lt;br /&gt;
|-&lt;br /&gt;
| SHT21     || 29,50 || 18,10         || -      || 21,16   || -        || -&lt;br /&gt;
|-&lt;br /&gt;
| SHT71     || 25,40 || 29,06         || 36,89  || 30,88   || -        || -&lt;br /&gt;
|-&lt;br /&gt;
| SHT75     ||  -    || 33,77         || 42,48  || 35,52   || -        || -&lt;br /&gt;
|-&lt;br /&gt;
| SMT160-30 ||  -    || 9,28          || 8,14   || 12,38   || -        || -&lt;br /&gt;
|-&lt;br /&gt;
| TMP75     ||  -    || 0,80          || -      || 0,85    || -        || 1,37&lt;br /&gt;
|-&lt;br /&gt;
| TSic206   ||  -    || -             || 5,84   || -       || 4,20     || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [https://www.mikrocontroller.net/forum/mikrocontroller-elektronik?filter=temperatur* Beiträge im Forum]&lt;br /&gt;
* [[Feuchtesensor]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Sensorik]]&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102641</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102641"/>
		<updated>2020-12-01T17:04:24Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* Wie funktioniert das ganze? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, werden diese so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102640</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102640"/>
		<updated>2020-12-01T13:27:18Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* signed x signed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102639</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102639"/>
		<updated>2020-12-01T13:24:25Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* signed x unsigned */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102638</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102638"/>
		<updated>2020-12-01T13:23:02Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* mul_32x32_64 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102637</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102637"/>
		<updated>2020-12-01T13:20:19Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* _muls_24x24_48 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x24 -&amp;gt; 48 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102636</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102636"/>
		<updated>2020-12-01T13:19:30Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* signed x signed */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102635</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102635"/>
		<updated>2020-12-01T13:16:41Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* signed x unsigned */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102634</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102634"/>
		<updated>2020-12-01T13:15:30Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* _mulsu_32x8_40 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102633</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102633"/>
		<updated>2020-12-01T13:14:23Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* unsigned x unsigned */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102632</id>
		<title>Multiplikation in Assembler</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Multiplikation_in_Assembler&amp;diff=102632"/>
		<updated>2020-12-01T13:13:26Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* MACRO */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Steffen H.&lt;br /&gt;
&lt;br /&gt;
Dies ist eine Sammlung von verschiedenen Assembler Include-Datein für einen 8-Bit AVR zur Multiplikation in Hardware oder Software.&lt;br /&gt;
&lt;br /&gt;
== Einleitung ==&lt;br /&gt;
&lt;br /&gt;
Ich habe diesen Wiki zur &#039;&#039;&#039;Multiplikation in Assembler&#039;&#039;&#039; erstellt da ich hauptsächlich Programmschnipsel für eine &amp;quot;unsigned&amp;quot; Multiplikation gefunden habe oder diese nicht in der benötigten Bytegröße vorhanden war. Deshalb findet ihr hier verschiedene Sub-Programme zur &amp;quot;unsigned&amp;quot; und &amp;quot;signed&amp;quot; Multiplikation.&lt;br /&gt;
&lt;br /&gt;
== Wie funktioniert das ganze? ==&lt;br /&gt;
Die Sub-Programme sind Include Dateien. Diese müssen im .cseg Teil des Programms eingebunden werden. Liegen diese Include Datein im Hauptverzeichnis des Assembler Projektes, also da wo auch die &amp;quot;main.asm&amp;quot; liegt, so eingebunden:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Man kann die Include-Dateien aber auch an beliebiger anderer Stelle ablegen. Dann müssen diese aber mit voller Baumstruktur eingebunden werden. Beispiel:&lt;br /&gt;
 &amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.include  &amp;quot;C:\AVR\Libraries\Datei.inc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für die reinen Software Lösungen ist eine Datei Namens &#039;&#039;&#039;&amp;quot;sw_mul.inc&amp;quot;&#039;&#039;&#039; vor allen anderen MUL-Includes einzubinden. Und die Software &lt;br /&gt;
MUL-Includes unterscheiden sich zu den Hardware MUL-Includes im vorangestellten &#039;&#039;&#039;&amp;quot;_&amp;quot;&#039;&#039;&#039; wie zum Beispiel _muls_32x16_48.inc.&lt;br /&gt;
&lt;br /&gt;
Der Aufbau des Dateinamens ist schon fast selbsterklärend.&lt;br /&gt;
*mul     -&amp;gt; unsigned x unsigned Multiplikation&lt;br /&gt;
*mulsu -&amp;gt; signed x unsigned Multiplikation&lt;br /&gt;
*muls   -&amp;gt; signed x signed Multiplikation&lt;br /&gt;
&lt;br /&gt;
Dann kommt die Byte-Größe wie zum Beispiel _32x16 und dann die Result-Größe _48.&lt;br /&gt;
Die Eingangsbytes sind dabei fest vorgeschrieben! Und die &#039;&#039;&#039;Unteren r11..r0 Register werden zerstört&#039;&#039;&#039;. Wer diese in Benutzung hat, sollte diese vorher sichern.&lt;br /&gt;
&lt;br /&gt;
Was es noch zu beachten gibt, sind eventuelle Änderungen an &amp;quot;rcall&#039;s&amp;quot; die in &amp;quot;calls&amp;quot; umgewandelt werden müssen wenn die Sprungadresse zum Unterprogramm mehr als 2000 Byte Programmcounter entfernt ist. Dies bemängelt dann aber das Atmel Studio in einer Fehlermeldung.&lt;br /&gt;
&lt;br /&gt;
== Benutzte Register ==&lt;br /&gt;
&lt;br /&gt;
In allen Include Dateien werden nach folgendem Muster die Register wie folgt benutzt:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!MULT !! r23!! r22!! r21!! r20!! r19!! r18!! r17!! r16!! r9!! r8!! r7!! r6!! r5!! r4!! r3!! r2&lt;br /&gt;
|-&lt;br /&gt;
|16x8||  ||  ||A1||A0||  ||  || ||B0||  ||  ||  ||  || || E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 16x16||  ||  || A1|| A2||  ||  || B1|| B0||  ||  ||  ||  || E3|| E2 || E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x8||  || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  ||  || E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x16||  || A2|| A1|| A0||  ||  || B1|| B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 24x24||  || A2|| A1|| A0||  || B2|| B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x8|| A3 || A2|| A1|| A0||  ||  ||  || B0||  ||  ||  || E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x16|| A3 || A2|| A1|| A0||  ||  || B1|| B0||  ||  || E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x24|| A3 || A2|| A1|| A0||  || B2|| B1|| B0||  || E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|-&lt;br /&gt;
| 32x32|| A3 || A2|| A1|| A0|| B3|| B2|| B1|| B0|| E7|| E6|| E5|| E4|| E3|| E2|| E1|| E0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Software Version ==&lt;br /&gt;
=== MACRO ===&lt;br /&gt;
&lt;br /&gt;
Hier muss vorher zwingend die &amp;quot;sw_mult.inc&amp;quot; Datei eingebunden werden. Diese besteht teilweise aus Makros um die in den weiteren MUL-Include-Dateien verwendeten Funktionen nutzen zu können. Vor allem die richtige Erzeugung des &#039;&#039;&#039;Z&#039;&#039;&#039;ero und &#039;&#039;&#039;C&#039;&#039;&#039;arry &#039;&#039;&#039;Flags&#039;&#039;&#039;!&lt;br /&gt;
{{Scrollbox|20em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.macro mul_&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        ;mul Befehl in Software als Makro&lt;br /&gt;
        ;---------------------------------&lt;br /&gt;
        clr     r1      ;Ergebnis = 0&lt;br /&gt;
        push    @0      ;Multiplikant wegspeichern&lt;br /&gt;
        sec             ;Multiplikant ersetzt gleichzeitig den Schleifenzähler&lt;br /&gt;
        ror     @0      ;Eine 1 rein, LSB raus&lt;br /&gt;
        rjmp    mul2    ;Beim 1. Durchgang, gleich LSB auswerten&lt;br /&gt;
mul1:   lsr     @0      ;Bit (von 1..7 Niederwertige zuerst) ins Carry (Multiplikand)&lt;br /&gt;
        breq    mul4    ;Wenn die 1 von sec (oben) wieder im Carry ist, Ende&lt;br /&gt;
mul2:   brcc    mul3    ;Wenn 0, Addition überspringen&lt;br /&gt;
        add     r1,@1   ;Ansonsten Multiplikator ins Highbyte addieren&lt;br /&gt;
mul3:   ror     r1      ;Produkt mit evt. Übertrag nach rechts schieben&lt;br /&gt;
        ror     r0&lt;br /&gt;
        rjmp    mul1    ;Noch ne Runde (von insgesamt 8)&lt;br /&gt;
mul4:   push	r16&lt;br /&gt;
		in		r16,SREG&lt;br /&gt;
		andi	r16,0x80&lt;br /&gt;
		out		SREG,r16&lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		sec&lt;br /&gt;
		pop		r16&lt;br /&gt;
		pop     @0      ;Multiplikant zurückholen&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
.macro	muls_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		clt&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		clr		r17  &lt;br /&gt;
		sbrc	r1,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r0,7&lt;br /&gt;
		inc		r17&lt;br /&gt;
		sbrc	r17,0&lt;br /&gt;
		set&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		rcall	_muls_&lt;br /&gt;
		andi	r17,0x82&lt;br /&gt;
		sbrc	r17,SREG_Z	&lt;br /&gt;
		rjmp	PC+3&lt;br /&gt;
		brtc	PC+2&lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_muls_:	sub		r1,r1			; clear result High byte and carry&lt;br /&gt;
		ldi		r18,8			; init loop counter&lt;br /&gt;
_m8s_1:	brcc	_m8s_2			; if carry (previous bit) set&lt;br /&gt;
		add		r1,r16			; add multiplicand to result High byte&lt;br /&gt;
_m8s_2:	sbrc	r0,0			; if current bit set&lt;br /&gt;
		sub		r1,r16			; subtract multiplicand from result High&lt;br /&gt;
		asr		r1				; shift right result High byte&lt;br /&gt;
		ror		r0				; shift right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18				; decrement loop counter&lt;br /&gt;
		brne	_m8s_1			; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&lt;br /&gt;
.macro	mulsu_&lt;br /&gt;
		push	r16&lt;br /&gt;
		push	r17&lt;br /&gt;
		push	r18&lt;br /&gt;
		mov		r1,@0&lt;br /&gt;
		mov		r0,@1&lt;br /&gt;
		mov		r16,r1&lt;br /&gt;
		clt&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		set&lt;br /&gt;
		sbrc	r16,7&lt;br /&gt;
		neg		r16&lt;br /&gt;
		rcall	_mulsu_&lt;br /&gt;
		andi	r17,0x83&lt;br /&gt;
		brtc	PC+6&lt;br /&gt;
		com		r1&lt;br /&gt;
		com		r0&lt;br /&gt;
		ldi		r16,1	&lt;br /&gt;
		add		r0,r16&lt;br /&gt;
		adc		r1,r18&lt;br /&gt;
		sbrc	r1,7   &lt;br /&gt;
		sbr		r17,(1&amp;lt;&amp;lt;SREG_C)&lt;br /&gt;
		out		SREG,r17	&lt;br /&gt;
		pop		r18&lt;br /&gt;
		pop		r17&lt;br /&gt;
		pop		r16&lt;br /&gt;
.endm&lt;br /&gt;
&lt;br /&gt;
_mulsu_:clr		r1			;clear result High byte&lt;br /&gt;
		ldi		r18,8		;init loop counter&lt;br /&gt;
		lsr		r0			;rotate multiplier	&lt;br /&gt;
m8su_1:	brcc	m8su_2		; carry set &lt;br /&gt;
		add 	r1,r16		; add multiplicand to result High byte&lt;br /&gt;
m8su_2:	ror		r1			; rotate right result High byte&lt;br /&gt;
		ror		r0			; rotate right result L byte and multiplier&lt;br /&gt;
		in		r17,SREG&lt;br /&gt;
		dec		r18			; decrement loop counter&lt;br /&gt;
		brne	m8su_1		; if not done, loop more&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mul_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul_ 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul_ 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul_ 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul_ 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul_ 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul_ 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul_ 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul_	R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul_	R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
&lt;br /&gt;
==== _muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== _muls_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls_	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul_	R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu_	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu_	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu_	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul_	R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu_	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu_	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu_	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls_	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul_	R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls_	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul_	R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu_	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x24_56 ====&lt;br /&gt;
&lt;br /&gt;
==== _muls_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul_	R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul_	R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul_	R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls_	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul_	R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul_	R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu_	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Hardware Version ==&lt;br /&gt;
=== unsigned x unsigned ===&lt;br /&gt;
==== mul_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mul_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*	&lt;br /&gt;
;*	Scrached Register:	R10,R11,R12,R13,R14&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mul32x32_64:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	R12&lt;br /&gt;
		push	R13&lt;br /&gt;
		push	R14&lt;br /&gt;
		clr		R14&lt;br /&gt;
&lt;br /&gt;
;   R9:R2 = R19:R16 * R23:R20&lt;br /&gt;
&lt;br /&gt;
		sub R14,R14                  ; Null&lt;br /&gt;
                      &lt;br /&gt;
		mul 	R20,R16                ; AXL*BXL&lt;br /&gt;
		movw 	R3:R2,R1:R0&lt;br /&gt;
		mul 	R21,R17                ; AL*BL&lt;br /&gt;
		movw 	R5:R4,R1:R0&lt;br /&gt;
		mul 	R22,R18                ; AM*BM&lt;br /&gt;
		movw 	R7:R6,R1:R0  &lt;br /&gt;
		mul 	R23,R19                ; AH*BH&lt;br /&gt;
		movw 	R9:R8,R1:R0&lt;br /&gt;
&lt;br /&gt;
		mul 	R22,R19                ; AH*BM&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R21,R18                ; AM*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R17                ; AL*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R18                ; AM*BH&lt;br /&gt;
		movw 	R13:R12,R1:R0&lt;br /&gt;
		mul 	R22,R17                ; AL*BM&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R21,R16                ; AXL*BL&lt;br /&gt;
&lt;br /&gt;
		add 	R3, R0&lt;br /&gt;
		adc 	R4, R1&lt;br /&gt;
		adc 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R12&lt;br /&gt;
		adc 	R8,R13&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R21,R19                ; AH*BL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R20,R18                ; AM*BXL&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R23,R17                ; AL*BH&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R22,R16                ; AXL*BM&lt;br /&gt;
&lt;br /&gt;
		add 	R4, R0&lt;br /&gt;
		adc 	R5, R1&lt;br /&gt;
		adc 	R6, R10&lt;br /&gt;
		adc 	R7, R11&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		mul 	R20,R19                ; AH*BXL&lt;br /&gt;
		movw 	R11:R10,R1:R0&lt;br /&gt;
		mul 	R23,R16                ; AXL*BH&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R0&lt;br /&gt;
		adc 	R6, R1&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
&lt;br /&gt;
		add 	R5, R10&lt;br /&gt;
		adc 	R6, R11&lt;br /&gt;
		adc 	R7, R14&lt;br /&gt;
		adc 	R8,R14&lt;br /&gt;
		adc 	R9,R14&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== signed x unsigned ===&lt;br /&gt;
==== mulsu_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
mulsu_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E0&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E0&lt;br /&gt;
		mul		R21,R16			; AL x BL	&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;*****************************************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*&lt;br /&gt;
;*			signed  x  unsigned&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*******************************************************************************&lt;br /&gt;
mulsu_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mulsu	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mul		R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mul		R17,R22			; BH x AM&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== mulsu_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== mulsu_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== signed x signed ===&lt;br /&gt;
==== muls_16x8_24 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== muls_16x16_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
;*&lt;br /&gt;
;* FUNCTION&lt;br /&gt;
;*	muls16x16_32&lt;br /&gt;
;* DECRIPTION&lt;br /&gt;
;*	Signed multiply of two 16bits numbers with 32bits result.&lt;br /&gt;
;* USAGE		E3:E2:E1:E0 =  AH:AL  *  BH:BL&lt;br /&gt;
;*				r5:r4:r3:r2 = r21:r20 * r17:r16&lt;br /&gt;
;* STATISTICS&lt;br /&gt;
;*	Cycles :	19 + ret&lt;br /&gt;
;*	Words :		15 + ret&lt;br /&gt;
;*	Scrached Register usage: r6&lt;br /&gt;
;* NOTE&lt;br /&gt;
;*	The routine is non-destructive to the operands.&lt;br /&gt;
;*&lt;br /&gt;
;******************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls_16x16:&lt;br /&gt;
		push	R6&lt;br /&gt;
		clr		R6&lt;br /&gt;
		muls	R21,R17			; (signed)ah * (signed)bh&lt;br /&gt;
		movw	R5:R4,R1:R0&lt;br /&gt;
		mul		R20,R16			; al * bl&lt;br /&gt;
		movw	R3:R2,R1:R0&lt;br /&gt;
		mulsu	R21, R16		; (signed)ah * bl&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		mulsu	R17, R20		; (signed)bh * al&lt;br /&gt;
		sbc		R5, R6&lt;br /&gt;
		add		R3, R0&lt;br /&gt;
		adc		R4, R1&lt;br /&gt;
		adc		R5, R6&lt;br /&gt;
		pop		R6&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x8_32 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x8 -&amp;gt; 32 bit&lt;br /&gt;
;*       AH  AM  AL   BL     E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R16 -&amp;gt; R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls24x8_32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mulsu	R16,R20			; AL x BL -&amp;gt; BL x AL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R16			; AH x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x16_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R17:R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x16:&lt;br /&gt;
		push	R10		&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		mov		R5,R0			; r0 -&amp;gt; E3&lt;br /&gt;
		mov		R6,R1			; r1 -&amp;gt; E4&lt;br /&gt;
		clr		R4				;clr -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AL x BH  -&amp;gt;  BH x AL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T3&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R3,R0			; r0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; r1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T3 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T4&lt;br /&gt;
		add		R4,R0			; r0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; r1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T4 -&amp;gt; E4&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_24x24_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 24x16 -&amp;gt; 64 bit&lt;br /&gt;
;*       AH  AM  AL   BH  BM  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*      R22:R21:R20 x R18:R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_24x24:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R22,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R22,R17			; AH x BM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R21,R16			; AM x BL&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R18,R21			; AM x BH  -&amp;gt;  BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T1:T0&lt;br /&gt;
		mul		R20,R17			; AL x BM&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R8			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R9			; T1 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R22,R16			; AH x BL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R18,R20			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T2&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T2&lt;br /&gt;
		adc		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T2 -&amp;gt; E4&lt;br /&gt;
		adc		R7,R10			; T2 -&amp;gt; E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x8_40 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x8 -&amp;gt; 40 bit&lt;br /&gt;
;*       AH  AM  AL AXL   BL     E4 E3 E2 E1 E0&lt;br /&gt;
;*      R23:R22:R21:R20 x R16 -&amp;gt; R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  19 cycles + 4 (RET) = 23 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x8:&lt;br /&gt;
		push	R10&lt;br /&gt;
		clr		R10&lt;br /&gt;
		clr		R6&lt;br /&gt;
		clr		r5&lt;br /&gt;
		clr		r4&lt;br /&gt;
		mulsu	R16,R20			; BL x AXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mulsu	R16,R21			; BL x AL	&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T0&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R3,R0			; R0 -&amp;gt; E1&lt;br /&gt;
		adc		R4,R1			; R1 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R10			; T0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		mulsu	R16,R22			; BL x AM&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T0&lt;br /&gt;
		add		R4,R0			; R0 -&amp;gt; E2&lt;br /&gt;
		adc		R5,R1			; R1 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R10			; T0 -&amp;gt; E4&lt;br /&gt;
		muls	R16,R23			; BL x AH&lt;br /&gt;
		add		R5,R0			; R0 -&amp;gt; E3&lt;br /&gt;
		adc		R6,R1			; R1 -&amp;gt; E4&lt;br /&gt;
		pop		R10&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x16_48 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x16 -&amp;gt; 48 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BL     E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R17:R16 -&amp;gt; R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  56 cycles + 4 (RET) = 60 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x16:&lt;br /&gt;
		push	R8&lt;br /&gt;
		push	R9&lt;br /&gt;
		push	R10	&lt;br /&gt;
		clr		R10&lt;br /&gt;
		mul		R20,R16			; AXL x BL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R22,R16			; AM x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		muls	R23,R17			; AH x BH&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BL&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; T4:T3&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5	&lt;br /&gt;
		mul		R21,R16			; AL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R8			; T3 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R9			; T4 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
&lt;br /&gt;
		mulsu	R17,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R5,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T5 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		sbc		R6,R10			; signed DUMMY T5&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T5 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		&lt;br /&gt;
		mulsu	R17,R22			; BH x AM&lt;br /&gt;
		sbc		R7,R10			; signed DUMMY T5&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R10			; T5 +c -&amp;gt; + E5&lt;br /&gt;
		pop		R10&lt;br /&gt;
		pop		R9&lt;br /&gt;
		pop		R8	&lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== muls_32x24_56 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== muls_32x32_64 ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt;&lt;br /&gt;
;***************************************************&lt;br /&gt;
;* Mutiply 32x32 -&amp;gt; 64 bit&lt;br /&gt;
;*  AH   AM  AL AXL   BH  BM  BL  BXL    E7 E6 E5 E4 E3 E2 E1 E0&lt;br /&gt;
;*  R23:R22:R21:R20 x R19:R18:R17:R16 -&amp;gt; R9:R8:R7:R6:R5:R4:R3:R2&lt;br /&gt;
;*&lt;br /&gt;
;*  108 cycles + 4 (RET) = 112 Cycles&lt;br /&gt;
;*&lt;br /&gt;
muls_32x32:&lt;br /&gt;
		push	R10&lt;br /&gt;
		push	R11&lt;br /&gt;
		push	r12&lt;br /&gt;
		push	r13&lt;br /&gt;
		push	r14&lt;br /&gt;
		clr		R14&lt;br /&gt;
		mul		R20,R16			; AXL x BXL&lt;br /&gt;
		movw	R3:R2,R1:R0		; r1:r0 -&amp;gt; E1:E0&lt;br /&gt;
		mul		R21,R17			; AL x BL&lt;br /&gt;
		movw	R5:R4,R1:R0		; r1:r0 -&amp;gt; E3:E2&lt;br /&gt;
		mul		R22,R18			; AM x BM&lt;br /&gt;
		movw	R7:R6,R1:R0		; r1:r0 -&amp;gt; E5:E4&lt;br /&gt;
		muls	R23,R19			; AH x BH&lt;br /&gt;
		movw	R9:R8,R1:R0		; r1:r0 -&amp;gt; E7:E6&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R18			; AH x BM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R17			; AM x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R21,R16			; AL x BXL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R22			; AM x BH -&amp;gt; BH x AM&lt;br /&gt;
		movw	R13:R12,R1:R0	; r1:r0 -&amp;gt; T5:T4&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R21,R18			; AL x BM&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		mul		R20,R17			; AXL x BL&lt;br /&gt;
		add		R3,R0			; r0 ----&amp;gt; + E1&lt;br /&gt;
		adc		R4,R1			; r1 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R10			; T2 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R11			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R12			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R13			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R17			; AH x BL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R20,R18			; AXL x BM&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R21			; AL x BH -&amp;gt; BH x AL&lt;br /&gt;
		movw	R11:R10,R1:R0	; r1:r0 -&amp;gt; T3:T2&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		mul		R22,R16			; AM x BXL&lt;br /&gt;
		add		R4,R0			; r0 +c -&amp;gt; + E2&lt;br /&gt;
		adc		R5,R1			; r1 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R10			; T3 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R11			; T4 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T5 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R19,R20			; AXL x BH -&amp;gt; BH x AXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
&lt;br /&gt;
		mulsu	R23,R16			; AH x BXL&lt;br /&gt;
		sbc		R9,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R8,R14			; signed DUMMY T6&lt;br /&gt;
		sbc		R7,R14			; signed DUMMY T6&lt;br /&gt;
		add		R5,R0			; r0 +c -&amp;gt; + E3&lt;br /&gt;
		adc		R6,R1			; r1 +c -&amp;gt; + E4&lt;br /&gt;
		adc		R7,R14			; T6 +c -&amp;gt; + E5&lt;br /&gt;
		adc		R8,R14			; T6 +c -&amp;gt; + E6&lt;br /&gt;
		adc		R9,R14			; T6 +c -&amp;gt; + E7&lt;br /&gt;
		pop		R14&lt;br /&gt;
		pop		R13&lt;br /&gt;
		pop		R12&lt;br /&gt;
		pop		R11&lt;br /&gt;
		pop		R10  &lt;br /&gt;
		ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
*[[Datei:MULT ASM.zip|miniatur]]&lt;br /&gt;
&lt;br /&gt;
== Diskkussion ==&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Arithmetik&amp;diff=102628</id>
		<title>AVR Arithmetik</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Arithmetik&amp;diff=102628"/>
		<updated>2020-11-30T20:47:50Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* Sammlungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Artikel beschäftigt sich mit 16- und 32-Bit Arithmetik auf [[AVR]]-Controllern. Für detailierte Ausführungen zur [[AVR-Tutorial: Arithmetik8|8-Bit Arithmetik auf AVR]] gibt es eine Seite im [[AVR-Tutorial]].&lt;br /&gt;
&lt;br /&gt;
== Glossar ==&lt;br /&gt;
&lt;br /&gt;
MSB: Most Significant Byte, Höchstwertiges Byte&lt;br /&gt;
&lt;br /&gt;
LSB: Least Significant Byte, Niedrigstwertiges Byte&lt;br /&gt;
&lt;br /&gt;
== Vergleich ==&lt;br /&gt;
&lt;br /&gt;
=== 16 Bit ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ;              LSB  MSB         LSB  MSB&lt;br /&gt;
    ; Vergleiche &amp;lt; r16, r17 &amp;gt; mit &amp;lt; r20, r21 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    cp    r16, r20&lt;br /&gt;
    cpc   r17, r21&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 32 Bit ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ;              LSB            MSB         LSB            MSB&lt;br /&gt;
    ; Vergleiche &amp;lt; r16, r17, r18, r19 &amp;gt; mit &amp;lt; r20, r21, r22, r23 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    cp    r16, r20&lt;br /&gt;
    cpc   r17, r21&lt;br /&gt;
    cpc   r18, r22&lt;br /&gt;
    cpc   r19, r23&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Addition==&lt;br /&gt;
===16 Bit + 16 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ; &amp;lt; r16, r17 &amp;gt; = &amp;lt; r16, r17 &amp;gt; + &amp;lt; r20, r21 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    add   r16, r20&lt;br /&gt;
    adc   r17, r21&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===32 Bit + 32 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ; &amp;lt; r16, r17, r18, r19 &amp;gt; = &amp;lt; r16, r17, r18, r19 &amp;gt; + &amp;lt; r20, r21, r22, r23 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    add   r16, r20&lt;br /&gt;
    adc   r17, r21&lt;br /&gt;
    adc   r18, r22&lt;br /&gt;
    adc   r19, r23&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Subtraktion==&lt;br /&gt;
===16 Bit - 16 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ; &amp;lt; r16, r17 &amp;gt; = &amp;lt; r16, r17 &amp;gt; - &amp;lt; r20, r21 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    sub   r16, r20&lt;br /&gt;
    sbc   r17, r21&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===32 Bit - 32 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ;   LSB            MSB       LSB            MSB       LSB            MSB&lt;br /&gt;
    ; &amp;lt; r16, r17, r18, r19 &amp;gt; = &amp;lt; r16, r17, r18, r19 &amp;gt; - &amp;lt; r20, r21, r22, r23 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    sub   r16, r20&lt;br /&gt;
    sbc   r17, r21&lt;br /&gt;
    sbc   r18, r22&lt;br /&gt;
    sbc   r19, r23&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Division==&lt;br /&gt;
===32 Bit / 32 Bit===&lt;br /&gt;
&lt;br /&gt;
Ergebnis gerundet, und mit Restbildung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.def	a0	= r16&lt;br /&gt;
.def	a1	= r17&lt;br /&gt;
.def	a2	= r18&lt;br /&gt;
.def	a3	= r19&lt;br /&gt;
&lt;br /&gt;
.def	b0	= r20&lt;br /&gt;
.def	b1	= r21&lt;br /&gt;
.def	b2	= r22&lt;br /&gt;
.def	b3	= r23&lt;br /&gt;
&lt;br /&gt;
.def	t0	= r24&lt;br /&gt;
.def	t1	= r25&lt;br /&gt;
.def	t2	= r26&lt;br /&gt;
.def	t3	= r27&lt;br /&gt;
&lt;br /&gt;
.def	t4	= r28&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned rounded division 32 bit                *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
&lt;br /&gt;
urdiv32:&lt;br /&gt;
	mov	t0, b0		;T = B&lt;br /&gt;
	mov	t1, b1&lt;br /&gt;
	mov	t2, b2&lt;br /&gt;
	mov	t3, b3&lt;br /&gt;
	lsr	t3		;B / 2&lt;br /&gt;
	ror	t2&lt;br /&gt;
	ror	t1&lt;br /&gt;
	ror	t0&lt;br /&gt;
	add	a0, t0		;A = A + B / 2&lt;br /&gt;
	adc	a1, t1&lt;br /&gt;
	adc	a2, t2&lt;br /&gt;
	adc	a3, t3&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned division 32 bit                        *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
&lt;br /&gt;
; a3..0 = a3..0 / b3..0 (Ganzzahldivision)&lt;br /&gt;
; b3..0 = a3..0 % b3..0 (Rest)&lt;br /&gt;
&lt;br /&gt;
; cycle: max 684&lt;br /&gt;
&lt;br /&gt;
udiv32:&lt;br /&gt;
	clr	t0&lt;br /&gt;
	clr	t1&lt;br /&gt;
	clr	t2&lt;br /&gt;
	clr	t3&lt;br /&gt;
	ldi	t4, 32&lt;br /&gt;
udi1:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t0&lt;br /&gt;
	rol	t1&lt;br /&gt;
	rol	t2&lt;br /&gt;
	rol	t3&lt;br /&gt;
	cp	t0, b0&lt;br /&gt;
	cpc	t1, b1&lt;br /&gt;
	cpc	t2, b2&lt;br /&gt;
	cpc	t3, b3&lt;br /&gt;
	brcs	udi2&lt;br /&gt;
	sub	t0, b0&lt;br /&gt;
	sbc	t1, b1&lt;br /&gt;
	sbc	t2, b2&lt;br /&gt;
	sbc	t3, b3&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi2:	dec	t4&lt;br /&gt;
	brne	udi1&lt;br /&gt;
	mov	b0, t0&lt;br /&gt;
	mov	b1, t1&lt;br /&gt;
	mov	b2, t2&lt;br /&gt;
	mov	b3, t3&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Version, die je nach konkreten Zahlen Rechenzeit einspart&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.def	a0	= r16&lt;br /&gt;
.def	a1	= r17&lt;br /&gt;
.def	a2	= r18&lt;br /&gt;
.def	a3	= r19&lt;br /&gt;
&lt;br /&gt;
.def	b0	= r20&lt;br /&gt;
.def	b1	= r21&lt;br /&gt;
.def	b2	= r22&lt;br /&gt;
.def	b3	= r23&lt;br /&gt;
&lt;br /&gt;
.def	t0	= r24&lt;br /&gt;
.def	t1	= r25&lt;br /&gt;
.def	t2	= r26&lt;br /&gt;
.def	t3	= r27&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned rounded division 32 bit                *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
&lt;br /&gt;
urdiv32:&lt;br /&gt;
	mov	t0, b0		;T = B&lt;br /&gt;
	mov	t1, b1&lt;br /&gt;
	mov	t2, b2&lt;br /&gt;
	mov	t3, b3&lt;br /&gt;
	lsr	t3		;B / 2&lt;br /&gt;
	ror	t2&lt;br /&gt;
	ror	t1&lt;br /&gt;
	ror	t0&lt;br /&gt;
	add	a0, t0		;A = A + B / 2&lt;br /&gt;
	adc	a1, t1&lt;br /&gt;
	adc	a2, t2&lt;br /&gt;
	adc	a3, t3&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned division 32 bit                        *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;cycle: max 431 (63%) (684)&lt;br /&gt;
&lt;br /&gt;
udiv32:&lt;br /&gt;
	clr	t1&lt;br /&gt;
	tst	b3&lt;br /&gt;
	breq	udi10&lt;br /&gt;
	ldi	t0, 8&lt;br /&gt;
udi1:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t1&lt;br /&gt;
	cp	a1, b0&lt;br /&gt;
	cpc	a2, b1&lt;br /&gt;
	cpc	a3, b2&lt;br /&gt;
	cpc	t1, b3&lt;br /&gt;
	brcs	udi2&lt;br /&gt;
	sub	a1, b0&lt;br /&gt;
	sbc	a2, b1&lt;br /&gt;
	sbc	a3, b2&lt;br /&gt;
	sbc	t1, b3&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi2:	dec	t0&lt;br /&gt;
	brne	udi1&lt;br /&gt;
	mov	b0, a1&lt;br /&gt;
	clr	a1&lt;br /&gt;
	mov	b1, a2&lt;br /&gt;
	clr	a2&lt;br /&gt;
	mov	b2, a3&lt;br /&gt;
	clr	a3&lt;br /&gt;
	mov	b3, t1&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
udi10:	tst	b2&lt;br /&gt;
	breq	udi20&lt;br /&gt;
	ldi	t0, 16&lt;br /&gt;
udi11:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t1&lt;br /&gt;
	brcs	udi12&lt;br /&gt;
	cp	a2, b0&lt;br /&gt;
	cpc	a3, b1&lt;br /&gt;
	cpc	t1, b2&lt;br /&gt;
	brcs	udi13&lt;br /&gt;
udi12:	sub	a2, b0&lt;br /&gt;
	sbc	a3, b1&lt;br /&gt;
	sbc	t1, b2&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi13:	dec	t0&lt;br /&gt;
	brne	udi11&lt;br /&gt;
	mov	b0, a2&lt;br /&gt;
	clr	a2&lt;br /&gt;
	mov	b1, a3&lt;br /&gt;
	clr	a3&lt;br /&gt;
	mov	b2, t1&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
udi20:	tst	b1&lt;br /&gt;
	breq	udi30&lt;br /&gt;
	ldi	t0, 24&lt;br /&gt;
udi21:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t1&lt;br /&gt;
	brcs	udi22&lt;br /&gt;
	cp	a3, b0&lt;br /&gt;
	cpc	t1, b1&lt;br /&gt;
	brcs	udi23&lt;br /&gt;
udi22:	sub	a3, b0&lt;br /&gt;
	sbc	t1, b1&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi23:	dec	t0&lt;br /&gt;
	brne	udi21&lt;br /&gt;
	mov	b0, a3&lt;br /&gt;
	clr	a3&lt;br /&gt;
	mov	b1, t1&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
udi30:	ldi	t0, 32&lt;br /&gt;
udi31:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t1&lt;br /&gt;
	brcs	udi32&lt;br /&gt;
	cp	t1, b0&lt;br /&gt;
	brcs	udi33&lt;br /&gt;
udi32:	sub	t1, b0&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi33:	dec	t0&lt;br /&gt;
	brne	udi31&lt;br /&gt;
	mov	b0, t1			;store remainder&lt;br /&gt;
	ret&lt;br /&gt;
;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Multiplikation==&lt;br /&gt;
===32 Bit * 16 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.def	a0	= r16&lt;br /&gt;
.def	a1	= r17&lt;br /&gt;
.def	a2	= r18&lt;br /&gt;
.def	a3	= r19&lt;br /&gt;
&lt;br /&gt;
.def	b0	= r20&lt;br /&gt;
.def	b1	= r21&lt;br /&gt;
.def	b2	= r22&lt;br /&gt;
.def	b3	= r23&lt;br /&gt;
&lt;br /&gt;
.def	t0	= r24&lt;br /&gt;
.def	t1	= r25&lt;br /&gt;
.def	t2	= r26&lt;br /&gt;
.def	t3	= r27&lt;br /&gt;
.def	i0	= r28&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned multiplication 32 bit                  *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;cycle: max 245&lt;br /&gt;
&lt;br /&gt;
umul32:&lt;br /&gt;
	cpi	a3, 0&lt;br /&gt;
	cpc	a3, a2&lt;br /&gt;
	breq	_umu1		;one operand must be below 65536&lt;br /&gt;
	mov	t0, a0		; swap A &amp;lt;-&amp;gt; B&lt;br /&gt;
	mov	a0, b0&lt;br /&gt;
	mov	b0, t0&lt;br /&gt;
	mov	t0, a1&lt;br /&gt;
	mov	a1, b1&lt;br /&gt;
	mov	b1, t0&lt;br /&gt;
	mov	b2, a2&lt;br /&gt;
	mov	b3, a3&lt;br /&gt;
	clr	a2&lt;br /&gt;
	clr	a3&lt;br /&gt;
;				a3,2,1,0 = a1,0 * b3,2,1,0&lt;br /&gt;
_umu1:	ldi	i0, 16&lt;br /&gt;
	clr	t0&lt;br /&gt;
	clr	t1&lt;br /&gt;
	ror	a1&lt;br /&gt;
	ror	a0&lt;br /&gt;
_umu2:	brcc	_umu3&lt;br /&gt;
	add	a2, b0&lt;br /&gt;
	adc	a3, b1&lt;br /&gt;
	adc	t0, b2&lt;br /&gt;
	adc	t1, b3&lt;br /&gt;
_umu3:	ror	t1&lt;br /&gt;
	ror	t0&lt;br /&gt;
	ror	a3&lt;br /&gt;
	ror	a2&lt;br /&gt;
	ror	a1&lt;br /&gt;
	ror	a0&lt;br /&gt;
	dec	i0&lt;br /&gt;
	brne	_umu2&lt;br /&gt;
	ret&lt;br /&gt;
;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===24 Bit * 24 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;**********************************************************************************************&lt;br /&gt;
;&lt;br /&gt;
;  muls24x24_48:&lt;br /&gt;
;  Signed Multiply von 2 24Bit breiten Zahlen mit 48Bit ergebnis&lt;br /&gt;
;&lt;br /&gt;
;  x                       = a           * b&lt;br /&gt;
;  R21:R20:R19:R18:R17:R16 = R27:R26:R25 * R24:R23:R22&lt;br /&gt;
;  hi                  lo    hi      lo    hi      lo&lt;br /&gt;
;&lt;br /&gt;
;**********************************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls24x24_48:&lt;br /&gt;
    clr    r2          ;Zero Register&lt;br /&gt;
    muls  r27,r24        ; (1) signed Multiply a(MSB) * b(MSB)&lt;br /&gt;
    movw   r20,r0&lt;br /&gt;
&lt;br /&gt;
    mul    r26,r23        ; (2) unsigned&lt;br /&gt;
    movw   r18,r0&lt;br /&gt;
&lt;br /&gt;
    mul    r25,r22        ; (3) unsigned multiply a(LSB) * b(LSB)&lt;br /&gt;
    movw   r16,r0&lt;br /&gt;
&lt;br /&gt;
    mul    r26,r22        ;(4) unsigned&lt;br /&gt;
    add    r17,r0&lt;br /&gt;
    adc    r18,r1&lt;br /&gt;
    adc    r19,r2&lt;br /&gt;
    adc    r20,r2&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    mul    r25,r23        ;(5) unsigned&lt;br /&gt;
    add    r17,r0&lt;br /&gt;
    adc    r18,r1&lt;br /&gt;
    adc    r19,r2&lt;br /&gt;
    adc    r20,r2&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    push  r16&lt;br /&gt;
    push  r17&lt;br /&gt;
&lt;br /&gt;
    mov    r16,r27&lt;br /&gt;
    mulsu  r16,r22        ;(6) unsigned * signed&lt;br /&gt;
    sbc    r20,r2&lt;br /&gt;
    sbc    r21,r2&lt;br /&gt;
    add    r18,r0&lt;br /&gt;
    adc    r19,r1&lt;br /&gt;
    adc    r20,r2&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    mulsu  r16,r23        ;(7) unsigned * signed&lt;br /&gt;
    sbc    r21,r2&lt;br /&gt;
    add    r19,r0&lt;br /&gt;
    adc    r20,r1&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    movw   r16,r24&lt;br /&gt;
    mulsu  r16,r17        ;(8) unsigned * signed&lt;br /&gt;
    sbc    r20,r2&lt;br /&gt;
    sbc    r21,r2&lt;br /&gt;
    add    r18,r0&lt;br /&gt;
    adc    r19,r1&lt;br /&gt;
    adc    r20,r2&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    mov    r17,r26&lt;br /&gt;
    mulsu  r16,r17        ;(9) unsigned * signed&lt;br /&gt;
    sbc    r21,r2&lt;br /&gt;
    add    r19,r0&lt;br /&gt;
    adc    r20,r1&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    pop    r17&lt;br /&gt;
    pop    r16&lt;br /&gt;
    ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Weiterführende Links ===&lt;br /&gt;
*[https://www.mikrocontroller.net/articles/Multiplikation_in_Assembler Multiplikation in Assembler] - Enthält schon viele kleine Multiplikations-Include-Dateien für den AVR Assembler&lt;br /&gt;
&lt;br /&gt;
==Wurzel==&lt;br /&gt;
&lt;br /&gt;
=== avr-gcc Implementierung (32 Bit) ===&lt;br /&gt;
Quadratwurzel basierend auf einer Implementierung von Ruud v Gessel&amp;lt;ref&amp;gt;[http://members.chello.nl/j.beentjes3/Ruud/sqrt32avr.htm Ruud v Gessel: Quadratwurzeln]&amp;lt;/ref&amp;gt;, die zusammen mit avr-gcc verwendet werden kann. Je nach Algorithmus wird das  Ergebnis zum Nächsten gerundet oder abgerundet. Abrunden ist dann angesagt, wenn die Wurzel aus einer großen Eingabe wie &amp;lt;tt&amp;gt;0xffffffff&amp;lt;/tt&amp;gt; zu ziehen ist, da bei Aufrunden hier das Ergebnis zu 0 überläuft.&lt;br /&gt;
&lt;br /&gt;
Die maximale Ausführungszeit ist höchstens 310 Ticks (inclusive CALL+RET):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;sqrt32.h&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef SQRT32_H&lt;br /&gt;
#define SQRT32_H&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
extern uint16_t sqrt32_round (uint32_t);&lt;br /&gt;
extern uint16_t sqrt32_floor (uint32_t);&lt;br /&gt;
&lt;br /&gt;
#endif /* SQRT32_H */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C-Module, welche die Wurzel benötigen, includen einfach diesen Header. Das Assembler-Modul wird assembliert und zum Projekt hinzugelinkt.&lt;br /&gt;
&lt;br /&gt;
==== Rundung zum Nächsten ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Ressourcen-Verbrauch, Rundung zum Nächsten&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;Flash&#039;&#039;&#039;    || 82 Bytes&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;RAM&#039;&#039;&#039;      || 2&amp;amp;ndash;3 Bytes dynamisch, 0 Bytes statisch&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;Laufzeit&#039;&#039;&#039; || 265&amp;amp;ndash;310 Ticks (inclusive Zeiten für CALL+RET)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sqrt32.S&#039;&#039;&#039; (sqrt32_round)&lt;br /&gt;
{{Scrollbox|25em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------&lt;br /&gt;
; Fast and short 32 bits AVR sqrt routine, avr-gcc ABI compliant&lt;br /&gt;
; R25:R24 = SQRT (R25:R24:R23:R22) rounded to the &lt;br /&gt;
; nearest integer (0.5 rounds up)&lt;br /&gt;
; Destroys R18-R19,R22-R23,R26-R27&lt;br /&gt;
; Cycles incl call &amp;amp; ret = 265-310&lt;br /&gt;
; Stack incl call = 2-3&lt;br /&gt;
;-----------------------------------------------------------&lt;br /&gt;
.text&lt;br /&gt;
.global sqrt32_round&lt;br /&gt;
.type sqrt32_round, @function&lt;br /&gt;
&lt;br /&gt;
sqrt32_round:&lt;br /&gt;
    ldi   R19, 0xc0&lt;br /&gt;
    clr   R18          ; rotation mask in R19:R18&lt;br /&gt;
    ldi   R27, 0x40&lt;br /&gt;
    sub   R26, R26     ; developing sqrt in R27:R26, C=0&lt;br /&gt;
1:  brcs  2f           ; C --&amp;gt; Bit is always 1&lt;br /&gt;
    cp    R24, R26&lt;br /&gt;
    cpc   R25, R27     ; Does test value fit?&lt;br /&gt;
    brcs  3f           ; C --&amp;gt; nope, bit is 0&lt;br /&gt;
2:  sub   R24, R26&lt;br /&gt;
    sbc   R25, R27     ; Adjust argument for next bit&lt;br /&gt;
    or    R26, R18&lt;br /&gt;
    or    R27, R19     ; Set bit to 1&lt;br /&gt;
3:  lsr   R19&lt;br /&gt;
    ror   R18          ; Shift right mask, C --&amp;gt; end loop&lt;br /&gt;
    eor   R27, R19&lt;br /&gt;
    eor   R26, R18     ; Shift right only test bit in result&lt;br /&gt;
    rol   R22          ; Bit 0 only set if end of loop&lt;br /&gt;
    rol   R23&lt;br /&gt;
    rol   R24&lt;br /&gt;
    rol   R25          ; Shift left remaining argument (C used at 1:)&lt;br /&gt;
    sbrs  R22, 0       ; Skip if 15 bits developed&lt;br /&gt;
    rjmp  1b           ; Develop 15 bits of the sqrt&lt;br /&gt;
    brcs  4f           ; C--&amp;gt; Last bits always 1&lt;br /&gt;
    cp    R26, R24&lt;br /&gt;
    cpc   R27, R25     ; Test for last bit 1&lt;br /&gt;
    brcc  5f           ; NC --&amp;gt; bit is 0&lt;br /&gt;
4:  sbc   R23, R19     ; Subtract C (any value from 1 to 0x7f will do)&lt;br /&gt;
    sbc   R24, R26&lt;br /&gt;
    sbc   R25, R27     ; Update argument for test&lt;br /&gt;
    inc   R26          ; Last bit is 1&lt;br /&gt;
5:  lsl   R23          ; Only bit 7 matters&lt;br /&gt;
    rol   R24&lt;br /&gt;
    rol   R25          ; Remainder * 2 + C&lt;br /&gt;
    brcs  6f           ; C --&amp;gt; Always round up&lt;br /&gt;
    cp    R26, R24&lt;br /&gt;
    cpc   R27, R25     ; C decides rounding&lt;br /&gt;
6:  adc   R26, R19&lt;br /&gt;
    adc   R27, R19     ; Round up if C (R19=0)&lt;br /&gt;
    mov   R25, R27     ; return in R25:R24 for avr-gcc ABI compliance&lt;br /&gt;
    mov   R24, R26&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
.size sqrt32_round, .-sqrt32_round&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Abrunden ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Ressourcen-Verbrauch, Abrunden&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;Flash&#039;&#039;&#039;    || 60 Bytes&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;RAM&#039;&#039;&#039;      || 2&amp;amp;ndash;3 Bytes dynamisch, 0 Bytes statisch&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;Laufzeit&#039;&#039;&#039; || 260&amp;amp;ndash;300 Ticks (inclusive Zeiten für CALL+RET)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sqrt32.S&#039;&#039;&#039; (sqrt32_floor)&lt;br /&gt;
{{Scrollbox|25em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
;  Fast and short 32 bits AVR sqrt routine, avr-gcc ABI compliant&lt;br /&gt;
;  R25:R24 = SQRT (R25:R24:R23:R22) &lt;br /&gt;
;  rounded down to integer&lt;br /&gt;
;     Destroys R26,R27,R22,R23,R18,R19&lt;br /&gt;
;  Cycles incl call &amp;amp; ret = 260-300&lt;br /&gt;
;  Stack incl call = 2-3&lt;br /&gt;
.text&lt;br /&gt;
.global sqrt32_floor&lt;br /&gt;
.type sqrt32_floor, @function&lt;br /&gt;
&lt;br /&gt;
sqrt32_floor:&lt;br /&gt;
    ldi   R19, 0xc0&lt;br /&gt;
    clr   R18               ; rotation mask in R19:R18&lt;br /&gt;
    ldi   R27, 0x40&lt;br /&gt;
    sub   R26, R26          ; developing sqrt in R27:R26, C=0&lt;br /&gt;
1:  brcs  2f                ; C --&amp;gt; Bit is always 1&lt;br /&gt;
    cp    R24, R26&lt;br /&gt;
    cpc   R25, R27          ; Does test value fit?&lt;br /&gt;
    brcs  3f                ; C --&amp;gt; nope, bit is 0&lt;br /&gt;
2:  sub   R24, R26&lt;br /&gt;
    sbc   R25, R27          ; Adjust argument for next bit&lt;br /&gt;
    or    R26, R18&lt;br /&gt;
    or    R27, R19          ; Set bit to 1&lt;br /&gt;
3:  lsr   R19&lt;br /&gt;
    ror   R18               ; Shift right mask, C --&amp;gt; end loop&lt;br /&gt;
    eor   R27, R19&lt;br /&gt;
    eor   R26, R18          ; Shift right only test bit in result&lt;br /&gt;
    rol   R22               ; Bit 0 only set if end of loop&lt;br /&gt;
    rol   R23&lt;br /&gt;
    rol   R24&lt;br /&gt;
    rol   R25               ; Shift left remaining argument (C used at 1:)&lt;br /&gt;
    sbrs  R22, 0            ; Skip if 15 bits developed&lt;br /&gt;
    rjmp  1b                ; Develop 15 bits of the sqrt&lt;br /&gt;
&lt;br /&gt;
    brcs  4f                ; C--&amp;gt; Last bits always 1&lt;br /&gt;
    lsl   R23               ; Need bit 7 in C for cpc&lt;br /&gt;
    cpc   R26, R24&lt;br /&gt;
    cpc   R27, R25          ; After this C is last bit&lt;br /&gt;
&lt;br /&gt;
4:  adc   R26, R19          ; Round up if C (R19=0)&lt;br /&gt;
    mov   R25, R27          ; return in R25:R24 as for avr-gcc ABI&lt;br /&gt;
    mov   R24, R26&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
.size sqrt32_floor, .-sqrt32_floor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== avr-gcc Implementierung (16 Bit) ===&lt;br /&gt;
&lt;br /&gt;
Falls eine MUL-Instruktion vorhanden ist, benötigt eine 16-Bit Implementierung der Quadratwurzel nur eine handvoll Instruktionen und kann einigermassen bequem in Inline-Assembler geschrieben werden. Der Assembler-Teil besteht lediglich aus 9&amp;amp;nbsp;Instruktionen und dauert unabhängig vom Eingabewert 80&amp;amp;nbsp;Ticks.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sqrt16_floor&#039;&#039;&#039; (Braucht MUL, Inline-Assembler und auf Größe optimiert)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#if defined (__AVR_ENHANCED__)&lt;br /&gt;
&lt;br /&gt;
static inline uint8_t&lt;br /&gt;
sqrt16_floor (uint16_t q)&lt;br /&gt;
{&lt;br /&gt;
    uint8_t res = 0;&lt;br /&gt;
    uint8_t mask = 1 &amp;lt;&amp;lt; 7;&lt;br /&gt;
    &lt;br /&gt;
    asm(&amp;quot;0:	add  %[res], %[mask]&amp;quot;   &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	mul  %[res], %[res]&amp;quot;    &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	cp   %A[q], R0&amp;quot;         &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	cpc  %B[q], R1&amp;quot;         &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	brsh 1f&amp;quot;                &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	sub  %[res], %[mask]&amp;quot;   &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;1:	lsr  %[mask]&amp;quot;           &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	brne 0b&amp;quot;                &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	clr  __zero_reg__&amp;quot;&lt;br /&gt;
        : [res] &amp;quot;+r&amp;quot; (res), [mask] &amp;quot;+r&amp;quot; (mask)&lt;br /&gt;
        : [q] &amp;quot;r&amp;quot; (q));&lt;br /&gt;
        &lt;br /&gt;
    return res;&lt;br /&gt;
}&lt;br /&gt;
#endif // __AVR_ENHANCED__&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es handelt sich um eine größenoptimierte Version eines Algorithmus&#039; von Marko Surup, siehe &#039;&#039;[http://www.mikrocontroller.net/topic/231332#2338343 Forum: AVR: 16-Bit Quadratwurzel in 63 Takten]&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C-Variante&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die C-Variante verbraucht auf einem ATmega etwa 25 Instruktionen und 120 Ticks inclusive Funktionsaufruf und Parameteraufbereitung (getestet mit avr-gcc 4.6 und auf Größe optimiert):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uint8_t c_sqrt16 (uint16_t q)&lt;br /&gt;
{&lt;br /&gt;
    uint8_t r, mask;&lt;br /&gt;
    uint8_t i = 8*sizeof (r) -1;&lt;br /&gt;
&lt;br /&gt;
    r = mask = 1 &amp;lt;&amp;lt; i;&lt;br /&gt;
    &lt;br /&gt;
    for (; i &amp;gt; 0; i--)&lt;br /&gt;
    {&lt;br /&gt;
        mask &amp;gt;&amp;gt;= 1;&lt;br /&gt;
        &lt;br /&gt;
        if (q &amp;lt; (uint16_t) r*r)&lt;br /&gt;
            r -= mask;&lt;br /&gt;
        else&lt;br /&gt;
            r += mask;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (q &amp;lt; (uint16_t) r*r)&lt;br /&gt;
        r -= 1;&lt;br /&gt;
    &lt;br /&gt;
    return r;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Binär zu BCD - Umwandlung==&lt;br /&gt;
Zur Ausgabe einer Binärzahl auf ein Textdisplay oder zur seriellen ASCII-Übertragung an den PC ist diese Umwandlung nötig. Sie ist ähnlich aufwendig wie eine Division, zum Beispiel für eine 32-Bit-Zahl etwa 500-900 Taktzyklen und 10 Register.&lt;br /&gt;
Mehrere Verfahren werden angeboten:&lt;br /&gt;
=== Division /10===&lt;br /&gt;
Für eine Division pro Dezimalstelle ist nur ein Unterprogramm nötig. Der Divisionsrest, engl. remainder, bildet unmittelbar die BCD-codierte Dezimalziffer, von rechts nach links fortschreitend. Zur Ausgabe von links nach rechts kann man die Ziffern auf dem Stack zwischenlagern (LIFO-Register last-in first-out)&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
*[http://www.atmel.com/dyn/resources/prod_documents/doc0938.pdf AVR204: BCD Arithmetics, 8-Bit Binary to 2-digit BCD Conversion]&lt;br /&gt;
&lt;br /&gt;
===Division /10000, /1000, /100, /10===&lt;br /&gt;
ähnlich dem vorigen, aber die BCD-Ziffern erscheinen sofort von links nach rechts.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
*[http://users.i.com.ua/~birua/math32.asm Bin2BCD == 16-bit Binary to BCD conversion in der Macrolibrary Math32 von Andre Birua]&lt;br /&gt;
*[http://avr-asm.tripod.com/math32x.html oder auch hier zu finden]&lt;br /&gt;
&lt;br /&gt;
===Addition von $33===&lt;br /&gt;
Hier wird die Binärzahl, mit der höchstwertigen Stelle voran, von rechts in die Ergebnisregister geschoben. Nach jedem Schiebevorgang wird eine Korrekturrechnung ausgeführt. Für 32 Bit bilden 4 Eingabe- und 5 Ausgaberegister ein 72 Bit Schieberegister, das 32 mal links geschoben wird.&lt;br /&gt;
Durch die Korrekturrechnung wird die Binärzahl zur gepackten (2 Stellen pro Byte) BCD-Zahl &amp;quot;aufgebläht&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Eine Erklärung des Algorithmus soll hier versucht werden: &lt;br /&gt;
Um die niederwertigste 4 Bit Binärziffer in BCD umzuwandeln, ist für $0...$9 keine Änderung nötig, für $A...$F wird &amp;quot;6&amp;quot; addiert. Diese Addition wird ersetzt durch eine Addition von &amp;quot;3&amp;quot; und anschließendes Linksschieben. Das führt man zunächst für beide Halbbytes gleichzeitig mit &amp;quot;subi Reg,-$33&amp;quot; aus. Anschließend werden die beiden Additionen einzeln für den Fall &amp;quot;0...9&amp;quot; rückgängig gemacht. Die Bits 4 und 7 des Registers dient dabei als BCD-Carry-Flag (Halbbyte-Übertrag). Das normale C-Flag wird durch die Additionen nicht beeinflußt, es dient nur dem Schiebevorgang.&lt;br /&gt;
&lt;br /&gt;
Beispiele: &lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc0938.pdf AVR204: BCD Arithmetics 16 Bit Binary to 5-digit BCD conversion]&lt;br /&gt;
* [http://avr-asm.tripod.com/math32x.html The AVR Assembler Site: 32 Bit Math]&lt;br /&gt;
* [http://www.ingelec.uns.edu.ar/dclac2558/BCD2BIN.PDF Der gleiche serielle Algorithmus für Xilinx CPLDs]&lt;br /&gt;
&lt;br /&gt;
===Tabelle===&lt;br /&gt;
Für kleine Zahlen kann die gesuchte BCD-Zahl auch aus einer Tabelle entnommen werden.&lt;br /&gt;
===Mischvarianten===&lt;br /&gt;
Eine Mischung mehrerer Verfahren wird z.&amp;amp;nbsp;B. von Andre Birua in der ersten Variante von &amp;quot;Bin4BCD&amp;quot; verwendet. Die oberen 16 Bit werden nach &amp;quot;Div/10000&amp;quot; vorbearbeitet und anschließend alle 32 Bit nach &amp;quot;Add $33&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Tutorial===&lt;br /&gt;
*[http://www.cs.uiowa.edu/~jones/bcd/decimal.html Part of  the Arithmetic Tutorial Collection by Douglas W. Jones] &lt;br /&gt;
enthält C-Code und PIC-Code für schnelle 16 Bit Wandlung, Hardware-Multiplizierer möglich - auch für FPGA interessant&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/TTL74185 VHDL Nachbau des TTL 74185 6-Bit Binär-zu-BCD-Wandlers]&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/Festkommaarithmetik Tutorial Festkommaarithmetik]&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige  Tutorial 7-Segment-Anzeige]&lt;br /&gt;
&lt;br /&gt;
=== Sammlungen ===&lt;br /&gt;
*[https://www.mikrocontroller.net/articles/Datei:DataCast.zip Data Castings] - Sammlung Include-Dateien zum konverieren von int zu ASCII-Char, ASCII-HEX oder ASCII-BIN [ASM]&lt;br /&gt;
&lt;br /&gt;
===Diskussionsbeiträge im Forum===&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/85248 Binär-zu-BCD in VHDL]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/83884 ebenfalls VHDL]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/59851 32 Bit in C]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/64842 16 und 32 Bit C und AVR-Assembler]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/1501 Assembler für AVR-GCC bis 256 Bit]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/173633 2 hoch x , wenn x kein Integer ist]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/230317 schnelle dezimale Division auf AVR &amp;amp; Co.]&lt;br /&gt;
&lt;br /&gt;
== Sinus und Cosinus ==&lt;br /&gt;
&amp;amp;rarr; siehe [[AVR Arithmetik/Sinus und Cosinus (CORDIC)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;rarr; siehe [[AVR Arithmetik/Sinus und Cosinus (Lineare Interpolation)]]&lt;br /&gt;
&lt;br /&gt;
== Saturierung ==&lt;br /&gt;
&amp;amp;rarr; siehe [[AVR Arithmetik/Saturierung]]&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks==&lt;br /&gt;
* [http://faculty.capitol-college.edu/~andresho/tutor/Multimedia/AVR/HW_mult/avr201.htm AVR201: Using the AVR Hardware Multiplier] (Implementierung und Beispiele)&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc1631.pdf AVR201: Using the AVR Hardware Multiplier] (Application Note, pdf, en)&lt;br /&gt;
* [http://www.azillionmonkeys.com/qed/sqroot.html Wurzelfunktion]&lt;br /&gt;
* [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=printview&amp;amp;t=37150&amp;amp;start=40 Optimierte Division durch 10]&lt;br /&gt;
* [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=printview&amp;amp;t=54192&amp;amp;start=20 Optimierte Division durch 3]&lt;br /&gt;
* [http://www.cs.uiowa.edu/~jones/bcd/divide.html Division durch reziproke Multiplikation, Tutorial]&lt;br /&gt;
* [http://web.archive.org/web/20080519123741/http://users.i.com.ua/~birua/math32.html Math32: Some Useful Assembler Multibyte Maths  Subroutines &amp;amp; Macrocalls] [http://avr-asm.tripod.com/math32x.html (oder hier)]&lt;br /&gt;
*[http://elm-chan.org/cc_e.html Elm-Chan&#039;s Bibliotheken u.a. Arithmetik]&lt;br /&gt;
* [http://www.embedded.com/design/opensource/217900224?printable=true Multiplication by a Fixed Point Constant], Embedded.com, 06/16/09&lt;br /&gt;
* [http://surfnet.dl.sourceforge.net/sourceforge/avrfix/avrfix.pdf M. Rosenblattl, A. Wolf: &#039;&#039;Fixed Point Library According to ISO/IEC Standard DTR 18037 for Atmel AVR Processors&#039;&#039;] (pdf, engl., 133 S.)&lt;br /&gt;
* [http://www.open-std.org/JTC1/sc22/wg14/www/docs/n1005.pdf ISO/IEC DTR 18037] (pdf, engl., 101 S.) &amp;amp;mdash; Spezifikation einer Erweiterung von C99 zur Unterstützung von Embedded Systems &lt;br /&gt;
* [http://www.phy6.org/outreach/edu/roman.htm A Different Kind of Multiplication]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial|AVR Arithmetik]]&lt;br /&gt;
[[Category:AVR-Arithmetik| ]]&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Arithmetik&amp;diff=102627</id>
		<title>AVR Arithmetik</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Arithmetik&amp;diff=102627"/>
		<updated>2020-11-30T20:46:10Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* Sammlungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Artikel beschäftigt sich mit 16- und 32-Bit Arithmetik auf [[AVR]]-Controllern. Für detailierte Ausführungen zur [[AVR-Tutorial: Arithmetik8|8-Bit Arithmetik auf AVR]] gibt es eine Seite im [[AVR-Tutorial]].&lt;br /&gt;
&lt;br /&gt;
== Glossar ==&lt;br /&gt;
&lt;br /&gt;
MSB: Most Significant Byte, Höchstwertiges Byte&lt;br /&gt;
&lt;br /&gt;
LSB: Least Significant Byte, Niedrigstwertiges Byte&lt;br /&gt;
&lt;br /&gt;
== Vergleich ==&lt;br /&gt;
&lt;br /&gt;
=== 16 Bit ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ;              LSB  MSB         LSB  MSB&lt;br /&gt;
    ; Vergleiche &amp;lt; r16, r17 &amp;gt; mit &amp;lt; r20, r21 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    cp    r16, r20&lt;br /&gt;
    cpc   r17, r21&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 32 Bit ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ;              LSB            MSB         LSB            MSB&lt;br /&gt;
    ; Vergleiche &amp;lt; r16, r17, r18, r19 &amp;gt; mit &amp;lt; r20, r21, r22, r23 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    cp    r16, r20&lt;br /&gt;
    cpc   r17, r21&lt;br /&gt;
    cpc   r18, r22&lt;br /&gt;
    cpc   r19, r23&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Addition==&lt;br /&gt;
===16 Bit + 16 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ; &amp;lt; r16, r17 &amp;gt; = &amp;lt; r16, r17 &amp;gt; + &amp;lt; r20, r21 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    add   r16, r20&lt;br /&gt;
    adc   r17, r21&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===32 Bit + 32 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ; &amp;lt; r16, r17, r18, r19 &amp;gt; = &amp;lt; r16, r17, r18, r19 &amp;gt; + &amp;lt; r20, r21, r22, r23 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    add   r16, r20&lt;br /&gt;
    adc   r17, r21&lt;br /&gt;
    adc   r18, r22&lt;br /&gt;
    adc   r19, r23&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Subtraktion==&lt;br /&gt;
===16 Bit - 16 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ; &amp;lt; r16, r17 &amp;gt; = &amp;lt; r16, r17 &amp;gt; - &amp;lt; r20, r21 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    sub   r16, r20&lt;br /&gt;
    sbc   r17, r21&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===32 Bit - 32 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ;   LSB            MSB       LSB            MSB       LSB            MSB&lt;br /&gt;
    ; &amp;lt; r16, r17, r18, r19 &amp;gt; = &amp;lt; r16, r17, r18, r19 &amp;gt; - &amp;lt; r20, r21, r22, r23 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    sub   r16, r20&lt;br /&gt;
    sbc   r17, r21&lt;br /&gt;
    sbc   r18, r22&lt;br /&gt;
    sbc   r19, r23&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Division==&lt;br /&gt;
===32 Bit / 32 Bit===&lt;br /&gt;
&lt;br /&gt;
Ergebnis gerundet, und mit Restbildung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.def	a0	= r16&lt;br /&gt;
.def	a1	= r17&lt;br /&gt;
.def	a2	= r18&lt;br /&gt;
.def	a3	= r19&lt;br /&gt;
&lt;br /&gt;
.def	b0	= r20&lt;br /&gt;
.def	b1	= r21&lt;br /&gt;
.def	b2	= r22&lt;br /&gt;
.def	b3	= r23&lt;br /&gt;
&lt;br /&gt;
.def	t0	= r24&lt;br /&gt;
.def	t1	= r25&lt;br /&gt;
.def	t2	= r26&lt;br /&gt;
.def	t3	= r27&lt;br /&gt;
&lt;br /&gt;
.def	t4	= r28&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned rounded division 32 bit                *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
&lt;br /&gt;
urdiv32:&lt;br /&gt;
	mov	t0, b0		;T = B&lt;br /&gt;
	mov	t1, b1&lt;br /&gt;
	mov	t2, b2&lt;br /&gt;
	mov	t3, b3&lt;br /&gt;
	lsr	t3		;B / 2&lt;br /&gt;
	ror	t2&lt;br /&gt;
	ror	t1&lt;br /&gt;
	ror	t0&lt;br /&gt;
	add	a0, t0		;A = A + B / 2&lt;br /&gt;
	adc	a1, t1&lt;br /&gt;
	adc	a2, t2&lt;br /&gt;
	adc	a3, t3&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned division 32 bit                        *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
&lt;br /&gt;
; a3..0 = a3..0 / b3..0 (Ganzzahldivision)&lt;br /&gt;
; b3..0 = a3..0 % b3..0 (Rest)&lt;br /&gt;
&lt;br /&gt;
; cycle: max 684&lt;br /&gt;
&lt;br /&gt;
udiv32:&lt;br /&gt;
	clr	t0&lt;br /&gt;
	clr	t1&lt;br /&gt;
	clr	t2&lt;br /&gt;
	clr	t3&lt;br /&gt;
	ldi	t4, 32&lt;br /&gt;
udi1:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t0&lt;br /&gt;
	rol	t1&lt;br /&gt;
	rol	t2&lt;br /&gt;
	rol	t3&lt;br /&gt;
	cp	t0, b0&lt;br /&gt;
	cpc	t1, b1&lt;br /&gt;
	cpc	t2, b2&lt;br /&gt;
	cpc	t3, b3&lt;br /&gt;
	brcs	udi2&lt;br /&gt;
	sub	t0, b0&lt;br /&gt;
	sbc	t1, b1&lt;br /&gt;
	sbc	t2, b2&lt;br /&gt;
	sbc	t3, b3&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi2:	dec	t4&lt;br /&gt;
	brne	udi1&lt;br /&gt;
	mov	b0, t0&lt;br /&gt;
	mov	b1, t1&lt;br /&gt;
	mov	b2, t2&lt;br /&gt;
	mov	b3, t3&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Version, die je nach konkreten Zahlen Rechenzeit einspart&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.def	a0	= r16&lt;br /&gt;
.def	a1	= r17&lt;br /&gt;
.def	a2	= r18&lt;br /&gt;
.def	a3	= r19&lt;br /&gt;
&lt;br /&gt;
.def	b0	= r20&lt;br /&gt;
.def	b1	= r21&lt;br /&gt;
.def	b2	= r22&lt;br /&gt;
.def	b3	= r23&lt;br /&gt;
&lt;br /&gt;
.def	t0	= r24&lt;br /&gt;
.def	t1	= r25&lt;br /&gt;
.def	t2	= r26&lt;br /&gt;
.def	t3	= r27&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned rounded division 32 bit                *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
&lt;br /&gt;
urdiv32:&lt;br /&gt;
	mov	t0, b0		;T = B&lt;br /&gt;
	mov	t1, b1&lt;br /&gt;
	mov	t2, b2&lt;br /&gt;
	mov	t3, b3&lt;br /&gt;
	lsr	t3		;B / 2&lt;br /&gt;
	ror	t2&lt;br /&gt;
	ror	t1&lt;br /&gt;
	ror	t0&lt;br /&gt;
	add	a0, t0		;A = A + B / 2&lt;br /&gt;
	adc	a1, t1&lt;br /&gt;
	adc	a2, t2&lt;br /&gt;
	adc	a3, t3&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned division 32 bit                        *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;cycle: max 431 (63%) (684)&lt;br /&gt;
&lt;br /&gt;
udiv32:&lt;br /&gt;
	clr	t1&lt;br /&gt;
	tst	b3&lt;br /&gt;
	breq	udi10&lt;br /&gt;
	ldi	t0, 8&lt;br /&gt;
udi1:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t1&lt;br /&gt;
	cp	a1, b0&lt;br /&gt;
	cpc	a2, b1&lt;br /&gt;
	cpc	a3, b2&lt;br /&gt;
	cpc	t1, b3&lt;br /&gt;
	brcs	udi2&lt;br /&gt;
	sub	a1, b0&lt;br /&gt;
	sbc	a2, b1&lt;br /&gt;
	sbc	a3, b2&lt;br /&gt;
	sbc	t1, b3&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi2:	dec	t0&lt;br /&gt;
	brne	udi1&lt;br /&gt;
	mov	b0, a1&lt;br /&gt;
	clr	a1&lt;br /&gt;
	mov	b1, a2&lt;br /&gt;
	clr	a2&lt;br /&gt;
	mov	b2, a3&lt;br /&gt;
	clr	a3&lt;br /&gt;
	mov	b3, t1&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
udi10:	tst	b2&lt;br /&gt;
	breq	udi20&lt;br /&gt;
	ldi	t0, 16&lt;br /&gt;
udi11:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t1&lt;br /&gt;
	brcs	udi12&lt;br /&gt;
	cp	a2, b0&lt;br /&gt;
	cpc	a3, b1&lt;br /&gt;
	cpc	t1, b2&lt;br /&gt;
	brcs	udi13&lt;br /&gt;
udi12:	sub	a2, b0&lt;br /&gt;
	sbc	a3, b1&lt;br /&gt;
	sbc	t1, b2&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi13:	dec	t0&lt;br /&gt;
	brne	udi11&lt;br /&gt;
	mov	b0, a2&lt;br /&gt;
	clr	a2&lt;br /&gt;
	mov	b1, a3&lt;br /&gt;
	clr	a3&lt;br /&gt;
	mov	b2, t1&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
udi20:	tst	b1&lt;br /&gt;
	breq	udi30&lt;br /&gt;
	ldi	t0, 24&lt;br /&gt;
udi21:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t1&lt;br /&gt;
	brcs	udi22&lt;br /&gt;
	cp	a3, b0&lt;br /&gt;
	cpc	t1, b1&lt;br /&gt;
	brcs	udi23&lt;br /&gt;
udi22:	sub	a3, b0&lt;br /&gt;
	sbc	t1, b1&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi23:	dec	t0&lt;br /&gt;
	brne	udi21&lt;br /&gt;
	mov	b0, a3&lt;br /&gt;
	clr	a3&lt;br /&gt;
	mov	b1, t1&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
udi30:	ldi	t0, 32&lt;br /&gt;
udi31:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t1&lt;br /&gt;
	brcs	udi32&lt;br /&gt;
	cp	t1, b0&lt;br /&gt;
	brcs	udi33&lt;br /&gt;
udi32:	sub	t1, b0&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi33:	dec	t0&lt;br /&gt;
	brne	udi31&lt;br /&gt;
	mov	b0, t1			;store remainder&lt;br /&gt;
	ret&lt;br /&gt;
;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Multiplikation==&lt;br /&gt;
===32 Bit * 16 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.def	a0	= r16&lt;br /&gt;
.def	a1	= r17&lt;br /&gt;
.def	a2	= r18&lt;br /&gt;
.def	a3	= r19&lt;br /&gt;
&lt;br /&gt;
.def	b0	= r20&lt;br /&gt;
.def	b1	= r21&lt;br /&gt;
.def	b2	= r22&lt;br /&gt;
.def	b3	= r23&lt;br /&gt;
&lt;br /&gt;
.def	t0	= r24&lt;br /&gt;
.def	t1	= r25&lt;br /&gt;
.def	t2	= r26&lt;br /&gt;
.def	t3	= r27&lt;br /&gt;
.def	i0	= r28&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned multiplication 32 bit                  *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;cycle: max 245&lt;br /&gt;
&lt;br /&gt;
umul32:&lt;br /&gt;
	cpi	a3, 0&lt;br /&gt;
	cpc	a3, a2&lt;br /&gt;
	breq	_umu1		;one operand must be below 65536&lt;br /&gt;
	mov	t0, a0		; swap A &amp;lt;-&amp;gt; B&lt;br /&gt;
	mov	a0, b0&lt;br /&gt;
	mov	b0, t0&lt;br /&gt;
	mov	t0, a1&lt;br /&gt;
	mov	a1, b1&lt;br /&gt;
	mov	b1, t0&lt;br /&gt;
	mov	b2, a2&lt;br /&gt;
	mov	b3, a3&lt;br /&gt;
	clr	a2&lt;br /&gt;
	clr	a3&lt;br /&gt;
;				a3,2,1,0 = a1,0 * b3,2,1,0&lt;br /&gt;
_umu1:	ldi	i0, 16&lt;br /&gt;
	clr	t0&lt;br /&gt;
	clr	t1&lt;br /&gt;
	ror	a1&lt;br /&gt;
	ror	a0&lt;br /&gt;
_umu2:	brcc	_umu3&lt;br /&gt;
	add	a2, b0&lt;br /&gt;
	adc	a3, b1&lt;br /&gt;
	adc	t0, b2&lt;br /&gt;
	adc	t1, b3&lt;br /&gt;
_umu3:	ror	t1&lt;br /&gt;
	ror	t0&lt;br /&gt;
	ror	a3&lt;br /&gt;
	ror	a2&lt;br /&gt;
	ror	a1&lt;br /&gt;
	ror	a0&lt;br /&gt;
	dec	i0&lt;br /&gt;
	brne	_umu2&lt;br /&gt;
	ret&lt;br /&gt;
;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===24 Bit * 24 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;**********************************************************************************************&lt;br /&gt;
;&lt;br /&gt;
;  muls24x24_48:&lt;br /&gt;
;  Signed Multiply von 2 24Bit breiten Zahlen mit 48Bit ergebnis&lt;br /&gt;
;&lt;br /&gt;
;  x                       = a           * b&lt;br /&gt;
;  R21:R20:R19:R18:R17:R16 = R27:R26:R25 * R24:R23:R22&lt;br /&gt;
;  hi                  lo    hi      lo    hi      lo&lt;br /&gt;
;&lt;br /&gt;
;**********************************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls24x24_48:&lt;br /&gt;
    clr    r2          ;Zero Register&lt;br /&gt;
    muls  r27,r24        ; (1) signed Multiply a(MSB) * b(MSB)&lt;br /&gt;
    movw   r20,r0&lt;br /&gt;
&lt;br /&gt;
    mul    r26,r23        ; (2) unsigned&lt;br /&gt;
    movw   r18,r0&lt;br /&gt;
&lt;br /&gt;
    mul    r25,r22        ; (3) unsigned multiply a(LSB) * b(LSB)&lt;br /&gt;
    movw   r16,r0&lt;br /&gt;
&lt;br /&gt;
    mul    r26,r22        ;(4) unsigned&lt;br /&gt;
    add    r17,r0&lt;br /&gt;
    adc    r18,r1&lt;br /&gt;
    adc    r19,r2&lt;br /&gt;
    adc    r20,r2&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    mul    r25,r23        ;(5) unsigned&lt;br /&gt;
    add    r17,r0&lt;br /&gt;
    adc    r18,r1&lt;br /&gt;
    adc    r19,r2&lt;br /&gt;
    adc    r20,r2&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    push  r16&lt;br /&gt;
    push  r17&lt;br /&gt;
&lt;br /&gt;
    mov    r16,r27&lt;br /&gt;
    mulsu  r16,r22        ;(6) unsigned * signed&lt;br /&gt;
    sbc    r20,r2&lt;br /&gt;
    sbc    r21,r2&lt;br /&gt;
    add    r18,r0&lt;br /&gt;
    adc    r19,r1&lt;br /&gt;
    adc    r20,r2&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    mulsu  r16,r23        ;(7) unsigned * signed&lt;br /&gt;
    sbc    r21,r2&lt;br /&gt;
    add    r19,r0&lt;br /&gt;
    adc    r20,r1&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    movw   r16,r24&lt;br /&gt;
    mulsu  r16,r17        ;(8) unsigned * signed&lt;br /&gt;
    sbc    r20,r2&lt;br /&gt;
    sbc    r21,r2&lt;br /&gt;
    add    r18,r0&lt;br /&gt;
    adc    r19,r1&lt;br /&gt;
    adc    r20,r2&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    mov    r17,r26&lt;br /&gt;
    mulsu  r16,r17        ;(9) unsigned * signed&lt;br /&gt;
    sbc    r21,r2&lt;br /&gt;
    add    r19,r0&lt;br /&gt;
    adc    r20,r1&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    pop    r17&lt;br /&gt;
    pop    r16&lt;br /&gt;
    ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Weiterführende Links ===&lt;br /&gt;
*[https://www.mikrocontroller.net/articles/Multiplikation_in_Assembler Multiplikation in Assembler] - Enthält schon viele kleine Multiplikations-Include-Dateien für den AVR Assembler&lt;br /&gt;
&lt;br /&gt;
==Wurzel==&lt;br /&gt;
&lt;br /&gt;
=== avr-gcc Implementierung (32 Bit) ===&lt;br /&gt;
Quadratwurzel basierend auf einer Implementierung von Ruud v Gessel&amp;lt;ref&amp;gt;[http://members.chello.nl/j.beentjes3/Ruud/sqrt32avr.htm Ruud v Gessel: Quadratwurzeln]&amp;lt;/ref&amp;gt;, die zusammen mit avr-gcc verwendet werden kann. Je nach Algorithmus wird das  Ergebnis zum Nächsten gerundet oder abgerundet. Abrunden ist dann angesagt, wenn die Wurzel aus einer großen Eingabe wie &amp;lt;tt&amp;gt;0xffffffff&amp;lt;/tt&amp;gt; zu ziehen ist, da bei Aufrunden hier das Ergebnis zu 0 überläuft.&lt;br /&gt;
&lt;br /&gt;
Die maximale Ausführungszeit ist höchstens 310 Ticks (inclusive CALL+RET):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;sqrt32.h&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef SQRT32_H&lt;br /&gt;
#define SQRT32_H&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
extern uint16_t sqrt32_round (uint32_t);&lt;br /&gt;
extern uint16_t sqrt32_floor (uint32_t);&lt;br /&gt;
&lt;br /&gt;
#endif /* SQRT32_H */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C-Module, welche die Wurzel benötigen, includen einfach diesen Header. Das Assembler-Modul wird assembliert und zum Projekt hinzugelinkt.&lt;br /&gt;
&lt;br /&gt;
==== Rundung zum Nächsten ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Ressourcen-Verbrauch, Rundung zum Nächsten&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;Flash&#039;&#039;&#039;    || 82 Bytes&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;RAM&#039;&#039;&#039;      || 2&amp;amp;ndash;3 Bytes dynamisch, 0 Bytes statisch&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;Laufzeit&#039;&#039;&#039; || 265&amp;amp;ndash;310 Ticks (inclusive Zeiten für CALL+RET)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sqrt32.S&#039;&#039;&#039; (sqrt32_round)&lt;br /&gt;
{{Scrollbox|25em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------&lt;br /&gt;
; Fast and short 32 bits AVR sqrt routine, avr-gcc ABI compliant&lt;br /&gt;
; R25:R24 = SQRT (R25:R24:R23:R22) rounded to the &lt;br /&gt;
; nearest integer (0.5 rounds up)&lt;br /&gt;
; Destroys R18-R19,R22-R23,R26-R27&lt;br /&gt;
; Cycles incl call &amp;amp; ret = 265-310&lt;br /&gt;
; Stack incl call = 2-3&lt;br /&gt;
;-----------------------------------------------------------&lt;br /&gt;
.text&lt;br /&gt;
.global sqrt32_round&lt;br /&gt;
.type sqrt32_round, @function&lt;br /&gt;
&lt;br /&gt;
sqrt32_round:&lt;br /&gt;
    ldi   R19, 0xc0&lt;br /&gt;
    clr   R18          ; rotation mask in R19:R18&lt;br /&gt;
    ldi   R27, 0x40&lt;br /&gt;
    sub   R26, R26     ; developing sqrt in R27:R26, C=0&lt;br /&gt;
1:  brcs  2f           ; C --&amp;gt; Bit is always 1&lt;br /&gt;
    cp    R24, R26&lt;br /&gt;
    cpc   R25, R27     ; Does test value fit?&lt;br /&gt;
    brcs  3f           ; C --&amp;gt; nope, bit is 0&lt;br /&gt;
2:  sub   R24, R26&lt;br /&gt;
    sbc   R25, R27     ; Adjust argument for next bit&lt;br /&gt;
    or    R26, R18&lt;br /&gt;
    or    R27, R19     ; Set bit to 1&lt;br /&gt;
3:  lsr   R19&lt;br /&gt;
    ror   R18          ; Shift right mask, C --&amp;gt; end loop&lt;br /&gt;
    eor   R27, R19&lt;br /&gt;
    eor   R26, R18     ; Shift right only test bit in result&lt;br /&gt;
    rol   R22          ; Bit 0 only set if end of loop&lt;br /&gt;
    rol   R23&lt;br /&gt;
    rol   R24&lt;br /&gt;
    rol   R25          ; Shift left remaining argument (C used at 1:)&lt;br /&gt;
    sbrs  R22, 0       ; Skip if 15 bits developed&lt;br /&gt;
    rjmp  1b           ; Develop 15 bits of the sqrt&lt;br /&gt;
    brcs  4f           ; C--&amp;gt; Last bits always 1&lt;br /&gt;
    cp    R26, R24&lt;br /&gt;
    cpc   R27, R25     ; Test for last bit 1&lt;br /&gt;
    brcc  5f           ; NC --&amp;gt; bit is 0&lt;br /&gt;
4:  sbc   R23, R19     ; Subtract C (any value from 1 to 0x7f will do)&lt;br /&gt;
    sbc   R24, R26&lt;br /&gt;
    sbc   R25, R27     ; Update argument for test&lt;br /&gt;
    inc   R26          ; Last bit is 1&lt;br /&gt;
5:  lsl   R23          ; Only bit 7 matters&lt;br /&gt;
    rol   R24&lt;br /&gt;
    rol   R25          ; Remainder * 2 + C&lt;br /&gt;
    brcs  6f           ; C --&amp;gt; Always round up&lt;br /&gt;
    cp    R26, R24&lt;br /&gt;
    cpc   R27, R25     ; C decides rounding&lt;br /&gt;
6:  adc   R26, R19&lt;br /&gt;
    adc   R27, R19     ; Round up if C (R19=0)&lt;br /&gt;
    mov   R25, R27     ; return in R25:R24 for avr-gcc ABI compliance&lt;br /&gt;
    mov   R24, R26&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
.size sqrt32_round, .-sqrt32_round&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Abrunden ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Ressourcen-Verbrauch, Abrunden&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;Flash&#039;&#039;&#039;    || 60 Bytes&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;RAM&#039;&#039;&#039;      || 2&amp;amp;ndash;3 Bytes dynamisch, 0 Bytes statisch&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;Laufzeit&#039;&#039;&#039; || 260&amp;amp;ndash;300 Ticks (inclusive Zeiten für CALL+RET)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sqrt32.S&#039;&#039;&#039; (sqrt32_floor)&lt;br /&gt;
{{Scrollbox|25em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
;  Fast and short 32 bits AVR sqrt routine, avr-gcc ABI compliant&lt;br /&gt;
;  R25:R24 = SQRT (R25:R24:R23:R22) &lt;br /&gt;
;  rounded down to integer&lt;br /&gt;
;     Destroys R26,R27,R22,R23,R18,R19&lt;br /&gt;
;  Cycles incl call &amp;amp; ret = 260-300&lt;br /&gt;
;  Stack incl call = 2-3&lt;br /&gt;
.text&lt;br /&gt;
.global sqrt32_floor&lt;br /&gt;
.type sqrt32_floor, @function&lt;br /&gt;
&lt;br /&gt;
sqrt32_floor:&lt;br /&gt;
    ldi   R19, 0xc0&lt;br /&gt;
    clr   R18               ; rotation mask in R19:R18&lt;br /&gt;
    ldi   R27, 0x40&lt;br /&gt;
    sub   R26, R26          ; developing sqrt in R27:R26, C=0&lt;br /&gt;
1:  brcs  2f                ; C --&amp;gt; Bit is always 1&lt;br /&gt;
    cp    R24, R26&lt;br /&gt;
    cpc   R25, R27          ; Does test value fit?&lt;br /&gt;
    brcs  3f                ; C --&amp;gt; nope, bit is 0&lt;br /&gt;
2:  sub   R24, R26&lt;br /&gt;
    sbc   R25, R27          ; Adjust argument for next bit&lt;br /&gt;
    or    R26, R18&lt;br /&gt;
    or    R27, R19          ; Set bit to 1&lt;br /&gt;
3:  lsr   R19&lt;br /&gt;
    ror   R18               ; Shift right mask, C --&amp;gt; end loop&lt;br /&gt;
    eor   R27, R19&lt;br /&gt;
    eor   R26, R18          ; Shift right only test bit in result&lt;br /&gt;
    rol   R22               ; Bit 0 only set if end of loop&lt;br /&gt;
    rol   R23&lt;br /&gt;
    rol   R24&lt;br /&gt;
    rol   R25               ; Shift left remaining argument (C used at 1:)&lt;br /&gt;
    sbrs  R22, 0            ; Skip if 15 bits developed&lt;br /&gt;
    rjmp  1b                ; Develop 15 bits of the sqrt&lt;br /&gt;
&lt;br /&gt;
    brcs  4f                ; C--&amp;gt; Last bits always 1&lt;br /&gt;
    lsl   R23               ; Need bit 7 in C for cpc&lt;br /&gt;
    cpc   R26, R24&lt;br /&gt;
    cpc   R27, R25          ; After this C is last bit&lt;br /&gt;
&lt;br /&gt;
4:  adc   R26, R19          ; Round up if C (R19=0)&lt;br /&gt;
    mov   R25, R27          ; return in R25:R24 as for avr-gcc ABI&lt;br /&gt;
    mov   R24, R26&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
.size sqrt32_floor, .-sqrt32_floor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== avr-gcc Implementierung (16 Bit) ===&lt;br /&gt;
&lt;br /&gt;
Falls eine MUL-Instruktion vorhanden ist, benötigt eine 16-Bit Implementierung der Quadratwurzel nur eine handvoll Instruktionen und kann einigermassen bequem in Inline-Assembler geschrieben werden. Der Assembler-Teil besteht lediglich aus 9&amp;amp;nbsp;Instruktionen und dauert unabhängig vom Eingabewert 80&amp;amp;nbsp;Ticks.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sqrt16_floor&#039;&#039;&#039; (Braucht MUL, Inline-Assembler und auf Größe optimiert)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#if defined (__AVR_ENHANCED__)&lt;br /&gt;
&lt;br /&gt;
static inline uint8_t&lt;br /&gt;
sqrt16_floor (uint16_t q)&lt;br /&gt;
{&lt;br /&gt;
    uint8_t res = 0;&lt;br /&gt;
    uint8_t mask = 1 &amp;lt;&amp;lt; 7;&lt;br /&gt;
    &lt;br /&gt;
    asm(&amp;quot;0:	add  %[res], %[mask]&amp;quot;   &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	mul  %[res], %[res]&amp;quot;    &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	cp   %A[q], R0&amp;quot;         &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	cpc  %B[q], R1&amp;quot;         &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	brsh 1f&amp;quot;                &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	sub  %[res], %[mask]&amp;quot;   &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;1:	lsr  %[mask]&amp;quot;           &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	brne 0b&amp;quot;                &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	clr  __zero_reg__&amp;quot;&lt;br /&gt;
        : [res] &amp;quot;+r&amp;quot; (res), [mask] &amp;quot;+r&amp;quot; (mask)&lt;br /&gt;
        : [q] &amp;quot;r&amp;quot; (q));&lt;br /&gt;
        &lt;br /&gt;
    return res;&lt;br /&gt;
}&lt;br /&gt;
#endif // __AVR_ENHANCED__&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es handelt sich um eine größenoptimierte Version eines Algorithmus&#039; von Marko Surup, siehe &#039;&#039;[http://www.mikrocontroller.net/topic/231332#2338343 Forum: AVR: 16-Bit Quadratwurzel in 63 Takten]&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C-Variante&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die C-Variante verbraucht auf einem ATmega etwa 25 Instruktionen und 120 Ticks inclusive Funktionsaufruf und Parameteraufbereitung (getestet mit avr-gcc 4.6 und auf Größe optimiert):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uint8_t c_sqrt16 (uint16_t q)&lt;br /&gt;
{&lt;br /&gt;
    uint8_t r, mask;&lt;br /&gt;
    uint8_t i = 8*sizeof (r) -1;&lt;br /&gt;
&lt;br /&gt;
    r = mask = 1 &amp;lt;&amp;lt; i;&lt;br /&gt;
    &lt;br /&gt;
    for (; i &amp;gt; 0; i--)&lt;br /&gt;
    {&lt;br /&gt;
        mask &amp;gt;&amp;gt;= 1;&lt;br /&gt;
        &lt;br /&gt;
        if (q &amp;lt; (uint16_t) r*r)&lt;br /&gt;
            r -= mask;&lt;br /&gt;
        else&lt;br /&gt;
            r += mask;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (q &amp;lt; (uint16_t) r*r)&lt;br /&gt;
        r -= 1;&lt;br /&gt;
    &lt;br /&gt;
    return r;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Binär zu BCD - Umwandlung==&lt;br /&gt;
Zur Ausgabe einer Binärzahl auf ein Textdisplay oder zur seriellen ASCII-Übertragung an den PC ist diese Umwandlung nötig. Sie ist ähnlich aufwendig wie eine Division, zum Beispiel für eine 32-Bit-Zahl etwa 500-900 Taktzyklen und 10 Register.&lt;br /&gt;
Mehrere Verfahren werden angeboten:&lt;br /&gt;
=== Division /10===&lt;br /&gt;
Für eine Division pro Dezimalstelle ist nur ein Unterprogramm nötig. Der Divisionsrest, engl. remainder, bildet unmittelbar die BCD-codierte Dezimalziffer, von rechts nach links fortschreitend. Zur Ausgabe von links nach rechts kann man die Ziffern auf dem Stack zwischenlagern (LIFO-Register last-in first-out)&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
*[http://www.atmel.com/dyn/resources/prod_documents/doc0938.pdf AVR204: BCD Arithmetics, 8-Bit Binary to 2-digit BCD Conversion]&lt;br /&gt;
&lt;br /&gt;
===Division /10000, /1000, /100, /10===&lt;br /&gt;
ähnlich dem vorigen, aber die BCD-Ziffern erscheinen sofort von links nach rechts.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
*[http://users.i.com.ua/~birua/math32.asm Bin2BCD == 16-bit Binary to BCD conversion in der Macrolibrary Math32 von Andre Birua]&lt;br /&gt;
*[http://avr-asm.tripod.com/math32x.html oder auch hier zu finden]&lt;br /&gt;
&lt;br /&gt;
===Addition von $33===&lt;br /&gt;
Hier wird die Binärzahl, mit der höchstwertigen Stelle voran, von rechts in die Ergebnisregister geschoben. Nach jedem Schiebevorgang wird eine Korrekturrechnung ausgeführt. Für 32 Bit bilden 4 Eingabe- und 5 Ausgaberegister ein 72 Bit Schieberegister, das 32 mal links geschoben wird.&lt;br /&gt;
Durch die Korrekturrechnung wird die Binärzahl zur gepackten (2 Stellen pro Byte) BCD-Zahl &amp;quot;aufgebläht&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Eine Erklärung des Algorithmus soll hier versucht werden: &lt;br /&gt;
Um die niederwertigste 4 Bit Binärziffer in BCD umzuwandeln, ist für $0...$9 keine Änderung nötig, für $A...$F wird &amp;quot;6&amp;quot; addiert. Diese Addition wird ersetzt durch eine Addition von &amp;quot;3&amp;quot; und anschließendes Linksschieben. Das führt man zunächst für beide Halbbytes gleichzeitig mit &amp;quot;subi Reg,-$33&amp;quot; aus. Anschließend werden die beiden Additionen einzeln für den Fall &amp;quot;0...9&amp;quot; rückgängig gemacht. Die Bits 4 und 7 des Registers dient dabei als BCD-Carry-Flag (Halbbyte-Übertrag). Das normale C-Flag wird durch die Additionen nicht beeinflußt, es dient nur dem Schiebevorgang.&lt;br /&gt;
&lt;br /&gt;
Beispiele: &lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc0938.pdf AVR204: BCD Arithmetics 16 Bit Binary to 5-digit BCD conversion]&lt;br /&gt;
* [http://avr-asm.tripod.com/math32x.html The AVR Assembler Site: 32 Bit Math]&lt;br /&gt;
* [http://www.ingelec.uns.edu.ar/dclac2558/BCD2BIN.PDF Der gleiche serielle Algorithmus für Xilinx CPLDs]&lt;br /&gt;
&lt;br /&gt;
===Tabelle===&lt;br /&gt;
Für kleine Zahlen kann die gesuchte BCD-Zahl auch aus einer Tabelle entnommen werden.&lt;br /&gt;
===Mischvarianten===&lt;br /&gt;
Eine Mischung mehrerer Verfahren wird z.&amp;amp;nbsp;B. von Andre Birua in der ersten Variante von &amp;quot;Bin4BCD&amp;quot; verwendet. Die oberen 16 Bit werden nach &amp;quot;Div/10000&amp;quot; vorbearbeitet und anschließend alle 32 Bit nach &amp;quot;Add $33&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Tutorial===&lt;br /&gt;
*[http://www.cs.uiowa.edu/~jones/bcd/decimal.html Part of  the Arithmetic Tutorial Collection by Douglas W. Jones] &lt;br /&gt;
enthält C-Code und PIC-Code für schnelle 16 Bit Wandlung, Hardware-Multiplizierer möglich - auch für FPGA interessant&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/TTL74185 VHDL Nachbau des TTL 74185 6-Bit Binär-zu-BCD-Wandlers]&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/Festkommaarithmetik Tutorial Festkommaarithmetik]&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige  Tutorial 7-Segment-Anzeige]&lt;br /&gt;
&lt;br /&gt;
=== Sammlungen ===&lt;br /&gt;
*[https://www.mikrocontroller.net/articles/Datei:DataCast.zip Data Castings] - Converiert int zu ASCII-Char, ASCII-HEX oder ASCII-BIN [ASM]&lt;br /&gt;
&lt;br /&gt;
===Diskussionsbeiträge im Forum===&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/85248 Binär-zu-BCD in VHDL]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/83884 ebenfalls VHDL]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/59851 32 Bit in C]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/64842 16 und 32 Bit C und AVR-Assembler]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/1501 Assembler für AVR-GCC bis 256 Bit]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/173633 2 hoch x , wenn x kein Integer ist]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/230317 schnelle dezimale Division auf AVR &amp;amp; Co.]&lt;br /&gt;
&lt;br /&gt;
== Sinus und Cosinus ==&lt;br /&gt;
&amp;amp;rarr; siehe [[AVR Arithmetik/Sinus und Cosinus (CORDIC)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;rarr; siehe [[AVR Arithmetik/Sinus und Cosinus (Lineare Interpolation)]]&lt;br /&gt;
&lt;br /&gt;
== Saturierung ==&lt;br /&gt;
&amp;amp;rarr; siehe [[AVR Arithmetik/Saturierung]]&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks==&lt;br /&gt;
* [http://faculty.capitol-college.edu/~andresho/tutor/Multimedia/AVR/HW_mult/avr201.htm AVR201: Using the AVR Hardware Multiplier] (Implementierung und Beispiele)&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc1631.pdf AVR201: Using the AVR Hardware Multiplier] (Application Note, pdf, en)&lt;br /&gt;
* [http://www.azillionmonkeys.com/qed/sqroot.html Wurzelfunktion]&lt;br /&gt;
* [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=printview&amp;amp;t=37150&amp;amp;start=40 Optimierte Division durch 10]&lt;br /&gt;
* [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=printview&amp;amp;t=54192&amp;amp;start=20 Optimierte Division durch 3]&lt;br /&gt;
* [http://www.cs.uiowa.edu/~jones/bcd/divide.html Division durch reziproke Multiplikation, Tutorial]&lt;br /&gt;
* [http://web.archive.org/web/20080519123741/http://users.i.com.ua/~birua/math32.html Math32: Some Useful Assembler Multibyte Maths  Subroutines &amp;amp; Macrocalls] [http://avr-asm.tripod.com/math32x.html (oder hier)]&lt;br /&gt;
*[http://elm-chan.org/cc_e.html Elm-Chan&#039;s Bibliotheken u.a. Arithmetik]&lt;br /&gt;
* [http://www.embedded.com/design/opensource/217900224?printable=true Multiplication by a Fixed Point Constant], Embedded.com, 06/16/09&lt;br /&gt;
* [http://surfnet.dl.sourceforge.net/sourceforge/avrfix/avrfix.pdf M. Rosenblattl, A. Wolf: &#039;&#039;Fixed Point Library According to ISO/IEC Standard DTR 18037 for Atmel AVR Processors&#039;&#039;] (pdf, engl., 133 S.)&lt;br /&gt;
* [http://www.open-std.org/JTC1/sc22/wg14/www/docs/n1005.pdf ISO/IEC DTR 18037] (pdf, engl., 101 S.) &amp;amp;mdash; Spezifikation einer Erweiterung von C99 zur Unterstützung von Embedded Systems &lt;br /&gt;
* [http://www.phy6.org/outreach/edu/roman.htm A Different Kind of Multiplication]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial|AVR Arithmetik]]&lt;br /&gt;
[[Category:AVR-Arithmetik| ]]&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=Datei:DataCast.zip&amp;diff=102626</id>
		<title>Datei:DataCast.zip</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=Datei:DataCast.zip&amp;diff=102626"/>
		<updated>2020-11-30T20:27:45Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Diverse Castings von int zu ASCII oder BIN oder HEX&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Arithmetik&amp;diff=102625</id>
		<title>AVR Arithmetik</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Arithmetik&amp;diff=102625"/>
		<updated>2020-11-30T20:23:58Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* Binär zu BCD - Umwandlung */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Artikel beschäftigt sich mit 16- und 32-Bit Arithmetik auf [[AVR]]-Controllern. Für detailierte Ausführungen zur [[AVR-Tutorial: Arithmetik8|8-Bit Arithmetik auf AVR]] gibt es eine Seite im [[AVR-Tutorial]].&lt;br /&gt;
&lt;br /&gt;
== Glossar ==&lt;br /&gt;
&lt;br /&gt;
MSB: Most Significant Byte, Höchstwertiges Byte&lt;br /&gt;
&lt;br /&gt;
LSB: Least Significant Byte, Niedrigstwertiges Byte&lt;br /&gt;
&lt;br /&gt;
== Vergleich ==&lt;br /&gt;
&lt;br /&gt;
=== 16 Bit ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ;              LSB  MSB         LSB  MSB&lt;br /&gt;
    ; Vergleiche &amp;lt; r16, r17 &amp;gt; mit &amp;lt; r20, r21 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    cp    r16, r20&lt;br /&gt;
    cpc   r17, r21&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 32 Bit ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ;              LSB            MSB         LSB            MSB&lt;br /&gt;
    ; Vergleiche &amp;lt; r16, r17, r18, r19 &amp;gt; mit &amp;lt; r20, r21, r22, r23 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    cp    r16, r20&lt;br /&gt;
    cpc   r17, r21&lt;br /&gt;
    cpc   r18, r22&lt;br /&gt;
    cpc   r19, r23&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Addition==&lt;br /&gt;
===16 Bit + 16 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ; &amp;lt; r16, r17 &amp;gt; = &amp;lt; r16, r17 &amp;gt; + &amp;lt; r20, r21 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    add   r16, r20&lt;br /&gt;
    adc   r17, r21&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===32 Bit + 32 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ; &amp;lt; r16, r17, r18, r19 &amp;gt; = &amp;lt; r16, r17, r18, r19 &amp;gt; + &amp;lt; r20, r21, r22, r23 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    add   r16, r20&lt;br /&gt;
    adc   r17, r21&lt;br /&gt;
    adc   r18, r22&lt;br /&gt;
    adc   r19, r23&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Subtraktion==&lt;br /&gt;
===16 Bit - 16 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ; &amp;lt; r16, r17 &amp;gt; = &amp;lt; r16, r17 &amp;gt; - &amp;lt; r20, r21 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    sub   r16, r20&lt;br /&gt;
    sbc   r17, r21&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===32 Bit - 32 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ;   LSB            MSB       LSB            MSB       LSB            MSB&lt;br /&gt;
    ; &amp;lt; r16, r17, r18, r19 &amp;gt; = &amp;lt; r16, r17, r18, r19 &amp;gt; - &amp;lt; r20, r21, r22, r23 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    sub   r16, r20&lt;br /&gt;
    sbc   r17, r21&lt;br /&gt;
    sbc   r18, r22&lt;br /&gt;
    sbc   r19, r23&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Division==&lt;br /&gt;
===32 Bit / 32 Bit===&lt;br /&gt;
&lt;br /&gt;
Ergebnis gerundet, und mit Restbildung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.def	a0	= r16&lt;br /&gt;
.def	a1	= r17&lt;br /&gt;
.def	a2	= r18&lt;br /&gt;
.def	a3	= r19&lt;br /&gt;
&lt;br /&gt;
.def	b0	= r20&lt;br /&gt;
.def	b1	= r21&lt;br /&gt;
.def	b2	= r22&lt;br /&gt;
.def	b3	= r23&lt;br /&gt;
&lt;br /&gt;
.def	t0	= r24&lt;br /&gt;
.def	t1	= r25&lt;br /&gt;
.def	t2	= r26&lt;br /&gt;
.def	t3	= r27&lt;br /&gt;
&lt;br /&gt;
.def	t4	= r28&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned rounded division 32 bit                *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
&lt;br /&gt;
urdiv32:&lt;br /&gt;
	mov	t0, b0		;T = B&lt;br /&gt;
	mov	t1, b1&lt;br /&gt;
	mov	t2, b2&lt;br /&gt;
	mov	t3, b3&lt;br /&gt;
	lsr	t3		;B / 2&lt;br /&gt;
	ror	t2&lt;br /&gt;
	ror	t1&lt;br /&gt;
	ror	t0&lt;br /&gt;
	add	a0, t0		;A = A + B / 2&lt;br /&gt;
	adc	a1, t1&lt;br /&gt;
	adc	a2, t2&lt;br /&gt;
	adc	a3, t3&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned division 32 bit                        *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
&lt;br /&gt;
; a3..0 = a3..0 / b3..0 (Ganzzahldivision)&lt;br /&gt;
; b3..0 = a3..0 % b3..0 (Rest)&lt;br /&gt;
&lt;br /&gt;
; cycle: max 684&lt;br /&gt;
&lt;br /&gt;
udiv32:&lt;br /&gt;
	clr	t0&lt;br /&gt;
	clr	t1&lt;br /&gt;
	clr	t2&lt;br /&gt;
	clr	t3&lt;br /&gt;
	ldi	t4, 32&lt;br /&gt;
udi1:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t0&lt;br /&gt;
	rol	t1&lt;br /&gt;
	rol	t2&lt;br /&gt;
	rol	t3&lt;br /&gt;
	cp	t0, b0&lt;br /&gt;
	cpc	t1, b1&lt;br /&gt;
	cpc	t2, b2&lt;br /&gt;
	cpc	t3, b3&lt;br /&gt;
	brcs	udi2&lt;br /&gt;
	sub	t0, b0&lt;br /&gt;
	sbc	t1, b1&lt;br /&gt;
	sbc	t2, b2&lt;br /&gt;
	sbc	t3, b3&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi2:	dec	t4&lt;br /&gt;
	brne	udi1&lt;br /&gt;
	mov	b0, t0&lt;br /&gt;
	mov	b1, t1&lt;br /&gt;
	mov	b2, t2&lt;br /&gt;
	mov	b3, t3&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Version, die je nach konkreten Zahlen Rechenzeit einspart&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.def	a0	= r16&lt;br /&gt;
.def	a1	= r17&lt;br /&gt;
.def	a2	= r18&lt;br /&gt;
.def	a3	= r19&lt;br /&gt;
&lt;br /&gt;
.def	b0	= r20&lt;br /&gt;
.def	b1	= r21&lt;br /&gt;
.def	b2	= r22&lt;br /&gt;
.def	b3	= r23&lt;br /&gt;
&lt;br /&gt;
.def	t0	= r24&lt;br /&gt;
.def	t1	= r25&lt;br /&gt;
.def	t2	= r26&lt;br /&gt;
.def	t3	= r27&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned rounded division 32 bit                *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
&lt;br /&gt;
urdiv32:&lt;br /&gt;
	mov	t0, b0		;T = B&lt;br /&gt;
	mov	t1, b1&lt;br /&gt;
	mov	t2, b2&lt;br /&gt;
	mov	t3, b3&lt;br /&gt;
	lsr	t3		;B / 2&lt;br /&gt;
	ror	t2&lt;br /&gt;
	ror	t1&lt;br /&gt;
	ror	t0&lt;br /&gt;
	add	a0, t0		;A = A + B / 2&lt;br /&gt;
	adc	a1, t1&lt;br /&gt;
	adc	a2, t2&lt;br /&gt;
	adc	a3, t3&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned division 32 bit                        *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;cycle: max 431 (63%) (684)&lt;br /&gt;
&lt;br /&gt;
udiv32:&lt;br /&gt;
	clr	t1&lt;br /&gt;
	tst	b3&lt;br /&gt;
	breq	udi10&lt;br /&gt;
	ldi	t0, 8&lt;br /&gt;
udi1:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t1&lt;br /&gt;
	cp	a1, b0&lt;br /&gt;
	cpc	a2, b1&lt;br /&gt;
	cpc	a3, b2&lt;br /&gt;
	cpc	t1, b3&lt;br /&gt;
	brcs	udi2&lt;br /&gt;
	sub	a1, b0&lt;br /&gt;
	sbc	a2, b1&lt;br /&gt;
	sbc	a3, b2&lt;br /&gt;
	sbc	t1, b3&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi2:	dec	t0&lt;br /&gt;
	brne	udi1&lt;br /&gt;
	mov	b0, a1&lt;br /&gt;
	clr	a1&lt;br /&gt;
	mov	b1, a2&lt;br /&gt;
	clr	a2&lt;br /&gt;
	mov	b2, a3&lt;br /&gt;
	clr	a3&lt;br /&gt;
	mov	b3, t1&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
udi10:	tst	b2&lt;br /&gt;
	breq	udi20&lt;br /&gt;
	ldi	t0, 16&lt;br /&gt;
udi11:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t1&lt;br /&gt;
	brcs	udi12&lt;br /&gt;
	cp	a2, b0&lt;br /&gt;
	cpc	a3, b1&lt;br /&gt;
	cpc	t1, b2&lt;br /&gt;
	brcs	udi13&lt;br /&gt;
udi12:	sub	a2, b0&lt;br /&gt;
	sbc	a3, b1&lt;br /&gt;
	sbc	t1, b2&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi13:	dec	t0&lt;br /&gt;
	brne	udi11&lt;br /&gt;
	mov	b0, a2&lt;br /&gt;
	clr	a2&lt;br /&gt;
	mov	b1, a3&lt;br /&gt;
	clr	a3&lt;br /&gt;
	mov	b2, t1&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
udi20:	tst	b1&lt;br /&gt;
	breq	udi30&lt;br /&gt;
	ldi	t0, 24&lt;br /&gt;
udi21:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t1&lt;br /&gt;
	brcs	udi22&lt;br /&gt;
	cp	a3, b0&lt;br /&gt;
	cpc	t1, b1&lt;br /&gt;
	brcs	udi23&lt;br /&gt;
udi22:	sub	a3, b0&lt;br /&gt;
	sbc	t1, b1&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi23:	dec	t0&lt;br /&gt;
	brne	udi21&lt;br /&gt;
	mov	b0, a3&lt;br /&gt;
	clr	a3&lt;br /&gt;
	mov	b1, t1&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
udi30:	ldi	t0, 32&lt;br /&gt;
udi31:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t1&lt;br /&gt;
	brcs	udi32&lt;br /&gt;
	cp	t1, b0&lt;br /&gt;
	brcs	udi33&lt;br /&gt;
udi32:	sub	t1, b0&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi33:	dec	t0&lt;br /&gt;
	brne	udi31&lt;br /&gt;
	mov	b0, t1			;store remainder&lt;br /&gt;
	ret&lt;br /&gt;
;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Multiplikation==&lt;br /&gt;
===32 Bit * 16 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.def	a0	= r16&lt;br /&gt;
.def	a1	= r17&lt;br /&gt;
.def	a2	= r18&lt;br /&gt;
.def	a3	= r19&lt;br /&gt;
&lt;br /&gt;
.def	b0	= r20&lt;br /&gt;
.def	b1	= r21&lt;br /&gt;
.def	b2	= r22&lt;br /&gt;
.def	b3	= r23&lt;br /&gt;
&lt;br /&gt;
.def	t0	= r24&lt;br /&gt;
.def	t1	= r25&lt;br /&gt;
.def	t2	= r26&lt;br /&gt;
.def	t3	= r27&lt;br /&gt;
.def	i0	= r28&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned multiplication 32 bit                  *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;cycle: max 245&lt;br /&gt;
&lt;br /&gt;
umul32:&lt;br /&gt;
	cpi	a3, 0&lt;br /&gt;
	cpc	a3, a2&lt;br /&gt;
	breq	_umu1		;one operand must be below 65536&lt;br /&gt;
	mov	t0, a0		; swap A &amp;lt;-&amp;gt; B&lt;br /&gt;
	mov	a0, b0&lt;br /&gt;
	mov	b0, t0&lt;br /&gt;
	mov	t0, a1&lt;br /&gt;
	mov	a1, b1&lt;br /&gt;
	mov	b1, t0&lt;br /&gt;
	mov	b2, a2&lt;br /&gt;
	mov	b3, a3&lt;br /&gt;
	clr	a2&lt;br /&gt;
	clr	a3&lt;br /&gt;
;				a3,2,1,0 = a1,0 * b3,2,1,0&lt;br /&gt;
_umu1:	ldi	i0, 16&lt;br /&gt;
	clr	t0&lt;br /&gt;
	clr	t1&lt;br /&gt;
	ror	a1&lt;br /&gt;
	ror	a0&lt;br /&gt;
_umu2:	brcc	_umu3&lt;br /&gt;
	add	a2, b0&lt;br /&gt;
	adc	a3, b1&lt;br /&gt;
	adc	t0, b2&lt;br /&gt;
	adc	t1, b3&lt;br /&gt;
_umu3:	ror	t1&lt;br /&gt;
	ror	t0&lt;br /&gt;
	ror	a3&lt;br /&gt;
	ror	a2&lt;br /&gt;
	ror	a1&lt;br /&gt;
	ror	a0&lt;br /&gt;
	dec	i0&lt;br /&gt;
	brne	_umu2&lt;br /&gt;
	ret&lt;br /&gt;
;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===24 Bit * 24 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;**********************************************************************************************&lt;br /&gt;
;&lt;br /&gt;
;  muls24x24_48:&lt;br /&gt;
;  Signed Multiply von 2 24Bit breiten Zahlen mit 48Bit ergebnis&lt;br /&gt;
;&lt;br /&gt;
;  x                       = a           * b&lt;br /&gt;
;  R21:R20:R19:R18:R17:R16 = R27:R26:R25 * R24:R23:R22&lt;br /&gt;
;  hi                  lo    hi      lo    hi      lo&lt;br /&gt;
;&lt;br /&gt;
;**********************************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls24x24_48:&lt;br /&gt;
    clr    r2          ;Zero Register&lt;br /&gt;
    muls  r27,r24        ; (1) signed Multiply a(MSB) * b(MSB)&lt;br /&gt;
    movw   r20,r0&lt;br /&gt;
&lt;br /&gt;
    mul    r26,r23        ; (2) unsigned&lt;br /&gt;
    movw   r18,r0&lt;br /&gt;
&lt;br /&gt;
    mul    r25,r22        ; (3) unsigned multiply a(LSB) * b(LSB)&lt;br /&gt;
    movw   r16,r0&lt;br /&gt;
&lt;br /&gt;
    mul    r26,r22        ;(4) unsigned&lt;br /&gt;
    add    r17,r0&lt;br /&gt;
    adc    r18,r1&lt;br /&gt;
    adc    r19,r2&lt;br /&gt;
    adc    r20,r2&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    mul    r25,r23        ;(5) unsigned&lt;br /&gt;
    add    r17,r0&lt;br /&gt;
    adc    r18,r1&lt;br /&gt;
    adc    r19,r2&lt;br /&gt;
    adc    r20,r2&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    push  r16&lt;br /&gt;
    push  r17&lt;br /&gt;
&lt;br /&gt;
    mov    r16,r27&lt;br /&gt;
    mulsu  r16,r22        ;(6) unsigned * signed&lt;br /&gt;
    sbc    r20,r2&lt;br /&gt;
    sbc    r21,r2&lt;br /&gt;
    add    r18,r0&lt;br /&gt;
    adc    r19,r1&lt;br /&gt;
    adc    r20,r2&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    mulsu  r16,r23        ;(7) unsigned * signed&lt;br /&gt;
    sbc    r21,r2&lt;br /&gt;
    add    r19,r0&lt;br /&gt;
    adc    r20,r1&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    movw   r16,r24&lt;br /&gt;
    mulsu  r16,r17        ;(8) unsigned * signed&lt;br /&gt;
    sbc    r20,r2&lt;br /&gt;
    sbc    r21,r2&lt;br /&gt;
    add    r18,r0&lt;br /&gt;
    adc    r19,r1&lt;br /&gt;
    adc    r20,r2&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    mov    r17,r26&lt;br /&gt;
    mulsu  r16,r17        ;(9) unsigned * signed&lt;br /&gt;
    sbc    r21,r2&lt;br /&gt;
    add    r19,r0&lt;br /&gt;
    adc    r20,r1&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    pop    r17&lt;br /&gt;
    pop    r16&lt;br /&gt;
    ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Weiterführende Links ===&lt;br /&gt;
*[https://www.mikrocontroller.net/articles/Multiplikation_in_Assembler Multiplikation in Assembler] - Enthält schon viele kleine Multiplikations-Include-Dateien für den AVR Assembler&lt;br /&gt;
&lt;br /&gt;
==Wurzel==&lt;br /&gt;
&lt;br /&gt;
=== avr-gcc Implementierung (32 Bit) ===&lt;br /&gt;
Quadratwurzel basierend auf einer Implementierung von Ruud v Gessel&amp;lt;ref&amp;gt;[http://members.chello.nl/j.beentjes3/Ruud/sqrt32avr.htm Ruud v Gessel: Quadratwurzeln]&amp;lt;/ref&amp;gt;, die zusammen mit avr-gcc verwendet werden kann. Je nach Algorithmus wird das  Ergebnis zum Nächsten gerundet oder abgerundet. Abrunden ist dann angesagt, wenn die Wurzel aus einer großen Eingabe wie &amp;lt;tt&amp;gt;0xffffffff&amp;lt;/tt&amp;gt; zu ziehen ist, da bei Aufrunden hier das Ergebnis zu 0 überläuft.&lt;br /&gt;
&lt;br /&gt;
Die maximale Ausführungszeit ist höchstens 310 Ticks (inclusive CALL+RET):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;sqrt32.h&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef SQRT32_H&lt;br /&gt;
#define SQRT32_H&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
extern uint16_t sqrt32_round (uint32_t);&lt;br /&gt;
extern uint16_t sqrt32_floor (uint32_t);&lt;br /&gt;
&lt;br /&gt;
#endif /* SQRT32_H */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C-Module, welche die Wurzel benötigen, includen einfach diesen Header. Das Assembler-Modul wird assembliert und zum Projekt hinzugelinkt.&lt;br /&gt;
&lt;br /&gt;
==== Rundung zum Nächsten ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Ressourcen-Verbrauch, Rundung zum Nächsten&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;Flash&#039;&#039;&#039;    || 82 Bytes&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;RAM&#039;&#039;&#039;      || 2&amp;amp;ndash;3 Bytes dynamisch, 0 Bytes statisch&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;Laufzeit&#039;&#039;&#039; || 265&amp;amp;ndash;310 Ticks (inclusive Zeiten für CALL+RET)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sqrt32.S&#039;&#039;&#039; (sqrt32_round)&lt;br /&gt;
{{Scrollbox|25em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------&lt;br /&gt;
; Fast and short 32 bits AVR sqrt routine, avr-gcc ABI compliant&lt;br /&gt;
; R25:R24 = SQRT (R25:R24:R23:R22) rounded to the &lt;br /&gt;
; nearest integer (0.5 rounds up)&lt;br /&gt;
; Destroys R18-R19,R22-R23,R26-R27&lt;br /&gt;
; Cycles incl call &amp;amp; ret = 265-310&lt;br /&gt;
; Stack incl call = 2-3&lt;br /&gt;
;-----------------------------------------------------------&lt;br /&gt;
.text&lt;br /&gt;
.global sqrt32_round&lt;br /&gt;
.type sqrt32_round, @function&lt;br /&gt;
&lt;br /&gt;
sqrt32_round:&lt;br /&gt;
    ldi   R19, 0xc0&lt;br /&gt;
    clr   R18          ; rotation mask in R19:R18&lt;br /&gt;
    ldi   R27, 0x40&lt;br /&gt;
    sub   R26, R26     ; developing sqrt in R27:R26, C=0&lt;br /&gt;
1:  brcs  2f           ; C --&amp;gt; Bit is always 1&lt;br /&gt;
    cp    R24, R26&lt;br /&gt;
    cpc   R25, R27     ; Does test value fit?&lt;br /&gt;
    brcs  3f           ; C --&amp;gt; nope, bit is 0&lt;br /&gt;
2:  sub   R24, R26&lt;br /&gt;
    sbc   R25, R27     ; Adjust argument for next bit&lt;br /&gt;
    or    R26, R18&lt;br /&gt;
    or    R27, R19     ; Set bit to 1&lt;br /&gt;
3:  lsr   R19&lt;br /&gt;
    ror   R18          ; Shift right mask, C --&amp;gt; end loop&lt;br /&gt;
    eor   R27, R19&lt;br /&gt;
    eor   R26, R18     ; Shift right only test bit in result&lt;br /&gt;
    rol   R22          ; Bit 0 only set if end of loop&lt;br /&gt;
    rol   R23&lt;br /&gt;
    rol   R24&lt;br /&gt;
    rol   R25          ; Shift left remaining argument (C used at 1:)&lt;br /&gt;
    sbrs  R22, 0       ; Skip if 15 bits developed&lt;br /&gt;
    rjmp  1b           ; Develop 15 bits of the sqrt&lt;br /&gt;
    brcs  4f           ; C--&amp;gt; Last bits always 1&lt;br /&gt;
    cp    R26, R24&lt;br /&gt;
    cpc   R27, R25     ; Test for last bit 1&lt;br /&gt;
    brcc  5f           ; NC --&amp;gt; bit is 0&lt;br /&gt;
4:  sbc   R23, R19     ; Subtract C (any value from 1 to 0x7f will do)&lt;br /&gt;
    sbc   R24, R26&lt;br /&gt;
    sbc   R25, R27     ; Update argument for test&lt;br /&gt;
    inc   R26          ; Last bit is 1&lt;br /&gt;
5:  lsl   R23          ; Only bit 7 matters&lt;br /&gt;
    rol   R24&lt;br /&gt;
    rol   R25          ; Remainder * 2 + C&lt;br /&gt;
    brcs  6f           ; C --&amp;gt; Always round up&lt;br /&gt;
    cp    R26, R24&lt;br /&gt;
    cpc   R27, R25     ; C decides rounding&lt;br /&gt;
6:  adc   R26, R19&lt;br /&gt;
    adc   R27, R19     ; Round up if C (R19=0)&lt;br /&gt;
    mov   R25, R27     ; return in R25:R24 for avr-gcc ABI compliance&lt;br /&gt;
    mov   R24, R26&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
.size sqrt32_round, .-sqrt32_round&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Abrunden ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Ressourcen-Verbrauch, Abrunden&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;Flash&#039;&#039;&#039;    || 60 Bytes&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;RAM&#039;&#039;&#039;      || 2&amp;amp;ndash;3 Bytes dynamisch, 0 Bytes statisch&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;Laufzeit&#039;&#039;&#039; || 260&amp;amp;ndash;300 Ticks (inclusive Zeiten für CALL+RET)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sqrt32.S&#039;&#039;&#039; (sqrt32_floor)&lt;br /&gt;
{{Scrollbox|25em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
;  Fast and short 32 bits AVR sqrt routine, avr-gcc ABI compliant&lt;br /&gt;
;  R25:R24 = SQRT (R25:R24:R23:R22) &lt;br /&gt;
;  rounded down to integer&lt;br /&gt;
;     Destroys R26,R27,R22,R23,R18,R19&lt;br /&gt;
;  Cycles incl call &amp;amp; ret = 260-300&lt;br /&gt;
;  Stack incl call = 2-3&lt;br /&gt;
.text&lt;br /&gt;
.global sqrt32_floor&lt;br /&gt;
.type sqrt32_floor, @function&lt;br /&gt;
&lt;br /&gt;
sqrt32_floor:&lt;br /&gt;
    ldi   R19, 0xc0&lt;br /&gt;
    clr   R18               ; rotation mask in R19:R18&lt;br /&gt;
    ldi   R27, 0x40&lt;br /&gt;
    sub   R26, R26          ; developing sqrt in R27:R26, C=0&lt;br /&gt;
1:  brcs  2f                ; C --&amp;gt; Bit is always 1&lt;br /&gt;
    cp    R24, R26&lt;br /&gt;
    cpc   R25, R27          ; Does test value fit?&lt;br /&gt;
    brcs  3f                ; C --&amp;gt; nope, bit is 0&lt;br /&gt;
2:  sub   R24, R26&lt;br /&gt;
    sbc   R25, R27          ; Adjust argument for next bit&lt;br /&gt;
    or    R26, R18&lt;br /&gt;
    or    R27, R19          ; Set bit to 1&lt;br /&gt;
3:  lsr   R19&lt;br /&gt;
    ror   R18               ; Shift right mask, C --&amp;gt; end loop&lt;br /&gt;
    eor   R27, R19&lt;br /&gt;
    eor   R26, R18          ; Shift right only test bit in result&lt;br /&gt;
    rol   R22               ; Bit 0 only set if end of loop&lt;br /&gt;
    rol   R23&lt;br /&gt;
    rol   R24&lt;br /&gt;
    rol   R25               ; Shift left remaining argument (C used at 1:)&lt;br /&gt;
    sbrs  R22, 0            ; Skip if 15 bits developed&lt;br /&gt;
    rjmp  1b                ; Develop 15 bits of the sqrt&lt;br /&gt;
&lt;br /&gt;
    brcs  4f                ; C--&amp;gt; Last bits always 1&lt;br /&gt;
    lsl   R23               ; Need bit 7 in C for cpc&lt;br /&gt;
    cpc   R26, R24&lt;br /&gt;
    cpc   R27, R25          ; After this C is last bit&lt;br /&gt;
&lt;br /&gt;
4:  adc   R26, R19          ; Round up if C (R19=0)&lt;br /&gt;
    mov   R25, R27          ; return in R25:R24 as for avr-gcc ABI&lt;br /&gt;
    mov   R24, R26&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
.size sqrt32_floor, .-sqrt32_floor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== avr-gcc Implementierung (16 Bit) ===&lt;br /&gt;
&lt;br /&gt;
Falls eine MUL-Instruktion vorhanden ist, benötigt eine 16-Bit Implementierung der Quadratwurzel nur eine handvoll Instruktionen und kann einigermassen bequem in Inline-Assembler geschrieben werden. Der Assembler-Teil besteht lediglich aus 9&amp;amp;nbsp;Instruktionen und dauert unabhängig vom Eingabewert 80&amp;amp;nbsp;Ticks.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sqrt16_floor&#039;&#039;&#039; (Braucht MUL, Inline-Assembler und auf Größe optimiert)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#if defined (__AVR_ENHANCED__)&lt;br /&gt;
&lt;br /&gt;
static inline uint8_t&lt;br /&gt;
sqrt16_floor (uint16_t q)&lt;br /&gt;
{&lt;br /&gt;
    uint8_t res = 0;&lt;br /&gt;
    uint8_t mask = 1 &amp;lt;&amp;lt; 7;&lt;br /&gt;
    &lt;br /&gt;
    asm(&amp;quot;0:	add  %[res], %[mask]&amp;quot;   &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	mul  %[res], %[res]&amp;quot;    &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	cp   %A[q], R0&amp;quot;         &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	cpc  %B[q], R1&amp;quot;         &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	brsh 1f&amp;quot;                &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	sub  %[res], %[mask]&amp;quot;   &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;1:	lsr  %[mask]&amp;quot;           &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	brne 0b&amp;quot;                &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	clr  __zero_reg__&amp;quot;&lt;br /&gt;
        : [res] &amp;quot;+r&amp;quot; (res), [mask] &amp;quot;+r&amp;quot; (mask)&lt;br /&gt;
        : [q] &amp;quot;r&amp;quot; (q));&lt;br /&gt;
        &lt;br /&gt;
    return res;&lt;br /&gt;
}&lt;br /&gt;
#endif // __AVR_ENHANCED__&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es handelt sich um eine größenoptimierte Version eines Algorithmus&#039; von Marko Surup, siehe &#039;&#039;[http://www.mikrocontroller.net/topic/231332#2338343 Forum: AVR: 16-Bit Quadratwurzel in 63 Takten]&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C-Variante&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die C-Variante verbraucht auf einem ATmega etwa 25 Instruktionen und 120 Ticks inclusive Funktionsaufruf und Parameteraufbereitung (getestet mit avr-gcc 4.6 und auf Größe optimiert):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uint8_t c_sqrt16 (uint16_t q)&lt;br /&gt;
{&lt;br /&gt;
    uint8_t r, mask;&lt;br /&gt;
    uint8_t i = 8*sizeof (r) -1;&lt;br /&gt;
&lt;br /&gt;
    r = mask = 1 &amp;lt;&amp;lt; i;&lt;br /&gt;
    &lt;br /&gt;
    for (; i &amp;gt; 0; i--)&lt;br /&gt;
    {&lt;br /&gt;
        mask &amp;gt;&amp;gt;= 1;&lt;br /&gt;
        &lt;br /&gt;
        if (q &amp;lt; (uint16_t) r*r)&lt;br /&gt;
            r -= mask;&lt;br /&gt;
        else&lt;br /&gt;
            r += mask;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (q &amp;lt; (uint16_t) r*r)&lt;br /&gt;
        r -= 1;&lt;br /&gt;
    &lt;br /&gt;
    return r;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Binär zu BCD - Umwandlung==&lt;br /&gt;
Zur Ausgabe einer Binärzahl auf ein Textdisplay oder zur seriellen ASCII-Übertragung an den PC ist diese Umwandlung nötig. Sie ist ähnlich aufwendig wie eine Division, zum Beispiel für eine 32-Bit-Zahl etwa 500-900 Taktzyklen und 10 Register.&lt;br /&gt;
Mehrere Verfahren werden angeboten:&lt;br /&gt;
=== Division /10===&lt;br /&gt;
Für eine Division pro Dezimalstelle ist nur ein Unterprogramm nötig. Der Divisionsrest, engl. remainder, bildet unmittelbar die BCD-codierte Dezimalziffer, von rechts nach links fortschreitend. Zur Ausgabe von links nach rechts kann man die Ziffern auf dem Stack zwischenlagern (LIFO-Register last-in first-out)&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
*[http://www.atmel.com/dyn/resources/prod_documents/doc0938.pdf AVR204: BCD Arithmetics, 8-Bit Binary to 2-digit BCD Conversion]&lt;br /&gt;
&lt;br /&gt;
===Division /10000, /1000, /100, /10===&lt;br /&gt;
ähnlich dem vorigen, aber die BCD-Ziffern erscheinen sofort von links nach rechts.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
*[http://users.i.com.ua/~birua/math32.asm Bin2BCD == 16-bit Binary to BCD conversion in der Macrolibrary Math32 von Andre Birua]&lt;br /&gt;
*[http://avr-asm.tripod.com/math32x.html oder auch hier zu finden]&lt;br /&gt;
&lt;br /&gt;
===Addition von $33===&lt;br /&gt;
Hier wird die Binärzahl, mit der höchstwertigen Stelle voran, von rechts in die Ergebnisregister geschoben. Nach jedem Schiebevorgang wird eine Korrekturrechnung ausgeführt. Für 32 Bit bilden 4 Eingabe- und 5 Ausgaberegister ein 72 Bit Schieberegister, das 32 mal links geschoben wird.&lt;br /&gt;
Durch die Korrekturrechnung wird die Binärzahl zur gepackten (2 Stellen pro Byte) BCD-Zahl &amp;quot;aufgebläht&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Eine Erklärung des Algorithmus soll hier versucht werden: &lt;br /&gt;
Um die niederwertigste 4 Bit Binärziffer in BCD umzuwandeln, ist für $0...$9 keine Änderung nötig, für $A...$F wird &amp;quot;6&amp;quot; addiert. Diese Addition wird ersetzt durch eine Addition von &amp;quot;3&amp;quot; und anschließendes Linksschieben. Das führt man zunächst für beide Halbbytes gleichzeitig mit &amp;quot;subi Reg,-$33&amp;quot; aus. Anschließend werden die beiden Additionen einzeln für den Fall &amp;quot;0...9&amp;quot; rückgängig gemacht. Die Bits 4 und 7 des Registers dient dabei als BCD-Carry-Flag (Halbbyte-Übertrag). Das normale C-Flag wird durch die Additionen nicht beeinflußt, es dient nur dem Schiebevorgang.&lt;br /&gt;
&lt;br /&gt;
Beispiele: &lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc0938.pdf AVR204: BCD Arithmetics 16 Bit Binary to 5-digit BCD conversion]&lt;br /&gt;
* [http://avr-asm.tripod.com/math32x.html The AVR Assembler Site: 32 Bit Math]&lt;br /&gt;
* [http://www.ingelec.uns.edu.ar/dclac2558/BCD2BIN.PDF Der gleiche serielle Algorithmus für Xilinx CPLDs]&lt;br /&gt;
&lt;br /&gt;
===Tabelle===&lt;br /&gt;
Für kleine Zahlen kann die gesuchte BCD-Zahl auch aus einer Tabelle entnommen werden.&lt;br /&gt;
===Mischvarianten===&lt;br /&gt;
Eine Mischung mehrerer Verfahren wird z.&amp;amp;nbsp;B. von Andre Birua in der ersten Variante von &amp;quot;Bin4BCD&amp;quot; verwendet. Die oberen 16 Bit werden nach &amp;quot;Div/10000&amp;quot; vorbearbeitet und anschließend alle 32 Bit nach &amp;quot;Add $33&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Tutorial===&lt;br /&gt;
*[http://www.cs.uiowa.edu/~jones/bcd/decimal.html Part of  the Arithmetic Tutorial Collection by Douglas W. Jones] &lt;br /&gt;
enthält C-Code und PIC-Code für schnelle 16 Bit Wandlung, Hardware-Multiplizierer möglich - auch für FPGA interessant&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/TTL74185 VHDL Nachbau des TTL 74185 6-Bit Binär-zu-BCD-Wandlers]&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/Festkommaarithmetik Tutorial Festkommaarithmetik]&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige  Tutorial 7-Segment-Anzeige]&lt;br /&gt;
&lt;br /&gt;
=== Sammlungen ===&lt;br /&gt;
&lt;br /&gt;
===Diskussionsbeiträge im Forum===&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/85248 Binär-zu-BCD in VHDL]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/83884 ebenfalls VHDL]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/59851 32 Bit in C]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/64842 16 und 32 Bit C und AVR-Assembler]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/1501 Assembler für AVR-GCC bis 256 Bit]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/173633 2 hoch x , wenn x kein Integer ist]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/230317 schnelle dezimale Division auf AVR &amp;amp; Co.]&lt;br /&gt;
&lt;br /&gt;
== Sinus und Cosinus ==&lt;br /&gt;
&amp;amp;rarr; siehe [[AVR Arithmetik/Sinus und Cosinus (CORDIC)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;rarr; siehe [[AVR Arithmetik/Sinus und Cosinus (Lineare Interpolation)]]&lt;br /&gt;
&lt;br /&gt;
== Saturierung ==&lt;br /&gt;
&amp;amp;rarr; siehe [[AVR Arithmetik/Saturierung]]&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks==&lt;br /&gt;
* [http://faculty.capitol-college.edu/~andresho/tutor/Multimedia/AVR/HW_mult/avr201.htm AVR201: Using the AVR Hardware Multiplier] (Implementierung und Beispiele)&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc1631.pdf AVR201: Using the AVR Hardware Multiplier] (Application Note, pdf, en)&lt;br /&gt;
* [http://www.azillionmonkeys.com/qed/sqroot.html Wurzelfunktion]&lt;br /&gt;
* [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=printview&amp;amp;t=37150&amp;amp;start=40 Optimierte Division durch 10]&lt;br /&gt;
* [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=printview&amp;amp;t=54192&amp;amp;start=20 Optimierte Division durch 3]&lt;br /&gt;
* [http://www.cs.uiowa.edu/~jones/bcd/divide.html Division durch reziproke Multiplikation, Tutorial]&lt;br /&gt;
* [http://web.archive.org/web/20080519123741/http://users.i.com.ua/~birua/math32.html Math32: Some Useful Assembler Multibyte Maths  Subroutines &amp;amp; Macrocalls] [http://avr-asm.tripod.com/math32x.html (oder hier)]&lt;br /&gt;
*[http://elm-chan.org/cc_e.html Elm-Chan&#039;s Bibliotheken u.a. Arithmetik]&lt;br /&gt;
* [http://www.embedded.com/design/opensource/217900224?printable=true Multiplication by a Fixed Point Constant], Embedded.com, 06/16/09&lt;br /&gt;
* [http://surfnet.dl.sourceforge.net/sourceforge/avrfix/avrfix.pdf M. Rosenblattl, A. Wolf: &#039;&#039;Fixed Point Library According to ISO/IEC Standard DTR 18037 for Atmel AVR Processors&#039;&#039;] (pdf, engl., 133 S.)&lt;br /&gt;
* [http://www.open-std.org/JTC1/sc22/wg14/www/docs/n1005.pdf ISO/IEC DTR 18037] (pdf, engl., 101 S.) &amp;amp;mdash; Spezifikation einer Erweiterung von C99 zur Unterstützung von Embedded Systems &lt;br /&gt;
* [http://www.phy6.org/outreach/edu/roman.htm A Different Kind of Multiplication]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial|AVR Arithmetik]]&lt;br /&gt;
[[Category:AVR-Arithmetik| ]]&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Arithmetik&amp;diff=102624</id>
		<title>AVR Arithmetik</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Arithmetik&amp;diff=102624"/>
		<updated>2020-11-30T20:22:01Z</updated>

		<summary type="html">&lt;p&gt;Avrsteffen: /* Multiplikation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Artikel beschäftigt sich mit 16- und 32-Bit Arithmetik auf [[AVR]]-Controllern. Für detailierte Ausführungen zur [[AVR-Tutorial: Arithmetik8|8-Bit Arithmetik auf AVR]] gibt es eine Seite im [[AVR-Tutorial]].&lt;br /&gt;
&lt;br /&gt;
== Glossar ==&lt;br /&gt;
&lt;br /&gt;
MSB: Most Significant Byte, Höchstwertiges Byte&lt;br /&gt;
&lt;br /&gt;
LSB: Least Significant Byte, Niedrigstwertiges Byte&lt;br /&gt;
&lt;br /&gt;
== Vergleich ==&lt;br /&gt;
&lt;br /&gt;
=== 16 Bit ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ;              LSB  MSB         LSB  MSB&lt;br /&gt;
    ; Vergleiche &amp;lt; r16, r17 &amp;gt; mit &amp;lt; r20, r21 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    cp    r16, r20&lt;br /&gt;
    cpc   r17, r21&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 32 Bit ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ;              LSB            MSB         LSB            MSB&lt;br /&gt;
    ; Vergleiche &amp;lt; r16, r17, r18, r19 &amp;gt; mit &amp;lt; r20, r21, r22, r23 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    cp    r16, r20&lt;br /&gt;
    cpc   r17, r21&lt;br /&gt;
    cpc   r18, r22&lt;br /&gt;
    cpc   r19, r23&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Addition==&lt;br /&gt;
===16 Bit + 16 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ; &amp;lt; r16, r17 &amp;gt; = &amp;lt; r16, r17 &amp;gt; + &amp;lt; r20, r21 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    add   r16, r20&lt;br /&gt;
    adc   r17, r21&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===32 Bit + 32 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ; &amp;lt; r16, r17, r18, r19 &amp;gt; = &amp;lt; r16, r17, r18, r19 &amp;gt; + &amp;lt; r20, r21, r22, r23 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    add   r16, r20&lt;br /&gt;
    adc   r17, r21&lt;br /&gt;
    adc   r18, r22&lt;br /&gt;
    adc   r19, r23&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Subtraktion==&lt;br /&gt;
===16 Bit - 16 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ; &amp;lt; r16, r17 &amp;gt; = &amp;lt; r16, r17 &amp;gt; - &amp;lt; r20, r21 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    sub   r16, r20&lt;br /&gt;
    sbc   r17, r21&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===32 Bit - 32 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
    ;&lt;br /&gt;
    ;   LSB            MSB       LSB            MSB       LSB            MSB&lt;br /&gt;
    ; &amp;lt; r16, r17, r18, r19 &amp;gt; = &amp;lt; r16, r17, r18, r19 &amp;gt; - &amp;lt; r20, r21, r22, r23 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    sub   r16, r20&lt;br /&gt;
    sbc   r17, r21&lt;br /&gt;
    sbc   r18, r22&lt;br /&gt;
    sbc   r19, r23&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Division==&lt;br /&gt;
===32 Bit / 32 Bit===&lt;br /&gt;
&lt;br /&gt;
Ergebnis gerundet, und mit Restbildung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.def	a0	= r16&lt;br /&gt;
.def	a1	= r17&lt;br /&gt;
.def	a2	= r18&lt;br /&gt;
.def	a3	= r19&lt;br /&gt;
&lt;br /&gt;
.def	b0	= r20&lt;br /&gt;
.def	b1	= r21&lt;br /&gt;
.def	b2	= r22&lt;br /&gt;
.def	b3	= r23&lt;br /&gt;
&lt;br /&gt;
.def	t0	= r24&lt;br /&gt;
.def	t1	= r25&lt;br /&gt;
.def	t2	= r26&lt;br /&gt;
.def	t3	= r27&lt;br /&gt;
&lt;br /&gt;
.def	t4	= r28&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned rounded division 32 bit                *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
&lt;br /&gt;
urdiv32:&lt;br /&gt;
	mov	t0, b0		;T = B&lt;br /&gt;
	mov	t1, b1&lt;br /&gt;
	mov	t2, b2&lt;br /&gt;
	mov	t3, b3&lt;br /&gt;
	lsr	t3		;B / 2&lt;br /&gt;
	ror	t2&lt;br /&gt;
	ror	t1&lt;br /&gt;
	ror	t0&lt;br /&gt;
	add	a0, t0		;A = A + B / 2&lt;br /&gt;
	adc	a1, t1&lt;br /&gt;
	adc	a2, t2&lt;br /&gt;
	adc	a3, t3&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned division 32 bit                        *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
&lt;br /&gt;
; a3..0 = a3..0 / b3..0 (Ganzzahldivision)&lt;br /&gt;
; b3..0 = a3..0 % b3..0 (Rest)&lt;br /&gt;
&lt;br /&gt;
; cycle: max 684&lt;br /&gt;
&lt;br /&gt;
udiv32:&lt;br /&gt;
	clr	t0&lt;br /&gt;
	clr	t1&lt;br /&gt;
	clr	t2&lt;br /&gt;
	clr	t3&lt;br /&gt;
	ldi	t4, 32&lt;br /&gt;
udi1:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t0&lt;br /&gt;
	rol	t1&lt;br /&gt;
	rol	t2&lt;br /&gt;
	rol	t3&lt;br /&gt;
	cp	t0, b0&lt;br /&gt;
	cpc	t1, b1&lt;br /&gt;
	cpc	t2, b2&lt;br /&gt;
	cpc	t3, b3&lt;br /&gt;
	brcs	udi2&lt;br /&gt;
	sub	t0, b0&lt;br /&gt;
	sbc	t1, b1&lt;br /&gt;
	sbc	t2, b2&lt;br /&gt;
	sbc	t3, b3&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi2:	dec	t4&lt;br /&gt;
	brne	udi1&lt;br /&gt;
	mov	b0, t0&lt;br /&gt;
	mov	b1, t1&lt;br /&gt;
	mov	b2, t2&lt;br /&gt;
	mov	b3, t3&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Version, die je nach konkreten Zahlen Rechenzeit einspart&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.def	a0	= r16&lt;br /&gt;
.def	a1	= r17&lt;br /&gt;
.def	a2	= r18&lt;br /&gt;
.def	a3	= r19&lt;br /&gt;
&lt;br /&gt;
.def	b0	= r20&lt;br /&gt;
.def	b1	= r21&lt;br /&gt;
.def	b2	= r22&lt;br /&gt;
.def	b3	= r23&lt;br /&gt;
&lt;br /&gt;
.def	t0	= r24&lt;br /&gt;
.def	t1	= r25&lt;br /&gt;
.def	t2	= r26&lt;br /&gt;
.def	t3	= r27&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned rounded division 32 bit                *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
&lt;br /&gt;
urdiv32:&lt;br /&gt;
	mov	t0, b0		;T = B&lt;br /&gt;
	mov	t1, b1&lt;br /&gt;
	mov	t2, b2&lt;br /&gt;
	mov	t3, b3&lt;br /&gt;
	lsr	t3		;B / 2&lt;br /&gt;
	ror	t2&lt;br /&gt;
	ror	t1&lt;br /&gt;
	ror	t0&lt;br /&gt;
	add	a0, t0		;A = A + B / 2&lt;br /&gt;
	adc	a1, t1&lt;br /&gt;
	adc	a2, t2&lt;br /&gt;
	adc	a3, t3&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned division 32 bit                        *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;cycle: max 431 (63%) (684)&lt;br /&gt;
&lt;br /&gt;
udiv32:&lt;br /&gt;
	clr	t1&lt;br /&gt;
	tst	b3&lt;br /&gt;
	breq	udi10&lt;br /&gt;
	ldi	t0, 8&lt;br /&gt;
udi1:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t1&lt;br /&gt;
	cp	a1, b0&lt;br /&gt;
	cpc	a2, b1&lt;br /&gt;
	cpc	a3, b2&lt;br /&gt;
	cpc	t1, b3&lt;br /&gt;
	brcs	udi2&lt;br /&gt;
	sub	a1, b0&lt;br /&gt;
	sbc	a2, b1&lt;br /&gt;
	sbc	a3, b2&lt;br /&gt;
	sbc	t1, b3&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi2:	dec	t0&lt;br /&gt;
	brne	udi1&lt;br /&gt;
	mov	b0, a1&lt;br /&gt;
	clr	a1&lt;br /&gt;
	mov	b1, a2&lt;br /&gt;
	clr	a2&lt;br /&gt;
	mov	b2, a3&lt;br /&gt;
	clr	a3&lt;br /&gt;
	mov	b3, t1&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
udi10:	tst	b2&lt;br /&gt;
	breq	udi20&lt;br /&gt;
	ldi	t0, 16&lt;br /&gt;
udi11:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t1&lt;br /&gt;
	brcs	udi12&lt;br /&gt;
	cp	a2, b0&lt;br /&gt;
	cpc	a3, b1&lt;br /&gt;
	cpc	t1, b2&lt;br /&gt;
	brcs	udi13&lt;br /&gt;
udi12:	sub	a2, b0&lt;br /&gt;
	sbc	a3, b1&lt;br /&gt;
	sbc	t1, b2&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi13:	dec	t0&lt;br /&gt;
	brne	udi11&lt;br /&gt;
	mov	b0, a2&lt;br /&gt;
	clr	a2&lt;br /&gt;
	mov	b1, a3&lt;br /&gt;
	clr	a3&lt;br /&gt;
	mov	b2, t1&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
udi20:	tst	b1&lt;br /&gt;
	breq	udi30&lt;br /&gt;
	ldi	t0, 24&lt;br /&gt;
udi21:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t1&lt;br /&gt;
	brcs	udi22&lt;br /&gt;
	cp	a3, b0&lt;br /&gt;
	cpc	t1, b1&lt;br /&gt;
	brcs	udi23&lt;br /&gt;
udi22:	sub	a3, b0&lt;br /&gt;
	sbc	t1, b1&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi23:	dec	t0&lt;br /&gt;
	brne	udi21&lt;br /&gt;
	mov	b0, a3&lt;br /&gt;
	clr	a3&lt;br /&gt;
	mov	b1, t1&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
udi30:	ldi	t0, 32&lt;br /&gt;
udi31:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t1&lt;br /&gt;
	brcs	udi32&lt;br /&gt;
	cp	t1, b0&lt;br /&gt;
	brcs	udi33&lt;br /&gt;
udi32:	sub	t1, b0&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi33:	dec	t0&lt;br /&gt;
	brne	udi31&lt;br /&gt;
	mov	b0, t1			;store remainder&lt;br /&gt;
	ret&lt;br /&gt;
;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Multiplikation==&lt;br /&gt;
===32 Bit * 16 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
.def	a0	= r16&lt;br /&gt;
.def	a1	= r17&lt;br /&gt;
.def	a2	= r18&lt;br /&gt;
.def	a3	= r19&lt;br /&gt;
&lt;br /&gt;
.def	b0	= r20&lt;br /&gt;
.def	b1	= r21&lt;br /&gt;
.def	b2	= r22&lt;br /&gt;
.def	b3	= r23&lt;br /&gt;
&lt;br /&gt;
.def	t0	= r24&lt;br /&gt;
.def	t1	= r25&lt;br /&gt;
.def	t2	= r26&lt;br /&gt;
.def	t3	= r27&lt;br /&gt;
.def	i0	= r28&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned multiplication 32 bit                  *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;cycle: max 245&lt;br /&gt;
&lt;br /&gt;
umul32:&lt;br /&gt;
	cpi	a3, 0&lt;br /&gt;
	cpc	a3, a2&lt;br /&gt;
	breq	_umu1		;one operand must be below 65536&lt;br /&gt;
	mov	t0, a0		; swap A &amp;lt;-&amp;gt; B&lt;br /&gt;
	mov	a0, b0&lt;br /&gt;
	mov	b0, t0&lt;br /&gt;
	mov	t0, a1&lt;br /&gt;
	mov	a1, b1&lt;br /&gt;
	mov	b1, t0&lt;br /&gt;
	mov	b2, a2&lt;br /&gt;
	mov	b3, a3&lt;br /&gt;
	clr	a2&lt;br /&gt;
	clr	a3&lt;br /&gt;
;				a3,2,1,0 = a1,0 * b3,2,1,0&lt;br /&gt;
_umu1:	ldi	i0, 16&lt;br /&gt;
	clr	t0&lt;br /&gt;
	clr	t1&lt;br /&gt;
	ror	a1&lt;br /&gt;
	ror	a0&lt;br /&gt;
_umu2:	brcc	_umu3&lt;br /&gt;
	add	a2, b0&lt;br /&gt;
	adc	a3, b1&lt;br /&gt;
	adc	t0, b2&lt;br /&gt;
	adc	t1, b3&lt;br /&gt;
_umu3:	ror	t1&lt;br /&gt;
	ror	t0&lt;br /&gt;
	ror	a3&lt;br /&gt;
	ror	a2&lt;br /&gt;
	ror	a1&lt;br /&gt;
	ror	a0&lt;br /&gt;
	dec	i0&lt;br /&gt;
	brne	_umu2&lt;br /&gt;
	ret&lt;br /&gt;
;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===24 Bit * 24 Bit===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;**********************************************************************************************&lt;br /&gt;
;&lt;br /&gt;
;  muls24x24_48:&lt;br /&gt;
;  Signed Multiply von 2 24Bit breiten Zahlen mit 48Bit ergebnis&lt;br /&gt;
;&lt;br /&gt;
;  x                       = a           * b&lt;br /&gt;
;  R21:R20:R19:R18:R17:R16 = R27:R26:R25 * R24:R23:R22&lt;br /&gt;
;  hi                  lo    hi      lo    hi      lo&lt;br /&gt;
;&lt;br /&gt;
;**********************************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls24x24_48:&lt;br /&gt;
    clr    r2          ;Zero Register&lt;br /&gt;
    muls  r27,r24        ; (1) signed Multiply a(MSB) * b(MSB)&lt;br /&gt;
    movw   r20,r0&lt;br /&gt;
&lt;br /&gt;
    mul    r26,r23        ; (2) unsigned&lt;br /&gt;
    movw   r18,r0&lt;br /&gt;
&lt;br /&gt;
    mul    r25,r22        ; (3) unsigned multiply a(LSB) * b(LSB)&lt;br /&gt;
    movw   r16,r0&lt;br /&gt;
&lt;br /&gt;
    mul    r26,r22        ;(4) unsigned&lt;br /&gt;
    add    r17,r0&lt;br /&gt;
    adc    r18,r1&lt;br /&gt;
    adc    r19,r2&lt;br /&gt;
    adc    r20,r2&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    mul    r25,r23        ;(5) unsigned&lt;br /&gt;
    add    r17,r0&lt;br /&gt;
    adc    r18,r1&lt;br /&gt;
    adc    r19,r2&lt;br /&gt;
    adc    r20,r2&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    push  r16&lt;br /&gt;
    push  r17&lt;br /&gt;
&lt;br /&gt;
    mov    r16,r27&lt;br /&gt;
    mulsu  r16,r22        ;(6) unsigned * signed&lt;br /&gt;
    sbc    r20,r2&lt;br /&gt;
    sbc    r21,r2&lt;br /&gt;
    add    r18,r0&lt;br /&gt;
    adc    r19,r1&lt;br /&gt;
    adc    r20,r2&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    mulsu  r16,r23        ;(7) unsigned * signed&lt;br /&gt;
    sbc    r21,r2&lt;br /&gt;
    add    r19,r0&lt;br /&gt;
    adc    r20,r1&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    movw   r16,r24&lt;br /&gt;
    mulsu  r16,r17        ;(8) unsigned * signed&lt;br /&gt;
    sbc    r20,r2&lt;br /&gt;
    sbc    r21,r2&lt;br /&gt;
    add    r18,r0&lt;br /&gt;
    adc    r19,r1&lt;br /&gt;
    adc    r20,r2&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    mov    r17,r26&lt;br /&gt;
    mulsu  r16,r17        ;(9) unsigned * signed&lt;br /&gt;
    sbc    r21,r2&lt;br /&gt;
    add    r19,r0&lt;br /&gt;
    adc    r20,r1&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    pop    r17&lt;br /&gt;
    pop    r16&lt;br /&gt;
    ret&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Weiterführende Links ===&lt;br /&gt;
*[https://www.mikrocontroller.net/articles/Multiplikation_in_Assembler Multiplikation in Assembler] - Enthält schon viele kleine Multiplikations-Include-Dateien für den AVR Assembler&lt;br /&gt;
&lt;br /&gt;
==Wurzel==&lt;br /&gt;
&lt;br /&gt;
=== avr-gcc Implementierung (32 Bit) ===&lt;br /&gt;
Quadratwurzel basierend auf einer Implementierung von Ruud v Gessel&amp;lt;ref&amp;gt;[http://members.chello.nl/j.beentjes3/Ruud/sqrt32avr.htm Ruud v Gessel: Quadratwurzeln]&amp;lt;/ref&amp;gt;, die zusammen mit avr-gcc verwendet werden kann. Je nach Algorithmus wird das  Ergebnis zum Nächsten gerundet oder abgerundet. Abrunden ist dann angesagt, wenn die Wurzel aus einer großen Eingabe wie &amp;lt;tt&amp;gt;0xffffffff&amp;lt;/tt&amp;gt; zu ziehen ist, da bei Aufrunden hier das Ergebnis zu 0 überläuft.&lt;br /&gt;
&lt;br /&gt;
Die maximale Ausführungszeit ist höchstens 310 Ticks (inclusive CALL+RET):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;sqrt32.h&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#ifndef SQRT32_H&lt;br /&gt;
#define SQRT32_H&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
extern uint16_t sqrt32_round (uint32_t);&lt;br /&gt;
extern uint16_t sqrt32_floor (uint32_t);&lt;br /&gt;
&lt;br /&gt;
#endif /* SQRT32_H */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C-Module, welche die Wurzel benötigen, includen einfach diesen Header. Das Assembler-Modul wird assembliert und zum Projekt hinzugelinkt.&lt;br /&gt;
&lt;br /&gt;
==== Rundung zum Nächsten ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Ressourcen-Verbrauch, Rundung zum Nächsten&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;Flash&#039;&#039;&#039;    || 82 Bytes&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;RAM&#039;&#039;&#039;      || 2&amp;amp;ndash;3 Bytes dynamisch, 0 Bytes statisch&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;Laufzeit&#039;&#039;&#039; || 265&amp;amp;ndash;310 Ticks (inclusive Zeiten für CALL+RET)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sqrt32.S&#039;&#039;&#039; (sqrt32_round)&lt;br /&gt;
{{Scrollbox|25em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------&lt;br /&gt;
; Fast and short 32 bits AVR sqrt routine, avr-gcc ABI compliant&lt;br /&gt;
; R25:R24 = SQRT (R25:R24:R23:R22) rounded to the &lt;br /&gt;
; nearest integer (0.5 rounds up)&lt;br /&gt;
; Destroys R18-R19,R22-R23,R26-R27&lt;br /&gt;
; Cycles incl call &amp;amp; ret = 265-310&lt;br /&gt;
; Stack incl call = 2-3&lt;br /&gt;
;-----------------------------------------------------------&lt;br /&gt;
.text&lt;br /&gt;
.global sqrt32_round&lt;br /&gt;
.type sqrt32_round, @function&lt;br /&gt;
&lt;br /&gt;
sqrt32_round:&lt;br /&gt;
    ldi   R19, 0xc0&lt;br /&gt;
    clr   R18          ; rotation mask in R19:R18&lt;br /&gt;
    ldi   R27, 0x40&lt;br /&gt;
    sub   R26, R26     ; developing sqrt in R27:R26, C=0&lt;br /&gt;
1:  brcs  2f           ; C --&amp;gt; Bit is always 1&lt;br /&gt;
    cp    R24, R26&lt;br /&gt;
    cpc   R25, R27     ; Does test value fit?&lt;br /&gt;
    brcs  3f           ; C --&amp;gt; nope, bit is 0&lt;br /&gt;
2:  sub   R24, R26&lt;br /&gt;
    sbc   R25, R27     ; Adjust argument for next bit&lt;br /&gt;
    or    R26, R18&lt;br /&gt;
    or    R27, R19     ; Set bit to 1&lt;br /&gt;
3:  lsr   R19&lt;br /&gt;
    ror   R18          ; Shift right mask, C --&amp;gt; end loop&lt;br /&gt;
    eor   R27, R19&lt;br /&gt;
    eor   R26, R18     ; Shift right only test bit in result&lt;br /&gt;
    rol   R22          ; Bit 0 only set if end of loop&lt;br /&gt;
    rol   R23&lt;br /&gt;
    rol   R24&lt;br /&gt;
    rol   R25          ; Shift left remaining argument (C used at 1:)&lt;br /&gt;
    sbrs  R22, 0       ; Skip if 15 bits developed&lt;br /&gt;
    rjmp  1b           ; Develop 15 bits of the sqrt&lt;br /&gt;
    brcs  4f           ; C--&amp;gt; Last bits always 1&lt;br /&gt;
    cp    R26, R24&lt;br /&gt;
    cpc   R27, R25     ; Test for last bit 1&lt;br /&gt;
    brcc  5f           ; NC --&amp;gt; bit is 0&lt;br /&gt;
4:  sbc   R23, R19     ; Subtract C (any value from 1 to 0x7f will do)&lt;br /&gt;
    sbc   R24, R26&lt;br /&gt;
    sbc   R25, R27     ; Update argument for test&lt;br /&gt;
    inc   R26          ; Last bit is 1&lt;br /&gt;
5:  lsl   R23          ; Only bit 7 matters&lt;br /&gt;
    rol   R24&lt;br /&gt;
    rol   R25          ; Remainder * 2 + C&lt;br /&gt;
    brcs  6f           ; C --&amp;gt; Always round up&lt;br /&gt;
    cp    R26, R24&lt;br /&gt;
    cpc   R27, R25     ; C decides rounding&lt;br /&gt;
6:  adc   R26, R19&lt;br /&gt;
    adc   R27, R19     ; Round up if C (R19=0)&lt;br /&gt;
    mov   R25, R27     ; return in R25:R24 for avr-gcc ABI compliance&lt;br /&gt;
    mov   R24, R26&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
.size sqrt32_round, .-sqrt32_round&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Abrunden ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Ressourcen-Verbrauch, Abrunden&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;Flash&#039;&#039;&#039;    || 60 Bytes&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;RAM&#039;&#039;&#039;      || 2&amp;amp;ndash;3 Bytes dynamisch, 0 Bytes statisch&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;Laufzeit&#039;&#039;&#039; || 260&amp;amp;ndash;300 Ticks (inclusive Zeiten für CALL+RET)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sqrt32.S&#039;&#039;&#039; (sqrt32_floor)&lt;br /&gt;
{{Scrollbox|25em|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;avrasm&amp;quot;&amp;gt; &lt;br /&gt;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
;  Fast and short 32 bits AVR sqrt routine, avr-gcc ABI compliant&lt;br /&gt;
;  R25:R24 = SQRT (R25:R24:R23:R22) &lt;br /&gt;
;  rounded down to integer&lt;br /&gt;
;     Destroys R26,R27,R22,R23,R18,R19&lt;br /&gt;
;  Cycles incl call &amp;amp; ret = 260-300&lt;br /&gt;
;  Stack incl call = 2-3&lt;br /&gt;
.text&lt;br /&gt;
.global sqrt32_floor&lt;br /&gt;
.type sqrt32_floor, @function&lt;br /&gt;
&lt;br /&gt;
sqrt32_floor:&lt;br /&gt;
    ldi   R19, 0xc0&lt;br /&gt;
    clr   R18               ; rotation mask in R19:R18&lt;br /&gt;
    ldi   R27, 0x40&lt;br /&gt;
    sub   R26, R26          ; developing sqrt in R27:R26, C=0&lt;br /&gt;
1:  brcs  2f                ; C --&amp;gt; Bit is always 1&lt;br /&gt;
    cp    R24, R26&lt;br /&gt;
    cpc   R25, R27          ; Does test value fit?&lt;br /&gt;
    brcs  3f                ; C --&amp;gt; nope, bit is 0&lt;br /&gt;
2:  sub   R24, R26&lt;br /&gt;
    sbc   R25, R27          ; Adjust argument for next bit&lt;br /&gt;
    or    R26, R18&lt;br /&gt;
    or    R27, R19          ; Set bit to 1&lt;br /&gt;
3:  lsr   R19&lt;br /&gt;
    ror   R18               ; Shift right mask, C --&amp;gt; end loop&lt;br /&gt;
    eor   R27, R19&lt;br /&gt;
    eor   R26, R18          ; Shift right only test bit in result&lt;br /&gt;
    rol   R22               ; Bit 0 only set if end of loop&lt;br /&gt;
    rol   R23&lt;br /&gt;
    rol   R24&lt;br /&gt;
    rol   R25               ; Shift left remaining argument (C used at 1:)&lt;br /&gt;
    sbrs  R22, 0            ; Skip if 15 bits developed&lt;br /&gt;
    rjmp  1b                ; Develop 15 bits of the sqrt&lt;br /&gt;
&lt;br /&gt;
    brcs  4f                ; C--&amp;gt; Last bits always 1&lt;br /&gt;
    lsl   R23               ; Need bit 7 in C for cpc&lt;br /&gt;
    cpc   R26, R24&lt;br /&gt;
    cpc   R27, R25          ; After this C is last bit&lt;br /&gt;
&lt;br /&gt;
4:  adc   R26, R19          ; Round up if C (R19=0)&lt;br /&gt;
    mov   R25, R27          ; return in R25:R24 as for avr-gcc ABI&lt;br /&gt;
    mov   R24, R26&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
.size sqrt32_floor, .-sqrt32_floor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== avr-gcc Implementierung (16 Bit) ===&lt;br /&gt;
&lt;br /&gt;
Falls eine MUL-Instruktion vorhanden ist, benötigt eine 16-Bit Implementierung der Quadratwurzel nur eine handvoll Instruktionen und kann einigermassen bequem in Inline-Assembler geschrieben werden. Der Assembler-Teil besteht lediglich aus 9&amp;amp;nbsp;Instruktionen und dauert unabhängig vom Eingabewert 80&amp;amp;nbsp;Ticks.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sqrt16_floor&#039;&#039;&#039; (Braucht MUL, Inline-Assembler und auf Größe optimiert)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#if defined (__AVR_ENHANCED__)&lt;br /&gt;
&lt;br /&gt;
static inline uint8_t&lt;br /&gt;
sqrt16_floor (uint16_t q)&lt;br /&gt;
{&lt;br /&gt;
    uint8_t res = 0;&lt;br /&gt;
    uint8_t mask = 1 &amp;lt;&amp;lt; 7;&lt;br /&gt;
    &lt;br /&gt;
    asm(&amp;quot;0:	add  %[res], %[mask]&amp;quot;   &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	mul  %[res], %[res]&amp;quot;    &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	cp   %A[q], R0&amp;quot;         &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	cpc  %B[q], R1&amp;quot;         &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	brsh 1f&amp;quot;                &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	sub  %[res], %[mask]&amp;quot;   &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;1:	lsr  %[mask]&amp;quot;           &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	brne 0b&amp;quot;                &amp;quot;\n&amp;quot;&lt;br /&gt;
        &amp;quot;	clr  __zero_reg__&amp;quot;&lt;br /&gt;
        : [res] &amp;quot;+r&amp;quot; (res), [mask] &amp;quot;+r&amp;quot; (mask)&lt;br /&gt;
        : [q] &amp;quot;r&amp;quot; (q));&lt;br /&gt;
        &lt;br /&gt;
    return res;&lt;br /&gt;
}&lt;br /&gt;
#endif // __AVR_ENHANCED__&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es handelt sich um eine größenoptimierte Version eines Algorithmus&#039; von Marko Surup, siehe &#039;&#039;[http://www.mikrocontroller.net/topic/231332#2338343 Forum: AVR: 16-Bit Quadratwurzel in 63 Takten]&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C-Variante&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Die C-Variante verbraucht auf einem ATmega etwa 25 Instruktionen und 120 Ticks inclusive Funktionsaufruf und Parameteraufbereitung (getestet mit avr-gcc 4.6 und auf Größe optimiert):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uint8_t c_sqrt16 (uint16_t q)&lt;br /&gt;
{&lt;br /&gt;
    uint8_t r, mask;&lt;br /&gt;
    uint8_t i = 8*sizeof (r) -1;&lt;br /&gt;
&lt;br /&gt;
    r = mask = 1 &amp;lt;&amp;lt; i;&lt;br /&gt;
    &lt;br /&gt;
    for (; i &amp;gt; 0; i--)&lt;br /&gt;
    {&lt;br /&gt;
        mask &amp;gt;&amp;gt;= 1;&lt;br /&gt;
        &lt;br /&gt;
        if (q &amp;lt; (uint16_t) r*r)&lt;br /&gt;
            r -= mask;&lt;br /&gt;
        else&lt;br /&gt;
            r += mask;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (q &amp;lt; (uint16_t) r*r)&lt;br /&gt;
        r -= 1;&lt;br /&gt;
    &lt;br /&gt;
    return r;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Binär zu BCD - Umwandlung==&lt;br /&gt;
Zur Ausgabe einer Binärzahl auf ein Textdisplay oder zur seriellen ASCII-Übertragung an den PC ist diese Umwandlung nötig. Sie ist ähnlich aufwendig wie eine Division, zum Beispiel für eine 32-Bit-Zahl etwa 500-900 Taktzyklen und 10 Register.&lt;br /&gt;
Mehrere Verfahren werden angeboten:&lt;br /&gt;
=== Division /10===&lt;br /&gt;
Für eine Division pro Dezimalstelle ist nur ein Unterprogramm nötig. Der Divisionsrest, engl. remainder, bildet unmittelbar die BCD-codierte Dezimalziffer, von rechts nach links fortschreitend. Zur Ausgabe von links nach rechts kann man die Ziffern auf dem Stack zwischenlagern (LIFO-Register last-in first-out)&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
*[http://www.atmel.com/dyn/resources/prod_documents/doc0938.pdf AVR204: BCD Arithmetics, 8-Bit Binary to 2-digit BCD Conversion]&lt;br /&gt;
&lt;br /&gt;
===Division /10000, /1000, /100, /10===&lt;br /&gt;
ähnlich dem vorigen, aber die BCD-Ziffern erscheinen sofort von links nach rechts.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
*[http://users.i.com.ua/~birua/math32.asm Bin2BCD == 16-bit Binary to BCD conversion in der Macrolibrary Math32 von Andre Birua]&lt;br /&gt;
*[http://avr-asm.tripod.com/math32x.html oder auch hier zu finden]&lt;br /&gt;
&lt;br /&gt;
===Addition von $33===&lt;br /&gt;
Hier wird die Binärzahl, mit der höchstwertigen Stelle voran, von rechts in die Ergebnisregister geschoben. Nach jedem Schiebevorgang wird eine Korrekturrechnung ausgeführt. Für 32 Bit bilden 4 Eingabe- und 5 Ausgaberegister ein 72 Bit Schieberegister, das 32 mal links geschoben wird.&lt;br /&gt;
Durch die Korrekturrechnung wird die Binärzahl zur gepackten (2 Stellen pro Byte) BCD-Zahl &amp;quot;aufgebläht&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Eine Erklärung des Algorithmus soll hier versucht werden: &lt;br /&gt;
Um die niederwertigste 4 Bit Binärziffer in BCD umzuwandeln, ist für $0...$9 keine Änderung nötig, für $A...$F wird &amp;quot;6&amp;quot; addiert. Diese Addition wird ersetzt durch eine Addition von &amp;quot;3&amp;quot; und anschließendes Linksschieben. Das führt man zunächst für beide Halbbytes gleichzeitig mit &amp;quot;subi Reg,-$33&amp;quot; aus. Anschließend werden die beiden Additionen einzeln für den Fall &amp;quot;0...9&amp;quot; rückgängig gemacht. Die Bits 4 und 7 des Registers dient dabei als BCD-Carry-Flag (Halbbyte-Übertrag). Das normale C-Flag wird durch die Additionen nicht beeinflußt, es dient nur dem Schiebevorgang.&lt;br /&gt;
&lt;br /&gt;
Beispiele: &lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc0938.pdf AVR204: BCD Arithmetics 16 Bit Binary to 5-digit BCD conversion]&lt;br /&gt;
* [http://avr-asm.tripod.com/math32x.html The AVR Assembler Site: 32 Bit Math]&lt;br /&gt;
* [http://www.ingelec.uns.edu.ar/dclac2558/BCD2BIN.PDF Der gleiche serielle Algorithmus für Xilinx CPLDs]&lt;br /&gt;
&lt;br /&gt;
===Tabelle===&lt;br /&gt;
Für kleine Zahlen kann die gesuchte BCD-Zahl auch aus einer Tabelle entnommen werden.&lt;br /&gt;
===Mischvarianten===&lt;br /&gt;
Eine Mischung mehrerer Verfahren wird z.&amp;amp;nbsp;B. von Andre Birua in der ersten Variante von &amp;quot;Bin4BCD&amp;quot; verwendet. Die oberen 16 Bit werden nach &amp;quot;Div/10000&amp;quot; vorbearbeitet und anschließend alle 32 Bit nach &amp;quot;Add $33&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Tutorial===&lt;br /&gt;
*[http://www.cs.uiowa.edu/~jones/bcd/decimal.html Part of  the Arithmetic Tutorial Collection by Douglas W. Jones] &lt;br /&gt;
enthält C-Code und PIC-Code für schnelle 16 Bit Wandlung, Hardware-Multiplizierer möglich - auch für FPGA interessant&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/TTL74185 VHDL Nachbau des TTL 74185 6-Bit Binär-zu-BCD-Wandlers]&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/Festkommaarithmetik Tutorial Festkommaarithmetik]&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige  Tutorial 7-Segment-Anzeige]&lt;br /&gt;
&lt;br /&gt;
===Diskussionsbeiträge im Forum===&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/85248 Binär-zu-BCD in VHDL]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/83884 ebenfalls VHDL]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/59851 32 Bit in C]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/64842 16 und 32 Bit C und AVR-Assembler]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/1501 Assembler für AVR-GCC bis 256 Bit]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/173633 2 hoch x , wenn x kein Integer ist]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/230317 schnelle dezimale Division auf AVR &amp;amp; Co.]&lt;br /&gt;
&lt;br /&gt;
== Sinus und Cosinus ==&lt;br /&gt;
&amp;amp;rarr; siehe [[AVR Arithmetik/Sinus und Cosinus (CORDIC)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;rarr; siehe [[AVR Arithmetik/Sinus und Cosinus (Lineare Interpolation)]]&lt;br /&gt;
&lt;br /&gt;
== Saturierung ==&lt;br /&gt;
&amp;amp;rarr; siehe [[AVR Arithmetik/Saturierung]]&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks==&lt;br /&gt;
* [http://faculty.capitol-college.edu/~andresho/tutor/Multimedia/AVR/HW_mult/avr201.htm AVR201: Using the AVR Hardware Multiplier] (Implementierung und Beispiele)&lt;br /&gt;
* [http://www.atmel.com/dyn/resources/prod_documents/doc1631.pdf AVR201: Using the AVR Hardware Multiplier] (Application Note, pdf, en)&lt;br /&gt;
* [http://www.azillionmonkeys.com/qed/sqroot.html Wurzelfunktion]&lt;br /&gt;
* [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=printview&amp;amp;t=37150&amp;amp;start=40 Optimierte Division durch 10]&lt;br /&gt;
* [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=printview&amp;amp;t=54192&amp;amp;start=20 Optimierte Division durch 3]&lt;br /&gt;
* [http://www.cs.uiowa.edu/~jones/bcd/divide.html Division durch reziproke Multiplikation, Tutorial]&lt;br /&gt;
* [http://web.archive.org/web/20080519123741/http://users.i.com.ua/~birua/math32.html Math32: Some Useful Assembler Multibyte Maths  Subroutines &amp;amp; Macrocalls] [http://avr-asm.tripod.com/math32x.html (oder hier)]&lt;br /&gt;
*[http://elm-chan.org/cc_e.html Elm-Chan&#039;s Bibliotheken u.a. Arithmetik]&lt;br /&gt;
* [http://www.embedded.com/design/opensource/217900224?printable=true Multiplication by a Fixed Point Constant], Embedded.com, 06/16/09&lt;br /&gt;
* [http://surfnet.dl.sourceforge.net/sourceforge/avrfix/avrfix.pdf M. Rosenblattl, A. Wolf: &#039;&#039;Fixed Point Library According to ISO/IEC Standard DTR 18037 for Atmel AVR Processors&#039;&#039;] (pdf, engl., 133 S.)&lt;br /&gt;
* [http://www.open-std.org/JTC1/sc22/wg14/www/docs/n1005.pdf ISO/IEC DTR 18037] (pdf, engl., 101 S.) &amp;amp;mdash; Spezifikation einer Erweiterung von C99 zur Unterstützung von Embedded Systems &lt;br /&gt;
* [http://www.phy6.org/outreach/edu/roman.htm A Different Kind of Multiplication]&lt;br /&gt;
&lt;br /&gt;
[[Category:AVR-Tutorial|AVR Arithmetik]]&lt;br /&gt;
[[Category:AVR-Arithmetik| ]]&lt;/div&gt;</summary>
		<author><name>Avrsteffen</name></author>
	</entry>
</feed>