Nochwas: Momentan hast du einige Constraints zu eng. Bei mac müssen nur die in-ops des MUL "a" sein, op3 und result darf "r" sein (bzw "d" bei LDI).

Anstatt

Code:
	ldi r24, 0x01	 ;  result
	ldi r25, 0x80	 ;  result
	brcc 0f
	ldi r24, 0xff	 ;  result
	ldi r25, 0x7f	 ;  result
Spart folgendes (bei gleiche Laufzeit) 2 Bytes:

Code:
	ldi r24, 0x01	 ;  result
	ldi r25, 0x80	 ;  result
	brcc 0f
	sbiw r24, 2	 ;  result
Für weitere Tipps wär es auch hilfreich zu wissen, wohin Du optimieren willst (optimieren willst Du, sonst würdest Du kein asm anfassen).

Also: Größe oder Zeit. Klar, man will beides und mit Geschick bekommt man auch beides zu einem gewissen Grad, aber ab einem gewissen Punkt muss man sich dann entscheiden...

Interessant wäre auch, die Saturierung der 16-Bit-Werte in einem sibling call zu machen Das Ärgernis dabei ist, daß es keine Registerklasse für das return-Register r25:r24 gibt.