接受一个字符串,剪切第一个字符,然后转换为int

时间:2017-10-24 15:25:51

标签: mips

我正在处理的代码以“X123”形式从用户处获取一个字符串(不限于3个字符),其中X可以是任何非数字字符,123可以是任何数字字符系列。然后代码剥离非数字,将数字部分转换为int,添加5,然后打印结果。

 .data
    msgerror: .asciiz "The string does not contain valid digits."
    input: .space 9 
    open: .asciiz "Enter a string:\n"
    close: .asciiz "The value +5 is:\n"

.text
.globl main

main:

    li $v0, 4
    la $a0, open
    syscall

    li $v0, 8      
    la $a0, input        #read a string into a0
    move $t0, $a0
    syscall

    li $t3,0
    li $t4,9
    la $t0, input        #address of string
    lbu $t1, 1($t0)        #Get first digit of actual number
    li $a1, 10           #Ascii of line feed
    li $a0, 0            #accumulator

    addi $t1,$t1,-48  #Convert from ASCII to digit
    move $a2, $t1         #$a2=$t1 goto checkdigit
    jal checkdigit
    add $a0, $a0, $t1      #Accumulates
    addi $t0, $t0, 1      #Advance string pointer 
    lbu $t1, ($t0)        #Get next digit

buc1:   
    beq $t1, $a1, print #if $t1=10(linefeed) then print
    addi $t1,$t1,-48  #Convert from ASCII to digit
    move $a2, $t1         #$a2=$t1 goto checkdigit
    jal checkdigit
    mul $t2, $a0, 10  #Multiply by 10
    add $a0, $t2, $t1      #Accumulates
    addi $t0, $t0, 1      #Advance string pointer 
    lbu $t1, ($t0)        #Get next digit 
    b buc1




print:  
    add $a0, $a0, 5
    li $v0, 1         
    syscall
    b end

checkdigit:
    blt $a2, $t3, error  
    bgt $a2, $t4, error
    jr $ra




error:
    la $a0, msgerror
    li $v0, 4            #print eror
    syscall

end:    
   li $v0, 10           #end program
   syscall

然而,我的代码最终会产生:

Enter a string:
x123
The value +5 is:
1128

(128是预期的)。

如何让其中一个重复的数字消失?我已尝试使用print语句将地址递增1,但似乎不能与其他任何内容一起使用/不符合预期。

li $v0,4
la $a0, aString
add $a0, $a0, 1
syscall

如果输入123,上面的代码段会生成23,但我无法将其应用于上述代码段。

也欢迎更简单的整体方法。 mips的新手,所以我几乎不认为我的那么好。

1 个答案:

答案 0 :(得分:0)

看起来你读了第一个数字两次。

这部分:

<p:commandLink id="btn_pwdChange" onclick="PF('ctr_dlgPwdChange').show();"...

应改为:

li $t3,0
li $t4,9
la $t0, input          #address of string
lbu $t1, 1($t0)        #Get first digit of actual number