orinoko писал(а):Но, как говорят, нет предела совершенству.
Так все ж четыре unsigned long лезут в регистры.
Четыре переменных по 4 байта, 16 регистров. Зачем lds/sts в цикле?
Как-то так можно
Код: Выделить всё
; Распределить по вкусу регистры
; temp0,temp1,temp2,temp3
; sqr0,sqr1,sqr2,sqr3
; mask0,mask1,mask2,mask3
; ul0,ul1,ul2,ul3 -- это аргумент функции
lds ul0, InputNum
lds ul1, InputNum+1
lds ul2, InputNum+2
lds ul3, InputNum+3
clr sqr0
clr sqr1
movw sqr2, sqr0
movw mask0, sqr0
clr mask2
ldi mask3, 0x40
loop:
movw temp0, sqr0
movw temp2, sqr2
or temp0, mask0
or temp1, mask1
or temp2, mask2
or temp3, mask3
lsr sqr3
rol sqr2
rol sqr1
rol sqr0
cp ul0, temp0
cpc ul1, temp1
cpc ul2, temp2
cpc ul3, temp3
brcs skip
or sqr0, mask0
or sqr1, mask1
or sqr2, mask2
or sqr3, mask3
sub ul0, temp0
sbc ul1, temp1
sbc ul2, temp2
sbc ul3, temp3
skip:
lsr mask3
rol mask2
rol mask1
rol mask0
lsr mask3
rol mask2
rol mask1
rol mask0
; while( mask >>= 2 )
mov temp0, mask0
or temp0, mask1
or temp0, mask2
or temp0, mask3
brne loop
; если mask0..mask3 разместить в r24,r25,r26,r27,
; то последние команды можно заменить на
; while( mask >>= 2 )
sbiw mask0, 0
brne loop
sbiw mask2, 0
brne loop
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.