这是原始的C代码:
uint16_t calc1(uint16_t ADC_VAL)
{
uint32_t sum1 = ADC_VAL * ADC_VAL;
return (uint16_t)(sum1 / diff);
}
uint16_t calc2(uint16_t ADC_VAL)
{
uint32_t sum1 = ((uint32_t)ADC_VAL) * ADC_VAL;
return (uint16_t)(sum1 / diff);
}
这是生成的汇编:
;------------------------------------------------------------
;Allocation info for local variables in function 'calc1'
;------------------------------------------------------------
;ADC_VAL Allocated to registers r6 r7
;sum1 Allocated to registers
;------------------------------------------------------------
; .\src\main.c:27: uint16_t calc1(uint16_t ADC_VAL)
; -----------------------------------------
; function calc1
; -----------------------------------------
_calc1:
; .\src\main.c:29: uint32_t sum1 = ADC_VAL * ADC_VAL;
mov r6,dpl
mov r7,dph
mov __mulint_PARM_2,r6
mov (__mulint_PARM_2 + 1),r7
lcall __mulint
; .\src\main.c:30: return (uint16_t)(sum1 / diff);
mov r4,_diff
mov r5,(_diff + 1)
mov __divsint_PARM_2,r4
mov (__divsint_PARM_2 + 1),r5
; .\src\main.c:31: }
ljmp __divsint
;------------------------------------------------------------
;Allocation info for local variables in function 'calc2'
;------------------------------------------------------------
;ADC_VAL Allocated to registers r6 r7
;sum1 Allocated to registers r4 r5 r6 r7
;------------------------------------------------------------
; .\src\main.c:33: uint16_t calc2(uint16_t ADC_VAL)
; -----------------------------------------
; function calc2
; -----------------------------------------
_calc2:
mov r6, dpl
mov r7, dph
; .\src\main.c:35: uint32_t sum1 = ((uint32_t)ADC_VAL) * ADC_VAL;
mov r5,#0x00
mov r4,#0x00
mov __mullong_PARM_2,r6
mov (__mullong_PARM_2 + 1),r7
mov (__mullong_PARM_2 + 2),r5
mov (__mullong_PARM_2 + 3),r4
; .\src\main.c:36: return (uint16_t)(sum1 / diff);
mov dpl, r6
mov dph, r7
mov b, r5
mov a, r4
lcall __mullong
mov __divulong_PARM_2,_diff
mov (__divulong_PARM_2 + 1),(_diff + 1)
mov (__divulong_PARM_2 + 2),#0x00
mov (__divulong_PARM_2 + 3),#0x00
肉眼可见的差异巨大。虽然我用的sdcc可能和keil有区别,但不会太离谱