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

问题描述 投票:0回答:2

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

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

assembly mips
2个回答
2
投票

我认为 ShinTakezou 的回答有缺陷。 行负 $a0, $a0 会将正数转换为负数,这会导致代码输出奇怪的结果。 如果我们删除这一行。这些代码对于正整数工作正常


2
投票

当然。 “.ascii”指令只不过是一个专注于 ASCII 文本存储的 .byte 指令

 .ascii“PP”

就像

 .字节80,80

您可以使用

.space
为 ASCII 字符串腾出空间,然后在从整数到 ASCII 的转换中使用缓冲区,如果您的意思是整数的“sw into .ascii 指令”。以下代码使用 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+30  # pointer to almost-end of buffer
      sb   $0, 1($t0)      # null-terminated str
      li   $t1, '0'  
      sb   $t1, ($t0)     # init. with ascii 0
      li   $t3, 10        # preload 10

      slt  $t2, $a0, $0   # keep the sign
      beq  $a0, $0, iend  # end if 0
      bgtz $a0, loop
      neg  $a0, $a0       # absolute value (unsigned)
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
      subu  $t0, $t0, 1   # dec. buf ptr
      bne  $a0, $0, loop  # if not zero, loop
      addiu $t0, $t0, 1   # adjust buf ptr
iend:
      beq  $t2, $0, nolz  # was < 0?
      addiu $t0, $t0, -1
      li   $t1, '-'
      sb   $t1, ($t0)
nolz:
      move $v0, $t0      # return the addr.
      jr   $ra           # of the string

在 main 中有 $v0 后,

lb R, ($v0)
选择“1”,
lb R, 1($v0)
选择第二个数字 (2),依此类推;请记住该字符串以 null 结尾,因此如果您选择 0(数字),则必须停止

© www.soinside.com 2019 - 2024. All rights reserved.