Умножение двух байтов, представляющих короткий на 1,5

Я искал какой-то ассемблерный код и наткнулся на следующее (которое я преобразовал для удобства читателя). Все регистры 8 бит, а указатели 16 бит. Так (q) загружает 8 бит.

(q+1) = (q+1) = rr(q+1) где (q) разыменовывает q а также rr(q) повернуть вправо(q) = (q) + (q)/2 + bit((q+1), 0) где bit((q+1), 0) получает 0-й бит (q+1)

Это действительно смутило меня, потому что то, что делает приведенный выше код, умножает 16-битное значение на 1,5, независимо от его порядкового номера (то есть, как бы вы ни интерпретировали q, будет ли он младшим или старшим, его значение умножается на 1,5 в соответствующем порядке байтов).

Я запутался в том, как они собираются умножить 16-битное значение на 1,5, используя два 8-битных значения. Что тут происходит? В частности, какова цель добавления 0-го бита (q+1) to (q) и цель вращения (q+1) направо?

Вот код сборки:

ld a, (q)
ld b, a
ld a, (q+1)
ld c, a
srl b
rr c
add c
ld (q+1), a
ld a, (q)
adc b
ld (q), a
ret

1 ответ

Решение

Я не потратил время на подробное чтение всего кода сборки, но я сильно подозреваю, что @Ross Ridge прав.

Этот трюк называется методом Хорнера. Это особенно распространено в небольших встроенных микроконтроллерах без множителей, но может использоваться для общей оптимизации скорости. Увидеть

http://www.ti.com/lit/an/slaa329/slaa329.pdf

Другие вопросы по тегам