Вчера у нас был связанный вопрос на этом сайте :
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 - это два регистра, преобразованные вдесятичное отдельно!