Используя подмножество языка ассемблера MIPS, как вывести число в базе 32? - PullRequest
0 голосов
/ 03 октября 2019

Даны конкретные инструкции:

Распечатать ответ из Prgm1 в base-32. Не используйте div / mul / rem или аналогичные. Придерживайтесь использования только t-регистров, когда можете.

Примечания:

Под основанием 32 я подразумеваю как шестнадцатеричное (основание 16), но с группами из 5 бит вместо 4, поэтому мы используем буквы до V. Начните с размышлений о том, как вы это сделаетеsyscall 1, 35 или 34.

Мне удалось выполнить первую часть этого, но я понятия не имею, как получить результат в базе 32 или в группах из 5. Любая помощь будет принята с благодарностью.

.data
prompt: .asciiz "Enter a number: "
prompt2: .asciiz "Enter another number: "
.text

# Prompt the user to enter number.
li $v0, 4
la $a0, prompt # Print prompt
syscall

# Get the user's number
li $v0, 5
syscall

# Store the result in $t2
move $s0, $v0 # Move users number from $v0 to $t2

# Prompt the user to enter number.
li $v0, 4
la $a0, prompt2 # Print prompt
syscall

# Get the user's number
li $v0, 5
syscall

# Store the result in $t3
move $s1, $v0 # Move users number from $v0 to $t3

# Store the result in $s0
li $s2, 0 
li $s3, 1 # Mask for extracting bit
li $t1, 0 # Counter

Loop:
# If $t1 equals 31, branch the number of instructions by the offset
beq $t1, 31, exit
and $t0, $s1, $s3 # ands $s1 and $s3 and stores in $t0
sll $s3, $s3, 1 # Multiplies value in $s3 by 2^1 and stores in $s3

# If $t0 equals 0, branch the number of instructions by the offset
beq $t0, 0, Loop2 
add $s2, $s2, $s0 # Stores the sum of $s0 and $s2 in $s2

Loop2:
# Multiplies value in $s0 by 2^1 and stores in $s0
sll $s0, $s0, 1 
addi $t1, $t1, 1 #adds 1 to $t1 and stores in $t1
j Loop



exit:
# Print or show the number
li $v0, 1
add $a0, $s2, $zero # Move the number to the argument
syscall

#Exit
li $v0, 10
syscall

1 Ответ

0 голосов
/ 03 октября 2019

Алгоритм для строкового преобразования числа в любой базе такой же, как и для базы 10, просто замените предпочитаемую базу на 10.

Алгоритм заключается в модификации числа для печати числоми взять цифру. Затем разделите число для печати на основание и повторяйте, пока число не уменьшится до нуля. (Если вам нужны начальные нули, заполните их.)

Этот относительно простой подход генерирует строку цифр в обратном порядке;таким образом, можно использовать буфер максимального размера для строки nubmer-as-string в базе, а цифры, помещенные в конец буфера, будут последовательно перемещаться назад (вниз при адресации). Результирующая строка идет в правильном порядке пересылки и может использоваться как обычная строка.

Альтернативы (а) - генерировать строку в обратном направлении (пока еще вперед в памяти), а затем обратить ее вспять, и, (b)чтобы разделить число на максимальное значение 1ххх в базе чисел (например, 1000000000 для десятичной / основание 10), возьмите цифру, затем вычтите эту цифру из рабочего значения 1000ххх и повторите с следующей меньшей 10-й формой.

База 2 (двоичная) и база 16 (шестнадцатеричная) являются просто специализациями того же алгоритма, которые используют регулярность этих баз по сравнению с двоичными возможностями процессоров. В этих формах из-за четного числа битов на цифру строковые цифры могут быть непосредственно сгенерированы в прямом порядке, без деления, модификации или умножения.

...