Я работаю над заданием, в котором мне нужно ввести два 64-битных числа без знака в десятичном виде, а затем выполнить над ними сложение и умножение и вывести результаты в десятичном формате.
Результат сложения сохраняется в $ s4 для младшей половины числа и $ s5 для старшей половины. У меня проблема с преобразованием этих двух значений в одну строку, содержащую результат в десятичном формате.
После некоторого исследования я обнаружил, что Метод:
Вы должны генерировать строку справа налево, каждый раз деля число из 2 слов на 10, вычисляя остаток и частное. Остаток преобразуется в следующий символ и сохраняется в строке для последующей печати. Частное переписывается в два слова и используется в следующей итерации.
Как выполнить деление 64-битного числа на 10 Пусть A (64 бит) состоит из B и C, где B содержит старшие 32 бита и C младшие 32 бита. То есть A = B (2 ^ 32) + C. Используйте инструкции divu и remu для B и C, чтобы определить общее частное и остаток для 64-битного числа A, разделенного на 10.
Вот процедура, которую я придумал:
itoa:
li $t0, 0
li $t3, 0
li $t2, 0
li $t1, 0
li $t5, 0
li $t6, 0
li $t8, 0
addiu $t5, $zero, 6 # 2%32%10
addiu $t0,$zero,10 # t0=10
lw $t1, exponent #2^32/10
addu $t2,$t2, $a0 #low half of addition
addu $t3,$t3, $a1 #high half of addition
itoa_loop:
#B/10
beqz $t3, skip_high
divu $t3, $t0
mflo $t3 #quotient of B
mfhi $t4 #remainder of B
multu $t4, $t5 #multiplying remainders of B/10 and 2^32/10
mflo $t6
skip_high:
#C/10
divu $t2, $t0
mflo $t2 #quotient of C
mfhi $t4 #remainder of C
addu $t8, $t4, $t6 #summing up remainders
addi $t8, $t8, 48 #convert to ascii
sb $t8, ($t9) #t9 is the output string
addi $t9, $t9, 1
#2^32/10
divu $t1, $t0
mflo $t1 #2^32/10 quotient
mfhi $t5 #2^32%10 remainder
bne $t2, $zero, itoa_loop
sb $zero, ($t9)
jr $ra
К сожалению, работает только с 32-битными числами.