2015-09-01 3 views
3

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

(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 как маленький конечный или большой endian, его значение умножается на 1,5 в его соответствующем endian).

Я смущен о том, как они собираются умножить 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

Я хотел бы помочь узнать, что процессор это должно быть для, но это выглядит как инструкции SRL/RR выполнять 16-разрядную сдвиг вправо на (то есть. Делим на 2), в то время как ADD/ADC выполняют 16-битное добавление. Таким образом, он вычисляет Q = Q/2 + Q, где Q - 16-разрядное значение большого конца, хранящееся в '(q)' и '(q + 1)'. –

+0

Извините, что не включая это, но его процессор gameboy, я думаю, что сборка Z80, поэтому srl, rr и т. Д. Работают только на 8 бит – Jason

+0

В комбинации SRL и RR работают вместе для выполнения 16-битного сдвига. Аналогично ADD и ADC работают вместе для выполнения 16-битного добавления. –

ответ

1

Я не торопиться, чтобы прочитать весь код сборки в деталях, но я сильно подозреваю, @Ross Ридж прав.

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

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