我只是想知道,MIPS中是否有任何方法可以将数字的总和存储为字符串,然后逐字节地读取它们,例如:
总和657 - > sw成.ascii指令 - >后来lb在第一个索引上获得6(在ascii代码中)与5相同,依此类推。这可能吗?答案 0 :(得分:2)
当然。 “.ascii”指令只是一个.byte指令,专注于ASCII文本的存储
.ascii "PP"
就像
.byte 80,80
你可以使用.space
为你的ASCII字符串腾出空间,然后在整数到ASCII的转换中使用缓冲区,如果你的意思是整数的“sw into .ascii directive”。以下代码使用itoa将“二进制数”转换为ASCII字符串,并使用print_string打印它(仅用于测试)。该函数使用缓冲区并返回指向可用于打印的第一个ASCII数字的指针。这可以用作类似sprintf的函数实现的第一个辅助函数。
.data
buffer:
.space 32
.text
# the main supposes env. like spim or MARS
main:
li $a0, 1234 # a number
jal itoa
move $a0, $v0
li $v0, 4 # print_string
syscall
li $v0, 10
syscall # exit
itoa:
la $t0, buffer # load buf
add $t0, $t0, 30 # seek the end
sb $0, 1($t0) # null-terminated str
li $t1, '0'
sb $t1, ($t0) # init. with ascii 0
slt $t2, $a0, $0 # keep the sign
li $t3, 10 # preload 10
beq $a0, $0, iend # end if 0
neg $a0, $a0
loop:
div $a0, $t3 # a /= 10
mflo $a0
mfhi $t4 # get remainder
add $t4, $t4, $t1 # convert to ASCII digit
sb $t4, ($t0) # store it
sub $t0, $t0, 1 # dec. buf ptr
bne $a0, $0, loop # if not zero, loop
addi $t0, $t0, 1 # adjust buf ptr
iend:
beq $t2, $0, nolz # was < 0?
addi $t0, $t0, -1
li $t1, '-'
sb $t1, ($t0)
nolz:
move $v0, $t0 # return the addr.
jr $ra # of the string
在主要的$ v0之后,lb R, ($v0)
选择“1”,lb R, 1($v0)
选择第二位数字(2),依此类推;记住字符串是以空值终止的,所以如果你选择0(数字),你必须停止
答案 1 :(得分:2)
我相信 ShinTakezou 的回答存在缺陷。 行否定 $a0, $a0 会将正数转换为负数,这会导致代码输出异常。 如果我们删除这一行。这些代码适用于正整数