在MIPS程序集中,如何将整数(如255)解析为字符串'2' '5' '5'
。
255可能在$t0
'2' '5' '5'
然后可以存储在$t1
中然后打印。
我该怎么做?
答案 0 :(得分:2)
这是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) --
答案 1 :(得分:0)
将数字转换为另一个基数中的字符串的想法基本上是重复除以基数,在本例中为10,并向后写入余数。这是最简单的解决方案。
对于十进制,你有另一个选项,即double dabble,它可以将二进制转换为压缩BCD而不进行除法。从那时起,您可以将半字节解压缩为字符
答案 2 :(得分:0)
Asterisk表现非常出色!我只是在写作,以使他的答案更加完整。
消息
-- 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