Умножение MIPS - PullRequest
       4

Умножение MIPS

2 голосов
/ 11 июня 2011

Я должен решить умножение MIPS вручную, и у меня возникли проблемы.

У меня есть два регистра, $8, который содержит представление дополнения до двух -1073741824 (что 2 ^ 30) и $9 с добавлением двух к +3, мне нужно найти результат этой инструкции MIPS

mult $8, $9

Я довольно растерян.Нужно ли сначала преобразовывать значения в два дополнения, а затем использовать двоичное умножение?

Ответы [ 3 ]

8 голосов
/ 12 июня 2011

Инструкция Mult - это знаковое умножение двух 32-битных регистров.Он хранит результаты в специальном (Hi, Lo) регистре, который вместе дает вам 64-битный результат.Резонанс этого заключается в том, что при умножении двух 32-битных значений результат может быть слишком большим, чтобы поместиться в один 32-битный регистр.

Если цель упражнения состоит в том, чтобы вручную обработать 1 и 0 иумножение себя, то да, вы можете сделать это.Однако, скорее всего, вы будете где-то путаться с таким количеством цифр.

Давайте посмотрим, сможем ли мы использовать небольшой вывод, чтобы сначала понять, как должен выглядеть результат: в дополнении к двум наиболее значимой цифрой является знак:

  • 0означает +
  • 1 означает -

Глядя на операцию, вы сразу знаете, что старший бит вашего результата будет равен 1. Это означает, что старший бит регистра Hi будетбыть 1.

Это сказанное теперь позволяет нам взглянуть на значения, которые мы умножаем (я опускаю знак, пока мы вернемся к этому):

2 30 x 3 = 2 30 x (2 1 + 2 0 )

     = 2^31 + 2^30

Теперь мы превратили наше умножение в сложениечто гораздо проще сделать.В этом случае двоичное представление этого значения равно 1 в битах 32 и 31 или:

1100 0000 0000 0000 0000 0000 0000 0000

теперь нам нужно взять это значение и превратить его обратно в представление отрицательного числано теперь в 64-битном регистре: 64-битное положительное значение выглядит следующим образом:

0000 0000 0000 0000 0000 0000 0000 0000 1100 0000 0000 0000 0000 0000 0000 0000

Два дополнения работают, вычитая положительное число из максимального положительного числа с тем же числомбиты (все 1 с), а затем добавляем единицу к результату:

пример в меньшем масштабе:

        3 = 0011
       -3 = 1111 - 0011 + 0001 
making -3 = 1101

Теперь давайте применим это к нашему 64-битному значению, сначала давайте вычеркнем положительный результатиз макс. 64-битного значения int:

 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111
-0000 0000 0000 0000 0000 0000 0000 0000 1100 0000 0000 0000 0000 0000 0000 0000
=1111 1111 1111 1111 1111 1111 1111 1111 0011 1111 1111 1111 1111 1111 1111 1111

при добавлении единицы к этому значению получается:

1111 1111 1111 1111 1111 1111 1111 1111 0100 0000 0000 0000 0000 0000 0000 0000

, поэтому регистры после операции будут:

Hi = 1111 1111 1111 1111 1111 1111 1111 1111 
Lo = 0100 0000 0000 0000 0000 0000 0000 0000
1 голос
/ 12 июня 2011

Если числа, которые вы хотите умножить, подписаны, то вы используете:

mult $8, $9

Если они без знака, просто используйте инструкцию умножения без знака:

multu $8, $9

Результатом умножения будет 64-битное целое число, вы можете получить доступ к этому результату с помощью инструкций mflo и mfhi, например:

MFLO $8
MFHI $9
0 голосов
/ 30 июня 2012

Более общая информация по этому вопросу:

Модуль умножения и деления выдает результат в двух дополнительных регистрах, hi и lo.Эти инструкции перемещают значения в и из этих регистров.Псевдоинструкции умножения, деления и остатка, которые заставляют данное устройство работать с общими регистрами, перемещают результат после завершения вычислений.

A-56:

multrs, rt

Умножить регистры rs и rt.Оставьте младшее слово продукта в регистре lo и старшее слово в регистре hi.

Источник: Организация и дизайн компьютеров: Аппаратно-программный интерфейс (Д. Паттерсон, Дж.Hennessy)

См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...