Я искал какой-то код сборки и натолкнулся на следующее (которое я конвертировал для удобства чтения). Все регистры имеют 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
Я хотел бы помочь узнать, что процессор это должно быть для, но это выглядит как инструкции SRL/RR выполнять 16-разрядную сдвиг вправо на (то есть. Делим на 2), в то время как ADD/ADC выполняют 16-битное добавление. Таким образом, он вычисляет Q = Q/2 + Q, где Q - 16-разрядное значение большого конца, хранящееся в '(q)' и '(q + 1)'. –
Извините, что не включая это, но его процессор gameboy, я думаю, что сборка Z80, поэтому srl, rr и т. Д. Работают только на 8 бит – Jason
В комбинации SRL и RR работают вместе для выполнения 16-битного сдвига. Аналогично ADD и ADC работают вместе для выполнения 16-битного добавления. –