MIPS以字符串形式输入用户输入,并以33为基数转换为整数

时间:2018-11-08 02:01:56

标签: string input decimal mips base

我是MIPS的新手,这是我的第二个汇编程序。这是用于学术任务。

我必须:编写一个MIPS程序,该程序从用户输入中读取最多4个字符的字符串。该程序必须使用循环来处理用户输入。该程序不得包含子程序。然后,假定用户输入的基数为33。将其转换为十进制整数。

我的代码中出现错误。另外,我不知道如何将字符串转换为整数,然后再转换为10。

我尝试做某事,但是据我所知:

.data   
str:
.space 6

.word 4      

Ask:  
.asciiz "\nPlease Enter a 4 Characters\n" 


Answer:  
.asciiz "\nYou Entered:\n "    #lets the user know what they entered   


.text  


main:
la $a0, Ask #load address Ask
li $v0, 4 #loads the value 6 into register $v0
syscall

#store input in $t0
move $t0, $v0

li $v0, 8 #get input

la $a0, str
li $a1, 64
syscall

#from here to add
la $a0, Answer
syscall

li $v0, 4 #system call to print 
move $a0, $t0
syscall

更新

好的,所以我更新了代码。我不确定如何执行系统调用来访问新创建的整数。我该如何解决?

这是我更新的代码:

.data
Ask:

.asciiz "\n Please Enter 4 Characters\n" 

userInput:  .space 20

Answer:

.asciiz "\n You Entered : \n"

.text 

main:
#addi $t0, 0


li $v0, 4
la $a0, Ask #display question
syscall

li $v0, 8 #get input
la $a0, userInput
li $a1, 20
syscall

li $v0, 4
la $a0, Answer
syscall

li $v0, 4
la $a0, userInput
syscall

lb $s1, 0($a0)
lb $s2 1($a0)
lb $s3 2($a0)
lb $s4, 3($a0)
lb $t0, 4($a0)
addi $t1, $zero, 10

addi $t5, $zero, 64
addi $t6, $zero 96
addi $s5, $zero, 65
addi $s6, $zero, 97 
addi $t2, $zero, 47  #loads 47 into $t2

addi $t3, $zero,  55

addi $t4, $zero,  87

beq $t0, $t1, Label1

Label1:

bgt $s1, $t2, L1
bgt $s1, $t5, L2
bgt $s1, $t6, L3

L1: 
    addi $s1, $s1, -48  #subtracts 48 from $s1 which is 48 to get int  from 0 to 9 
L2: 
    addi $s1, $s1, -55 #gets values from 10 to 33
L3: 
    addi $s1, $s1, -87  #gets values from 10 to 33 for small caps

bge $s2, $t2, L4
bge $s2, $t5, L5
bge $s2, $t6, L6

L4: 
    addi $s2, $s2, -48
L5: 
    addi $s2, $s2, -55
L6: 
    addi $s2, $s2, -87

bgt $s3, $t2, L7
bgt $s3, $t5, L8 
bgt $s3, $t6, L9

L7: addi $s3, $s3, -48
L8: addi $s3, $s3, -55
L9: addi $s3, $s3, -87


bgt $s4, $t2, L10
bgt $s4, $t5, L11
bgt $s4, $t6, L12

L10: 
    addi $s4, $s4, -48
L11: 
    addi $s4, $s4, -55
L12: 
    addi $s4, $s4 , -87


la $v0, 4 
lw $a0, s4

#last system call of the program will be very last instruction
li $v0, 10
syscall  

1 个答案:

答案 0 :(得分:0)

如果用户输入以33为基数,则它将是由ACSII 0-9和A-W组成的字符串。

因此您别无选择,只能将其读取为字符串。

您的代码:

la $a0, Ask #load address Ask
li $v0, 4 #loads the value 6 into register $v0 (wrong comment here)
syscall

会提示用户输入值,但不会读取该值,

#store input in $t0
move $t0, $v0

不会做任何有用的事情-您需要输入一个字符串

您的代码将进一步这样做:

li $v0, 8 #get input

la $a0, str
li $a1, 64

syscall

但是,您要读取4个字符,因此应将a1设置为4 + 1(即5)而不是64。

到那时,您将在缓冲区中有一个普通的ascii字符串,因此需要遍历缓冲区中的每个字节(或遍历缓冲区4次)并找到给定字符:

  • 如果介于0-9之间=> value =字符-'0'
  • 如果它介于A-W =>值= 10 +字符-'A'
  • 您还可以检查a-w,如果执行错误检查则显示不符合上述条件的错误。

一个能正常工作的人,需要有一个值(或寄存器),并且必须初始化为0,该值是所有字符的全10进制值-在循环缓冲字符之前已初始化

然后在字符循环的最后部分添加一条有效的语句

the full_base_10_num = (full_base_10_num * 10) + thecharacter_calculated_value

完成所有字符的循环后,您现在将可以显示十进制的10值。