В сборке MIPS, как бы я разобрал целое число, например 255, в строку символов '2' '5' '5'
.
255 может быть в $t0
Затем '2' '5' '5'
можно было сохранить в $t1
, а затем распечатать.
Как бы я это сделал?
В сборке MIPS, как бы я разобрал целое число, например 255, в строку символов '2' '5' '5'
.
255 может быть в $t0
Затем '2' '5' '5'
можно было сохранить в $t1
, а затем распечатать.
Как бы я это сделал?
Вот версия на Python. Просто переведите его в mips-сборку.
def to_str(n):
output = ''
while True:
m = n % 10
output = str(m) + output
n = n / 10
if n == 0:
break
print(output)
Идея состоит в том, чтобы повторно получить остатки от деления по основанию (в данном случае 10). Например:
n = 255
n % 10 -> 5, n = 255 / 10 = 25
n % 10 -> 5, n = 25 / 10 = 2
2 % 10 -> 2, n = 2 / 10 = 0
Теперь просто получите остатки от деления и распечатайте их в обратном порядке.
Вот одно решение в сборке mips:
.data
N: .word 2554
digits: .space 16 # number of digits * 4 bytes
num_digits: .word 3 # number of digits - 1
.text
lw $t0, N # $t0 = N
lw $t1, num_digits
sll $t1, $t1, 2
la $s0, digits
add $s0, $s0, $t1
loop:
div $t2, $t0, 10
mfhi $t2 # remainder is in $t2
sw $t2, 0($s0)
subi $s0, $s0, 4
div $t0, $t0, 10
beqz $t0, print
b loop
print:
# print contents of digits
li $t0, 0 # loop counter
lw $t1, num_digits
la $s0, digits
print_loop:
bgt $t0, $t1, end
# print the digit
lw $a0, 0($s0)
li $v0, 1
syscall
# put a space between digits
la $a0, 32
li $v0, 11
syscall
# move the next digit and increment counter
addi $s0, $s0, 4
addi $t0, $t0, 1
b print_loop
end:
Это приводит к следующему результату:
2 5 5 4
-- program is finished running (dropped off bottom) --
Звездочка очень хорошо поработала! Я просто пишу, чтобы сделать его ответ более полным.
Сообщение
-- program is finished running (dropped off bottom) --
показано, потому что он не закончил свою программу с
li $v0, 10
syscall
Вы всегда должны заканчивать свою программу указанными выше строками, чтобы завершить выполнение в обычном режиме.
Из http://logos.cs.uic.edu/366/notes/mips%20quick%20tutorial.htm:
e.g. To indicate end of program, use exit system call; thus last lines of program should be:
li $v0, 10 # system call code for exit = 10
syscall # call operating sys
Идея преобразования числа в строку по некоторому основанию в основном реализуется путем многократного деления числа на основание (в данном случае 10) и записи остатка в обратном порядке, пока значение не станет равным нулю. Это самое простое решение. Например за 255
255/10 = 25 remain 5 ↑
25/10 = 2 remain 5 ↑
2/10 = 0 remain 2 ↑
Остаток 2, 5, 5, как и ожидалось
Для десятичного числа у вас есть другой вариант, то есть двойное dabble, который может преобразовать двоичный файл в упакованный BCD без деления. Затем вы можете легко распаковать кусочки в символы.