我正在编写一个带有罗马数字(最多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
答案 0 :(得分:0)
据我所知,读取字符串系统调用代码一直进行到达'\ n'字符,然后将该字符及其余空格转换为0个字符
没有
如果查看spim source code,您会看到在系统调用时调用的read_input
函数
在Unix文件上模拟[s] fgets(not gets)的语义。
换行符使fgets停止读取,但它被函数视为有效字符,并包含在复制到str的字符串中。
通过检查垃圾码确认了这一点。