Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Код: Выделить всё
ldi r20, 8
ldi r17, 0b01111111
ldi r19, 0b10000000
shift:
ld r16, X
mov r18, r16
and r16, r17
and r18, r19
lsl r18
or r16, r18
st X+, r16
clc
ror r17
ror r19
dec r20
brne shift
Код: Выделить всё
ldi r17, 0b11111111
shift:
ld r16, X
mov r18, r16
and r18, r17
add r16, r18
st X+, r16
lsl r17
brne shiftКод: Выделить всё
ldi temp1,$FD
ld temp,X+
lsl temp
куда то temp (результат)
cikl:
ld temp,X+
lsl temp ;был пропущен
RCALL sdvig_vstavka
кудо то там temp(результат)
sec
rol temp1
cpi temp1,7F
brne cikl
sdvig_vstavka:
bst temp,1
bld temp,0
cpi temp1,$FD
breq vstavka
bst temp,2
bld temp,1
cpi temp1,$FB
breq vstavka
bst temp,3
bld temp,2
cpi temp1,$F7
breq vstavka
bst temp,4
bld temp,3
cpi temp1,$EF
breq vstavka
bst temp,5
bld temp,4
cpi temp1,$DF
breq vstavka
bst temp,6
bld temp,5
vstavka:
and temp,temp1
retКод: Выделить всё
ldi mask1, 0b00111111; загружаем маску несдвигаемой части байта
ldi mask2, 0b10000000; и сдвигаемой
ldi counter, 7; и счётчик
loop:; цикл
load data; подгружаем байт
mov tmp, data; копируем его
lsl tmp; сдвигаем влево копию
and data, mask1; маскируем байты
and tmp, mask2; соотв. масками
or data, tmp; и складываем (можно применить add)
save data; сохраняем байт
lsr mask1; модифицируем одну маску нулями,
sec; другую -
ror mask2; единицами
dec counter; дёргаем счётчик
brne loop; проверяем условие выхода из цикла
Код: Выделить всё
clr mask;
loop:;
...
com mask;
lsr mask;
lsr mask;
and data, mask;
com mask;
lsl mask;
and tmp, mask;
...
brne loop;
Екстественно - тема-то "Ассемблер AVR"Kavka писал(а):Речь об AVR, судя по "симптомам".![]()
Да-да, и еще два регистра под константу 0х001. В прерывании. И еще пара команд, чтобы занести эту константу в регистры. По сравнению сKavka писал(а): Смотрите SUB, SUBI, SBIW
Нет, я же воспользовался частным случаем: 2400 = 24 * 100, свою задачу я решил. А вот что делать, допустим, с 2399 или 2411, которые суть простые числа, то есть не делятся ни на что, кроме себя самого и единицы? Так сказать, на будущее...Kavka писал(а):А в сторону TST не смотрели перед вычитанием?
afz писал(а):Вот и интересуюсь: нет ли проверенных решений?Спойлер
...Код: Выделить всё
DEC r16 brvc L1 ldi r16,Con1 dec r17 brvc L1 ldi r17,Con2 L1:or R16,R17 breq SecOK
afz писал(а):А вот что делать, допустим, с 2399 или 2411
Код: Выделить всё
LDI XH,HIGH(2399) ; с таким же успехом загружается любое другое число в пределах 1...65535
LDI XL,LOW(2399) ; R25:R24, YL:YH, ZL:ZH
;
;
;
SBIW XH:XL,1
BRNE OUT
; установить признак окончания 1 секунды
OUT:
RETIКод: Выделить всё
DEC R0
BRPL PC+1 ; если результат положительный - пропускаем следующую команду. Результат будет неположительный при попытке декремента нуля.
DEC R1
Код: Выделить всё
tst r0
brne L1
dec r1
L1:
dec r0
Код: Выделить всё
TST R0
BRNE PC+1
DEC R1
DEC R0TST – Test for Zero or Minus
Tests if a register is zero or negative. Performs a logical AND between a register and itself.