Умножение двух байтов, представляющих короткий на 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 прав.
Этот трюк называется методом Хорнера. Это особенно распространено в небольших встроенных микроконтроллерах без множителей, но может использоваться для общей оптимизации скорости. Увидеть