Преобразование int в строку символов

В сборке MIPS, как бы я разобрал целое число, например 255, в строку символов '2' '5' '5'.

255 может быть в $t0

Затем '2' '5' '5' можно было сохранить в $t1, а затем распечатать.

Как бы я это сделал?


person user3093146    schedule 11.12.2013    source источник
comment
Вы хотите, чтобы 8-битная версия символов ascii сохранялась подряд в t1?   -  person Kat    schedule 12.12.2013
comment
вы имеете в виду целое число или байт? 32 бита дают вам 4 символа в ascii   -  person Tony Hopkinson    schedule 12.12.2013
comment
@TonyHopkinson Я хочу получить 255 из t0 и поставить, скажем, 2 или значение 0x32, так как это значение символа в t1, затем сделать то же самое, чтобы 5 можно было поместить в t2, а остальные 5 - в t3.   -  person user3093146    schedule 12.12.2013
comment
Итак, вы знаете ascii, бит, на котором вы застряли, преобразует 255 в 2, 5 и 5?   -  person Tony Hopkinson    schedule 12.12.2013
comment
Подсказка: остатки от повторных делений на 10.   -  person Michael    schedule 12.12.2013


Ответы (3)


Вот версия на Python. Просто переведите его в mips-сборку.

def to_str(n):
    output = ''
    while True:
        m = n % 10
        output = str(m) + output
        n = n / 10
        if n == 0:            
            break
    print(output)

Идея состоит в том, чтобы повторно получить остатки от деления по основанию (в данном случае 10). Например:

n = 255
n % 10 -> 5, n = 255 / 10 = 25
n % 10 -> 5, n = 25 / 10 = 2
2 % 10 -> 2, n = 2 / 10 = 0

Теперь просто получите остатки от деления и распечатайте их в обратном порядке.

Вот одно решение в сборке mips:

.data
    N: .word 2554
    digits: .space 16 # number of digits * 4 bytes
    num_digits: .word 3 # number of digits - 1

.text
    lw $t0, N # $t0 = N
    lw $t1, num_digits
    sll $t1, $t1, 2
    la $s0, digits
    add $s0, $s0, $t1
loop:
    div $t2, $t0, 10
    mfhi $t2 # remainder is in $t2
    sw $t2, 0($s0)
    subi $s0, $s0, 4
    div $t0, $t0, 10
    beqz $t0, print
    b loop
print:
    # print contents of digits
    li $t0, 0 # loop counter
    lw $t1, num_digits
    la $s0, digits
print_loop:
    bgt $t0, $t1, end
    # print the digit
    lw $a0, 0($s0)
    li $v0, 1
    syscall

    # put a space between digits
    la $a0, 32
    li $v0, 11
    syscall

    # move the next digit and increment counter
    addi $s0, $s0, 4
    addi $t0, $t0, 1    
    b print_loop
end:

Это приводит к следующему результату:

2 5 5 4 
-- program is finished running (dropped off bottom) --
person Asterisk    schedule 13.12.2013
comment
Что делать, если вы не знаете количество цифр? Можно получить с помощью floor(log_10(n))+1, но для этого сложно реализовать log10 в сборке. РЕДАКТИРОВАТЬ: я тупой, я могу просто перебрать строку дважды - person Winter; 15.03.2019

Звездочка очень хорошо поработала! Я просто пишу, чтобы сделать его ответ более полным.

Сообщение

     -- program is finished running (dropped off bottom) --

показано, потому что он не закончил свою программу с

                  li $v0, 10
                  syscall

Вы всегда должны заканчивать свою программу указанными выше строками, чтобы завершить выполнение в обычном режиме.

Из http://logos.cs.uic.edu/366/notes/mips%20quick%20tutorial.htm:

e.g. To indicate end of program, use exit system call; thus last lines of program should be:

    li $v0, 10     # system call code for exit = 10
    syscall        # call operating sys
person gon1332    schedule 17.12.2013
comment
Почему бы не проголосовать за него, если он проделал такую ​​отличную работу? Кроме того, это действительно должен быть комментарий к его ответу - сам по себе он не отвечает на вопрос. - person Konrad Lindenbach; 29.12.2013

Идея преобразования числа в строку по некоторому основанию в основном реализуется путем многократного деления числа на основание (в данном случае 10) и записи остатка в обратном порядке, пока значение не станет равным нулю. Это самое простое решение. Например за 255

255/10 = 25 remain 5 ↑
 25/10 =  2 remain 5 ↑
  2/10 =  0 remain 2 ↑

Остаток 2, 5, 5, как и ожидалось

Для десятичного числа у вас есть другой вариант, то есть двойное dabble, который может преобразовать двоичный файл в упакованный BCD без деления. Затем вы можете легко распаковать кусочки в символы.

person phuclv    schedule 13.12.2013