Точно так же, как в АВР - теми же командами загрузки, пропуска, декремента и условного перехода. А вот попробуй на АВР сделать такое, а потом я тебе скажу, за сколько команд это делает dsPIC - Умножить 16-битную ячейку RAM [X] на 16-битную ячейку RAM [Y]
- Сложить (или вычесть) с 40-битным накопителем
- Если накопитель переполнился, заменить переполнение знаковым насыщением и выставить флаг насыщения
- Сохранить округленный результат накопления в ячейке RAM [Z]
- Уменьшить указатель X на 6
- Зеркально поменять местами биты 3..11 указателя X
- Увеличить указатель Y на 4, следя, чтобы он не вылез за отведенные пределы
- Увеличить указатель Z на 2
Если слишком заморочно, тогда хотя бы вот - найти, какой бит в 16-разрядном числе отличается от всех одинаковых справа от него (например, для 0000 0001 1111 1111 это бит 9). Или округлить 32-битное число с фиксированной запятой. Ну или уж на крайняк сдвинуть 32-битное знаковое число на 13 бит вправо с сохранением знака. Или если уж совсем грустно - вычесть одно 32-битное знаковое число из другого. Отсчет пошел :))