我只是想知道,有没有在MIPS任何方式字节数的总和存储为一个字符串,并在以后读字节,例如:保存整数作为字符串在MIPS
总和657 - > SW转换成.ascii指令 - >在第一个索引后面1b得到6(以ascii编码)与5相同,依此类推。这可能吗?
我只是想知道,有没有在MIPS任何方式字节数的总和存储为一个字符串,并在以后读字节,例如:保存整数作为字符串在MIPS
总和657 - > SW转换成.ascii指令 - >在第一个索引后面1b得到6(以ascii编码)与5相同,依此类推。这可能吗?
当然。该“.ascii”指令是没有,但集中在ASCII文本的储存.BYTE指令
.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
后为主,lb R, ($v0)
精选 “1” 有$ V0,lb R, 1($v0)
选秀第二位(2)等;记住字符串是以null结尾的,所以如果你选择0(数字),你必须停止
这在一些地方有点笨重。你不需要在寄存器中保存'0',你可以'addui $ t4,$ t4,'0''。 ('0'是一个小的常数,作为一个立即)。另外,'la $ t0,buffer + 30'应该可以工作。不需要将错误的地址作为立即数加载,然后在运行时添加。 – 2017-11-08 16:25:12
除此之外,这是很好的(和处理签名整数是一个不错的奖金)。从缓冲区末端开始反向工作绝对是最好的方法(与将数字推入堆栈或一次打印一个数字)。 – 2017-11-08 16:26:37
相关:C中的通用算法(重复除以10,最后一位数=余数)。这里的答案从缓冲区的末尾开始反向工作,因为算法以相反的顺序产生数字。 – 2017-11-08 16:33:55