用户输入字符串的结束字符

时间:2016-03-29 17:24:01

标签: mips qtspim

我正在编写一个带有罗马数字(最多12个字符)并将其转换为十进制值的程序。我能够成功地进行这种转换并按字符读取每个值,但是当输入的字符串不是12个字符时,我的值总是大于实际值1000,我已经确定这是由于通过evaluate子例程的额外循环(如果没有匹配,则进入转换M = 1000的过程。

我认为这与我在少于12个字符时读取用户字符串的方式有关。我的理解是读取字符串系统调用代码继续进行,直到达到'\ n'字符,并将该字符及其空白空间的其余部分转换为0个字符,因此检查下一个字符是否不等于0应该工作因为我不希望0在用户的输入中。如果在“评估”期间没有匹配,我确实可以通过跳转到tailLoop来修复我的代码,但我想了解为什么我目前的代码不起作用。

以下代码不包含我的程序(完全发布会很长),只够了解我尝试使用的逻辑进程。这是家庭作业,以防你想要回答问题的方式。

# Program to translate Roman Numerals to decimal values

.data
    numeralString:
        .space 13
# End Strings

.text   # Begin Program
.globl main

main:
    li $v0, 8 # read string from user at next syscall
    la $a0, numeralString
    li $a1, 13
    syscall

    la $t0, numeralString # take input string and store in $t0
    move $t1, $t0 # creating a copy of base register
    lb $t2, 0($t0) # loads first byte (character) into $t2

    jal evaluate # calls evaluate subroutine.  String passed via $t0 (first byte/character specified in $t2)
             # interger value returned via $v1

    li $v0, 1 # print result value from $v1 at next syscall
    move $a0, $v1
    syscall

exit:   # Exit Program in next syscall

    li $v0, 10 # exit program in next syscall
    syscall

evaluate: # matches numeral in string to correct subroutine
    lb $t3, 1($t0)
    beq $t2, 'M', mChar

mChar:
    addi $v1, $v1, 1000
    # beq $t3, 'C', cSlot
    j tailLoop

tailLoop:
    move $t2, $t3 # $t2 now holds next character of string
    addi $t0, $t0, 1
    bnez $t2, evaluate # Go back to evaluate if next character exists
    jr $ra

1 个答案:

答案 0 :(得分:0)

  

据我所知,读取字符串系统调用代码一直进行到达'\ n'字符,然后将该字符及其余空格转换为0个字符

没有

如果查看spim source code,您会看到在系统调用时调用的read_input函数

  

在Unix文件上模拟[s] fgets(not gets)的语义。

According to CPlusPlus.com

  

换行符使fgets停止读取,但它被函数视为有效字符,并包含在复制到str的字符串中。

通过检查垃圾码确认了这一点。