2010-05-29 85 views
1

我只是想知道,有没有在MIPS任何方式字节数的总和存储为一个字符串,并在以后读字节,例如:保存整数作为字符串在MIPS

总和657 - > SW转换成.ascii指令 - >在第一个索引后面1b得到6(以ascii编码)与5相同,依此类推。这可能吗?

+0

相关:C中的通用算法(重复除以10,最后一位数=余数)。这里的答案从缓冲区的末尾开始反向工作,因为算法以相反的顺序产生数字。 – 2017-11-08 16:33:55

回答

2

当然。该“.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(数字),你必须停止

+1

这在一些地方有点笨重。你不需要在寄存器中保存'0',你可以'addui $ t4,$ t4,'0''。 ('0'是一个小的常数,作为一个立即)。另外,'la $ t0,buffer + 30'应该可以工作。不需要将错误的地址作为立即数加载,然后在运行时添加。 – 2017-11-08 16:25:12

+1

除此之外,这是很好的(和处理签名整数是一个不错的奖金)。从缓冲区末端开始反向工作绝对是最好的方法(与将数字推入堆栈或一次打印一个数字)。 – 2017-11-08 16:26:37