在MIPS中将整数保存为字符串

时间:2010-05-29 06:52:26

标签: assembly mips

我只是想知道,MIPS中是否有任何方法可以将数字的总和存储为字符串,然后逐字节地读取它们,例如:

总和657 - > sw成.ascii指令 - >后来lb在第一个索引上获得6(在ascii代码中)与5相同,依此类推。这可能吗?

2 个答案:

答案 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 会将正数转换为负数,这会导致代码输出异常。 如果我们删除这一行。这些代码适用于正整数