下面是winAVR中的(函数库)32位乘法子程序,专支持那些没有乘法指令的AVR器件 (如attiny84)。R25~R22以及R21~R18存放入口参数,返回值放在R25~R22
我对此子程序的正确性表示极度怀疑。请见用“[!!!!]”标示的那行。 00000f56 <__mulsi3>: f56: ff 27 eor r31, r31 f58: ee 27 eor r30, r30 f5a: bb 27 eor r27, r27 f5c: aa 27 eor r26, r26
00000f5e <__mulsi3_loop>: f5e: 60 ff sbrs r22, 0 f60: 04 c0 rjmp .+8 ; 0xf6a <__mulsi3_skip1> f62: a2 0f add r26, r18 f64: b3 1f adc r27, r19 f66: e4 1f adc r30, r20 f68: f5 1f adc r31, r21
00000f6a <__mulsi3_skip1>: f6a: 22 0f add r18, r18 f6c: 33 1f adc r19, r19 f6e: 44 1f adc r20, r20 f70: 55 1f adc r21, r21 f72: 96 95 lsr r25 f74: 87 95 ror r24 f76: 77 95 ror r23 f78: 67 95 ror r22 f7a: 89 f7 brne .-30 ; 0xf5e <__mulsi3_loop> [!!!!] f7c: 00 97 sbiw r24, 0x00 ; 0 f7e: 76 07 cpc r23, r22 f80: 71 f7 brne .-36 ; 0xf5e <__mulsi3_loop>
00000f82 <__mulsi3_exit>: f82: 9f 2f mov r25, r31 f84: 8e 2f mov r24, r30 f86: 7b 2f mov r23, r27 f88: 6a 2f mov r22, r26 f8a: 08 95 ret |