Dann lerne C. Problem an deiner Vorgehenseweise ist kein prinzipielles.
Nur je nach Optimierungsfähigkeiten des Kompilers dauert das mehrere
Takte. Dadurch, dass die beiden Register direkt hintereinander im
Speicher liegen kann man die auch gleich direkt als 32 Bit Wert
betrachten. Ob das nun INT32 oder UINT32 ist, hängt ja von den
Ausgangsdaten und dem verwendeten Modus ab (signed/unsigned).
Der Befehl erstellt einen Pointer auf eine 32-Bit Variable und
dereferenziert diesen im gleichen Schritt wieder. Also steht in Result
gleich der 32-Bit Wert. Übrig bleiben 3 Assembler-Befehle:
1 | 6d76: 1f 42 3c 01 mov &0x013c,r15 ;0x013c
|
2 | 6d7a: b2 4f 8e 12 mov @r15+, &0x128e ;
|
3 | 6d7e: b2 4f 90 12 mov @r15+, &0x1290 ;
|
Im Gegensatz zu deinem Rotieren:
1 | 6d76: 1f 42 3c 01 mov &0x013c,r15 ;0x013c
|
2 | 6d7a: 0e 4f mov r15, r14 ;
|
3 | 6d7c: 0f 43 clr r15 ;
|
4 | 6d7e: 82 4e 8e 12 mov r14, &0x128e ;
|
5 | 6d82: 82 4f 90 12 mov r15, &0x1290 ;
|
6 | 6d86: 1e 42 8e 12 mov &0x128e,r14 ;0x128e
|
7 | 6d8a: 1f 42 90 12 mov &0x1290,r15 ;0x1290
|
8 | 6d8e: 0d 4e mov r14, r13 ;
|
9 | 6d90: 0c 43 clr r12 ;
|
10 | 6d92: 82 4c 8e 12 mov r12, &0x128e ;
|
11 | 6d96: 82 4d 90 12 mov r13, &0x1290 ;
|
12 | 6d9a: 1c 42 3a 01 mov &0x013a,r12 ;0x013a
|
13 | 6d9e: 0d 43 clr r13 ;
|
14 | 6da0: 1e 42 8e 12 mov &0x128e,r14 ;0x128e
|
15 | 6da4: 1f 42 90 12 mov &0x1290,r15 ;0x1290
|
16 | 6da8: 0e dc bis r12, r14 ;
|
17 | 6daa: 0f dd bis r13, r15 ;
|
18 | 6dac: 82 4e 8e 12 mov r14, &0x128e ;
|
19 | 6db0: 82 4f 90 12 mov r15, &0x1290 ;
|
Optimierung jeweils -O2 beim MSPGCC.