неверный целочисленный вывод Mips

Я получаю неверный результат при использовании этого:

li $v0, 1

Мне нужно сохранить ввод пользователя как ASCII (от 0 до 9), преобразовать его в целое число, а затем распечатать его как целое число.

Но когда у меня, например, 10 в моем регистре, он печатает 16; когда у меня 20, он печатает 32 и так далее ... он печатает: my_number + 6 ^ (n), и я не знаю почему ...

Это мой код:

.data
num1:   .space 32
num2:   .space 32
entra:  .asciiz "Put your Decimal: "
sale:   .asciiz "\nDecimal is: "        
.globl __start
.text
__start:    
la $a0, entra           # print 1st text
li $v0, 4
syscall
la $s4, num1            # space to put the copy of user's word without \n

li $a1, 25              # space to put user's word (number)
li $v0, 8               # take input
la $a0, num2   
syscall


li $t1, -1          # counter to know how many times we iterate over EliminarEnter

jal EliminarEnter       # this function remove \n char and save it to $t4

jal Funcion         # getting the symbol of the char
li $v0, 10
syscall             # exit

EliminarEnter:
    addi $t1, $t1, 1        # increment counter
    lb $t2, 0($a0)          # take byte of users word
    beq $t2, 10 QuitarEnter     
    sb $t2, 0($s4)          # save the byte in $t4
    addi $s4, $s4, 1        
    addi $a0, $a0, 1        # increment pointer in the word

j EliminarEnter

QuitarEnter:        
    jr $ra          
Funcion:
    sub $s4, $s4, $t1       # go to the first memory adress

Bucle: 

    lb $t2, 0($s4)      
    beq $t2, $zero Acabar   # if char is null '\0' --> End of program
    addi $t3, $t2, -48  # -48, t get the symbol of my char
    j GuardarIncrementar


GuardarIncrementar:

    rol $t4, $t4, 4     # rol positions
    add $t4, $t4, $t3   # where I save the decimal number
    addi $s4, $s4, 1    # increment adress of my new ASCII word (without '\n')

    j Bucle

Acabar:


    la $a0, sale        # printing 2nd text
    li $v0, 4
    syscall



    add $v1, $zero, $t4
    move $v0, $v1       
    move $a0 , $v0
    li $v0, 1       # printing MY NUMBER... THING THAT DOESNT WORK!!!
    syscall
    jr $ra          # exit

person noona mun    schedule 08.10.2016    source источник
comment
Похоже, вы обрабатываете входную строку как шестнадцатеричную (основание 16). У вас не может быть строки в вашем регистре, BTW. Проверяли ли вы в документации системные вызовы, которые использует ваша программа? А значения регистров в отладчике смотрели?   -  person Peter Cordes    schedule 09.10.2016
comment
Думаю, я работаю с числами в таблице ASCII, которые относятся к каждому символу (число 0 - ›символ 48 - 0 и так далее ...), и да, этот код взят из программы, в которой я пришлось преобразовать из Hex в Dec; D   -  person noona mun    schedule 09.10.2016


Ответы (2)


Вы хотите использовать десятичную дробь, поэтому в GuardarIncrementar

Изменять:

    rol $t4, $t4, 4     # rol positions

В:

    mul $t4, $t4, 10    # multiply by base 10
person Craig Estey    schedule 08.10.2016

Я думаю, вы конвертируете каждую входную цифру в 4-битное число и используете

rol $t4, $t4, 4            # multiply by 16
add $t4, $t4, $t3          # and add the new digit

для накопления целочисленного значения.

Это помещает каждую входную цифру в свои 4 бита целого числа, что означает, что вы обрабатываете свой ввод как базу 16 (но без обработки A-F).

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

person Peter Cordes    schedule 08.10.2016