Пишу третий в жизни проект, на AVR, на asm. До того было 2 успешных - на asm и на C. Писать надо именно на asm - по разным причинам. Я понимаю что можно написать на С и посмотреть что там сделает компилятор с оптимизатором, но пока хочется поковыряться самому

Общую логику и алгоритм работы уже составил, осталось красиво реализовать это на asm - оптимально не по размеру кода а по скорости при любых ветках ветвлений - то есть, если кусок кода будет делаться 50 тактов в 99 случаях и 1000 тактов в 1, то пусть лучше он каждый раз делается гарантированно по 500 тактов

Возникают в изобилии коротенькие логически законченные куски для перевода в asm. Например
Код
signed long int S = 0;
float s = 0, ds = 0;
signed char P = 0;
......
s = s + ds;
if (s < 0) {
s = 1 - s;
S = S - 1;
P = P - 1;
if (P < 0) {P = 3}
}
elseif (s >= 1) {
s = s - 1;
S = S + 1;
P = P + 1;
if (P > 3) {P = 0}
}
В asm s и ds будут в формате с плавающей запятой. Думаю что буду использовать sbrc/sbrs их старшего бита - знака мантиссы. Позже напишу код который придумаю - покритикуете помидорами. А вот насчет
Код
P = P - 1;
if (P < 0) {P = 3}
..........
P = P + 1;
if (P > 3) {P = 0}
}
придумал - я просто делаю inc/dec rP а потом мне надо найти красивую команду чтобы просто занулить его старшие 6 разрядов - пока точно не знаю какую - and или lsl rP, 6 + lsr rP, 6
Или еще пример
Код
float s, ds;
unsigned char m;
......
if (ds < 1/128) m = 128
elseif (ds < 1/64) m = 64
elseif (ds < 1/32) m = 32
elseif (ds < 1/16) m = 16
elseif (ds < 1/8) m = 8
elseif (ds < 1/4) m = 4
elseif (ds < 1/2) m = 2
else m = 1
Написано коряво, только суть. Теперь буду думать как это красиво на asm написать...
Если есть что сказать - почитаю

За возможные синтаксические ошибки не пинайте - думаю, смысл понятен и так.
Сообщение отредактировал _Ivana - Jan 28 2012, 15:54