ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
18 мая
134718 Топик полностью
leon_ (11.10.2008 16:50, просмотров: 318) ответил MBedder на На, лентяй
если int по умолчанию знаковый, тогда так: 

;*  int x = x * 0.8;
;*  int x = (x * (long)0xCCCD) >> 16
; //    0xCCCD приблизительно = 0.8 * (1 << 16)

;*  "int x" находится в r19:r18
;*  "unsigned 0xCCCD" находится r21:r20

    ldi     r20,    low(0xCCCD)
    ldi     r21,    high(0xCCCD)
    clr     r2
    movw    r22,    r18

    mulsu   r23,    r21             ; (signed) * (UNsigned)
    movw    r18,    r0

    mul     r22,    r20             ; (UNsigned) * (UNsigned)
    mov     r17,    r1

    mulsu   r23,    r20             ; (signed) * (UNsigned)
    sbc     r19,    r2
    add     r17,    r0
    adc     r18,    r1
    adc     r19,    r2

    mul     r22,    r21             ; (UNsigned) * (UNsigned)
    add     r17,    r0
    adc     r18,    r1
    adc     r19,    r2