
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
Lesezeichen