Каковы две половины полного 32x32 => 64-битного результата умножения? - PullRequest
0 голосов
/ 02 апреля 2019

Я новичок в сборке и MIPS.У меня есть алгоритм, который умножает два 32-разрядных числа, в результате чего получается 64-разрядное число.Я разделил результаты на два разных регистра, так как он слишком велик для MIPS.

Можете ли вы помочь мне объяснить два разных числа, хранящихся в верхнем и нижнем регистрах?

Results

1 Ответ

1 голос
/ 02 апреля 2019

Вчера у нас был связанный вопрос на этом сайте :

64-битное число будет сохранено в двух регистрах, потому что регистр имеет только 32 бита.

Математическое обоснование

Вы можете представить себе компьютер, который вычисляет не в двоичном, а в десятичном формате (или в BCD - как это делали некоторые компьютеры в 1960-х годах) и в котором регистр может хранить 3 десятичных знака.

В этом случае число 123456 (десятичное) будет сохранено как 123 (в одном регистре) и 456 (в другом регистре).

К сожалению, разные базы ведут себя по-разному:

Decimal  Hexadecimal
099      063
355      163
160      0A0
260      104

Вы можете видеть, что между числами 99 и 355 (десятичными) в шестнадцатеричной системе существует только одно различие в цифрах, но в десятичной системе все три цифры различны.

Для чисел 160и 260 (десятичное), это совсем наоборот.

Это означает: если мы хотим преобразовать число 123456 в приведенном выше примере в шестнадцатеричное, мы не можем преобразовать числа 123 aсначала с 456 до шестнадцатеричного числа, но перед преобразованием мы должны взять число 123456 как полное число:

Decimal    Hexadecimal
   123        7B
   456       1C8
123456     1E240 (does neither contain 7-B nor 1-C-8)

Исключениями из этого правила являются, например, «двоичные <-> восьмеричные», если регистры являютсякратный 3 битам или «двоичный <-> шестнадцатеричный», если регистры кратны 4 битам, или «восьмеричный <-> шестнадцатеричный», если регистры кратны 12 битам (или 4 восьмеричным или 3 шестнадцатеричным цифрам) ширины:

Octal      Hexadecimal
1234       29C
5670       BB8
12345670   29CBB8

Вот почему шестнадцатеричный код так популярен среди программистов низкого уровня!

Теперь вернемся к вашей программе

Значения, хранящиеся вРегистры MIPS являются двоичными, а не десятичными.Вы заинтересованы в распечатке целого 64-разрядного числа в виде десятичного числа.

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

  • Компьютер хранит слишком большое значение для одного регистра в двух регистрах
  • Мы хотим видеть результат в другой базе в качестве базы, с которой работает компьютер
  • Первое преобразованиеоба регистра по отдельности не приведут нас ни к чему (см. пример с 123456 -> 1E240), но мы должны взять целое число и преобразовать его

Однако числа 266201827 и 768509613 - это два регистра, преобразованные вдесятичное отдельно!

...