Как сохранить число по основанию 2 в регистре?

но мой инструктор не отвечает. У меня есть следующий дополнительный вопрос для программы MIPS:

Extra credit covers binary to ASCII data type conversion. It is useful 
to convert the 2’s complement integer into an ASCII string so that it
can be displayed on the monitor. Derive a binary-to-ASCII conversion
routine, BinarytoASCII, for converting a 2’s complement integer stored 
in a0 register into an ASCII string stored in v0 register. The value 
initially in a0 is restricted to be within the range -999 to +999. After   
the algorithm completes execution, v0 contains the sign of the value 
initially stored in a0. The following three bytes contain the three 
ASCII codes corresponding to the three decimal digits representing its
magnitude. This algorithm always produces a string of four characters 
independent of the sign and magnitude of the integer being converted.

Может быть, я неправильно читаю эту проблему, но разве невозможно хранить двоичное значение непосредственно в регистре в MIPS? Кажется, что это запрашивает преобразование десятичного числа в ASCII. Если я ошибаюсь, можете ли вы показать, как поместить число с основанием 2 в регистр в MIPS? благодарю вас


person user199827463    schedule 22.12.2018    source источник
comment
Вы слишком много думаете об этом - как вы думаете, что хранится в регистре, начиная с :) (все, что знает компьютер, это 0 или 1). Таким образом, профессор в основном хочет, чтобы вы взяли содержимое регистра и преобразовали его в серию ASCII. '0' и '1' (например, and и shift и добавьте, например, or к '0'...), затем переверните строку, чтобы восстановить исходный порядок)   -  person David C. Rankin    schedule 22.12.2018
comment
Посмотрите на asciitable.com. 0x30 это '0', а 0x31 это '1'.   -  person David C. Rankin    schedule 22.12.2018
comment
@ Дэвид, он хочет, чтобы оно было преобразовано в десятичное, а не в двоичное. (Но десятичная дробь не упоминается до предпоследнего предложения.)   -  person prl    schedule 22.12.2018
comment
Ах, хороший улов, поэтому добавьте ручное преобразование base2 в base10 вместо простого shift and add.   -  person David C. Rankin    schedule 22.12.2018
comment
Значения в регистрах уже закодированы в битах (регистр MIPS физически 32 бита (0 или 1) и ничего больше). Когда отладчик показывает, что a0 содержит 1234, он берет исходный 32-битный шаблон и интерпретирует его как целое число (т. е. выполняет преобразование в строку) и отображает это на экране, но регистр по-прежнему представляет собой просто битовый шаблон... ( то есть, если это 1234 было шестнадцатеричным, то регистр содержит 16 нулевых битов сверху, а затем 0001_0010_0011_0100 ... если десятичное, мне лень конвертировать base10 1234 в base2 ... что угодно, надеюсь, теперь вы поняли идею).   -  person Ped7g    schedule 22.12.2018
comment
т.е. вы можете начать с li $a0,999 (это загрузка кодированного значения 999 с основанием 2 в a0, преобразование из десятичного числа 999 в битовый шаблон с основанием 2 выполняется ассемблером в процессе сборки), затем ваша магия, затем v0 в конце должно содержать значение 0x20393939 (т.е. четыре char string " 999" (0x20 - это пробел в ASCII)) (если я правильно понимаю определение задачи, по моим меркам оно недостаточно точное, поэтому я частично догадываюсь, что именно ожидается)   -  person Ped7g    schedule 22.12.2018


Ответы (1)


Числа в регистрах представлены в двоичном формате. Вот почему 32-битный регистр может хранить значения со знаком из -2^31 .. 2^31-1, используя кодировку с дополнением до 2. https://en.wikipedia.org/wiki/Two%27s_complement

Если бы собственный формат хранения в регистре был десятичным, битовые сдвиги влево и вправо умножались бы/делились бы на степень 10, а не на степень 2.


Кодировка отделена от значения. Учитывая битовый шаблон 0b11111111111111111111110000011001 в 32-битном регистре, вы можете описать/представить закодированное значение как

  • -999 десятичное число, интерпретирующее его как дополнение до 2 со знаком
  • 0xfffffc19 беззнаковый шестнадцатеричный
  • 037777776031 восьмеричное
  • 0b11111111111111111111110000011001 двоичный

Это все одно и то же число, просто разные способы выражения либо математического значения (в виде отрицательного десятичного числа), либо битового шаблона дополнения до 2 (шестнадцатеричный, восьмеричный и двоичный).

Обычно шестнадцатеричный используется только для описания битового шаблона, поэтому вы обычно не увидите отрицательное шестнадцатеричное число, такое как -0x3e7.


Это распространенное заблуждение, что числа в регистрах или памяти «в шестнадцатеричном формате». Hex — это формат сериализации двоичных чисел, позволяющий хранить их в виде текста в удобочитаемом формате. Число находится в шестнадцатеричном формате только в том случае, если оно хранится в виде последовательности символов ASCII.

Строка десятичных цифр ASCII — это еще один способ сериализации чисел, и это то, что вас просят сделать здесь.

Шестнадцатеричные и десятичные числа обычно используются в исходном коде ассемблера, но ассемблер соберет ваши числа в 32-битные двоичные слова. (Или 16-битные непосредственные как часть потока инструкций, для чего-то вроде addiu $t0, $t1, 0x1234)

Вы можете говорить о значении двоичного числа, используя шестнадцатеричный код, но на самом деле оно хранится как 2 бита с основанием.

person Peter Cordes    schedule 22.12.2018