В строке ввода в MIPS пропускаются первые четыре символа, которые вводятся - PullRequest
0 голосов
/ 21 февраля 2020
.data
EntryReq:
    .asciiz "Please enter an 8 digit hexadecimal MIPS instruction: \n"
InputLongError:
    .asciiz "\nYour input was too long, make sure it is 8 digits. "
InputShortError:
    .asciiz "\nYour input was too short, make sure it is 8 digits. "
CharInvalidError:
    .asciiz "\nYour input contains an invalid character. "
ValidChars:
    .asciiz "0123456789abcdef\n\b\0"

.align 4
input:
    .space 20

.text

main:
    #Print input request
    la $a0, EntryReq #loads input into arg. reg.
    li $v0, 4 #op code for print string
    syscall

    #take input for input (stored)
    li $v0, 8 #op code for take user input
    la $a0, input #provide address for syscall
        li $a1, 20 # tell syscall the byte space required for the string
    syscall

    #move to input(stored)
    sw $v0, input #move inputted into from $v0 to input(stored)

    #check validity of input
    la $a0, input #load address of input to arg. reg. for method call
    la $a1, ValidChars #load address of string of valid chars
    jal verifyInput #call the verifyInput method which does as expected 

    #test if string length count works
    addi $a0, $v0, 0 #load from $v0 to arg. reg.
    li $v0, 1 #op code for print int
    syscall

terminate:
    li $v0, 10
    syscall

verifyInput:
    li $v0, -1 #start length count at 0
verifyLoop:
    lb $t0, ($a0) #load current 
    li $a2, 0 #loop for char check, loops up to length of validChar string
    la $a1, ValidChars
    j checkChar
charVerified: #ignore this, is entry point back into verifyLoop for checkChar
    addi $a0, $a0, 1 #increment 
    addi $v0, $v0, 1
    bgt $v0, 8, printTooLongError #if result bigger than 8, error
    bne $t0, 10, verifyLoop #10 is string end, so check if string is end
    blt $v0, 8, printTooShortError #if result less than 8, error
    jr $ra #if here string input was confirmed okay

checkChar: # loops through valid chars for each char in $a0                 | Valid Chars: 0123456789abcdef\n |
    lb $t1, ($a1) #loads in byte from char string
    addi $a1, $a1, 1 #increment address, for the next char
    addi $a2, $a2, 1 #increment until length of valid char string is reached
    beq $t0, $t1, charVerified
    bne $a2, 19, checkChar #if length of valid chars changes, change second argument here
    j charNotValidError
charNotValidError:
    la $a0, CharInvalidError #loads input into arg. reg.
    li $v0, 4 #op code for print string
    syscall
    j terminate
printTooLongError:
    la $a0, InputLongError #loads input into arg. reg.
    li $v0, 4 #op code for print string
    syscall
    j terminate
printTooShortError:
    la $a0, InputShortError #loads input into arg. reg.
    li $v0, 4 #op code for print string
    syscall
    j terminate

Общая суть этого кода заключается в том, что пользователь должен ввести шестнадцатеричную строку 8 di git, а затем программа проверяет, является ли она допустимой шестнадцатеричной строкой (то есть включает только 0-9 и af). Однако всякий раз, когда я запускаю его, в вводимой строке отсутствуют первые четыре символа. Поэтому, если я помещу недопустимые символы в первые четыре цифры, например wwww1abc, то код будет работать нормально, чего не должно быть. Но если я сделаю 1abcwwww, он выдаст ошибку недопустимого символа, что и должно произойти. Я искренне не понимаю, почему это так, и я не видел, чтобы кто-то еще сталкивался с этой проблемой. Любая помощь с благодарностью.

1 Ответ

1 голос
/ 21 февраля 2020

Проблема в следующей строке:

#move to input(stored)
sw $v0, input #move inputted into from $v0 to input(stored)

В отличие от read integer системного вызова, read string помещает результат во входной буфер, в вашем случае input. Таким образом, вам не нужно считывать значение в $v0 и, сохраняя его в input, вы перезаписываете первые 4 байта буфера значением $v0, которое по-прежнему равно 0x00000008, что Удобно то же самое, что и строка "\ b \ 0 \ 0 \ 0" для машин с прямым порядком байтов, которые находятся в вашем списке достоверности. Удаление этой строки должно исправить вашу программу (хотя я не просматривал весь остальной код на наличие ошибок).

...