Используя Arduino, я должен написать функцию в сборке Atmel AVR для моего класса компьютерных наук, которая вычисляет 8-битное среднее из двух 8-битных значений в сборке. Мне также не разрешено использовать какие-либо инструкции по ветвлению (но пропуски прекрасны).Как вычислить 8-битное среднее из двух 8-битных значений в сборке?
Это то, что я до сих пор:
.global average
average:
add r24, r22
asr r24
ret
Для части моей программы, где я должен вычислить среднее значение 69 и 60, она возвращает -64 вместо 64. Кто-нибудь знает, как я будет ли эта функция работать? Любая помощь приветствуется.
Уловка для усреднения, избегая целых переполнений/обертывания: http://stackoverflow.com/a/3816471/224132. Который я нашел менее чем за минуту, ища «целое среднее без переполнения», так как я знал, что это был трюк, но не мог его запомнить. Вероятно, это работает для подписного дополнения 2, а также без знака, но я не проверял. Положите 'signed' в условия поиска google, если хотите. –
Обратите внимание, что ответ, который я связывал, работает только для неподписанных, если вы знаете, в каком порядке они находятся. Самый высокий голос не нужен, но требует гораздо больше операций, чем ADD и ROR. В любом случае, это просто показывает, что при поиске целых трюков не ограничивайте себя AVR asm. Вы найдете много вещей в C, которые вы можете реализовать в AVR самостоятельно или даже подать в компилятор и посмотреть, как он это делает. например некоторые из них полезны: https://graphics.stanford.edu/~seander/bithacks.html –