2013-11-01 3 views
2

Мне нужно умножить два 32-разрядных SIGNED числа с помощью сложения и сдвига и получить 64-разрядное число, сохраненное в ячейках памяти $0408-$040F. Эти два номера хранятся в 8-битных памяти.Умножение двух 32-разрядных СИГНАЛЬНЫХ номеров с добавлением и сдвигом

movb #$1F, $0400 ; the first number is $1F230001 
movb #$23, $0401 
movb #$00, $0402 
movb #$01, $0403 
movb #$F8, $0404 ; the second number is $F8
movb #$01, $0405 
movb #$23, $0406 
movb #$46, $0407 

Я знаю, как перемножить два числа 8-бит с добавлением и изменением, но я не знаю, как идти дальше с остальными. Я использовал 16-разрядный Accumulator-D (аккумулятор-A 8бит MSB, аккумулятор-B 8 бит LSB).

Я использую CPU12: Reference Manual

Можете ли вы помочь мне, пожалуйста, руководство меня или показать мне, как это сделать, пожалуйста? Спасибо, я потратил много времени на это, но я не знаю, как это сделать с 32-разрядными номерами. Номера

+1

Это тот же алгоритм, только с большим количеством бит. –

+0

Да, но как это сделать, когда у меня есть 4 8-битных ячейки памяти, я могу пройти 8 бит (смещение, добавление), но как двигаться, чтобы продолжить следующие 8 бит? – forgatn

+1

О, этот CPU имеет 16-разрядный аккумулятор, поэтому вам никогда не нужно было научиться выполнять 16-разрядную арифметику, используя только 8-битные операции. (Следовательно, у вас нет опыта для обобщения.) Используйте инструкции ADC. [Этот вопрос] (http://stackoverflow.com/questions/10879819/add-numbers-in-avr-assembly/10894701#10894701) показывает, как. –

ответ

2

переписать как 8bit цифр (база = 256) и решить умножение алгебраически:

(a0+(a1<<8)+(a2<<16)+(a3<<24)) 
*(b0+(b1<<8)+(b2<<16)+(b3<<24)) 
------------------------------------ 
=(a0·b0      )<< 0 
+(a0·b1 + a1·b0    )<< 8 
+(a0·b2 + a1·b1 + a2·b0  )<<16 
+(a0·b3 + a1·b2 + a2·b1 + a3·b0)<<24 
+(  a1·b3 + a2·b2 + a3·b1)<<32 
+(    a2·b3 + a3·b2)<<40 
+(      a3·b3)<<48 

В настоящее время существует только 8-bit * 8-bit умножения и 8/16 бит сдвига/добавить. Не забывайте вести более высокие цифры (например, add,adc,adc,...).

Надеюсь, что я не сделал ошибку

PS.

Если у вас есть 16 бит умножить, можно переписать весь процесс с базой 65536, а также использовать алгоритм Карацубы для умножения на некоторую скорость, но будьте осторожны с переносом, в таком случае ему нужно больше бит.

Кроме того, я хотел бы сделать это на не подписанные номера и добавить оценку знака позже

Вот какое-то связанное с КвА шахты:

Смежные вопросы