AV> Возникла сабжевая задача силами ассемблеpа для AVR.
Число не десятичное, а двоично десятичное.
AV> Что-то меня глючит - никак не могу осуществить. AV> Числа - от 0 до 99, т.е 1 байт. AV> Т.е 29h -> 58h
Сложение и вычитание выполняется точно также, как и для двоичных чисел. Однако, после каждой арифметической операции требуется коррекция полупереноса заключающаяся в следующем:
Для сложения:
для каждой половины (nibble) 8-разрядного числа, для старшей и для младшей, но сначала для младшей, выполняется следующее правило: если число (nibble) больше 9-и или был перенос из 3-го в старший разряд, то к числу добавляется 6 (с переносом в старший nibble).
Для вычитания:
аналогично, сначала для младшей, потом для старшей половины: если был заём в 3-й разряд, то из числа вычитается 6.
Часто процессор может иметь команду двоично-десятичной коррекции, выполняющую указанный алгоритм. Имеет ли AVR такую команду -- не помню. При отсутствии такой команды крайне желательно иметь два флага переноса -- флаг переноса/заёма из 7-го разряда (обычно обозначается как Carry) и флаг переноса/заёма из 3-го разряда (Half carry). В таком случае указанный выше алгоритм может быть легко записан на языке C (для сложения):
uint8_t a, b;
a = a + b; if (halfcarry || (a&0x0f) > 9) a = a + 6; if (carry || (a>>4) > 9) a = a + 0x60;
Понятно, что при записи на языке ассемблера существуют возможности для оптимизации кода...
AV> И еще: есть пpогpамма на асме, pазpаботана и отлажена на AVRStudio AV> (ATTiny2313), но по условию часть пpогpаммы должна быть написана на си. AV> Как AV> (наименьшими усилиями) пpикpутить сюда еще и сишный кусок кода?
К avrasm? Hикак. Hадо ассемблерный код прикручивать к компилятору. Если точней, то к компоновщику, который сможет собрать вместе с-шный и ассемблерный код. Hапример, к gcc (winavr имеется ввиду --
formatting link