Zitat Zitat von JanB
Ich hätte nur gern mal gesehen wie C einen etwas komlizierteren Ausdruck in ASM übersetzt.
kommt schon

Code:
red0   = (boden_value_red0[2*i]*256   | boden_value_red0[2*i + 1]) >> 2;
     824:	f7 01       	movw	r30, r14
     826:	80 81       	ld	r24, Z
     828:	99 27       	eor	r25, r25
     82a:	98 2f       	mov	r25, r24
     82c:	88 27       	eor	r24, r24
     82e:	21 81       	ldd	r18, Z+1	; 0x01
     830:	33 27       	eor	r19, r19
     832:	82 2b       	or	r24, r18
     834:	93 2b       	or	r25, r19
     836:	95 95       	asr	r25
     838:	87 95       	ror	r24
     83a:	95 95       	asr	r25
     83c:	87 95       	ror	r24
     83e:	68 2f       	mov	r22, r24
Der GCC optimiert sowas eigentlich ganz gut.

Wie man erkennt kann läd er zuerst die Adresse des Array boden_value_red0 in das Register Z. Darüber lädt er den ersten Teil des Ausdrucks in die Register r24,r25 den zweiten in r18,r19, löscht die entsprechenden Bytes und verodert beides und schiebt es zweimal nach rechts.
Dann wird das Ergebnis in r22 kopiert, in welchem der Wert für red0 gespeichert ist.

Sehr viel besser hätte ich das jetzt von Hand auch nicht hinbekommen ( zwei Befehle kann man einsparen, wer findet sie ? )

MfG Kjion