Сохранение целых чисел в виде строк в MIPS - PullRequest
1 голос
/ 29 мая 2010

Мне было просто интересно, есть ли способ в MIPS хранить суммирование чисел в виде строки, а затем читать их побайтно, например:

сумма 657 -> sw в директиву .ascii -> позже lb по первому индексу, чтобы получить 6 (в коде ascii), то же самое с 5 и так далее. Это возможно?

1 Ответ

2 голосов
/ 04 июня 2010

Конечно. Директива .ascii - это не что иное, как директива .byte, ориентированная на хранение текста ASCII

   .ascii "PP"

похоже на

   .byte 80,80

Вы можете использовать .space, чтобы освободить место для вашей строки ASCII, а затем использовать буфер при преобразовании из целого числа в ASCII, если вы подразумеваете это как "sw into .ascii директива" из целого числа. Следующий код преобразует «двоичное число» в строку ASCII, используя itoa, и печатает его (только для тестирования) с помощью 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 (числовой), вы должны остановить

...