MIPS вводит пользовательский ввод в виде строки символов и преобразует в целое число в базе 33 - PullRequest
0 голосов
/ 08 ноября 2018

Я новичок в 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 голосов
/ 08 ноября 2018

Если пользовательский ввод является основанием 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 => значение = символ - '0'
  • если оно находится между A - W => value = 10 + thecharacter-'A '
  • Вы также можете проверить a-w, и, если вы выполняете проверку ошибок, показать ошибку, если она не соответствует ни одной из перечисленных выше.

Если у вас это работает, вам нужно иметь значение (или регистр), которое вы инициализируете равным 0, которое является полным значением base-10 всех символов - инициализируется перед циклом прохождения через символы буфера

И затем добавьте в последнюю часть цикла символов оператор (ы), который фактически равен

the full_base_10_num = (full_base_10_num * 10) + thecharacter_calculated_value

После того, как цикл завершен для всех символов, теперь у вас будет десятичное значение 10, которое вы можете отобразить.

...