Gast
#2317960
uint8_t b = 123;
uint8_t a = 123;
uint16_t result = 0;
int main(void) {
result = a * b;
return result;
}
----- -Os / -O2 -----------
lds r24,b ; b, b
lds r18,a ; a, a
mul r24,r18 ; b, a
movw r24,r0 ; D.1915
clr r1
sts (result)+1,r25 ; result, D.1915
sts result,r24 ; result, D.1915
/* epilogue: frame size=0 */
ret
----------------
in dem Fall ist es zufällig(?) wie gewünscht. 15129 kommt raus. (Wenn
auch miserabel optimiert trotz -Os / -O2).
Gibt es eine Garantie daß das High-Byte nicht verloren geht. Eigentlich
sollte man ja erwarten daß "a * b" wieder ein uint8_t ist...
Denn bei 16bit x 16bit -> 32bit :
uint16_t b = 1234;
uint16_t a = 1234;
uint32_t result = 0;
int main(void) {
result = a * b;
return result;
}
----- -Os -----------
lds r18,b ; b, b
lds r19,(b)+1 ; b, b
lds r24,a ; a, a
lds r25,(a)+1 ; a, a
movw r20,r24 ; , a
mul r18,r20 ; b,
movw r24,r0 ; tmp43
mul r18,r21 ; b,
add r25,r0 ; tmp43
mul r19,r20 ; b,
add r25,r0 ; tmp43
clr r1
ldi r26,lo8(0) ; D.1914,
ldi r27,hi8(0) ; D.1914,
sts result,r24 ; result, D.1914
sts (result)+1,r25 ; result, D.1914
sts (result)+2,r26 ; result, D.1914
sts (result)+3,r27 ; result, D.1914
/* epilogue: frame size=0 */
ret
----------------
... kommt 15428 raus. er schneidet auf 16bit ab !?
wiewaswarum kann man das erklären und kontrollieren?
Grüße