la lecture du nom de fichier à partir de la saisie de l'utilisateur en MIPS de l'assemblée
Je suis en train d'écrire un code assembleur MIPS qui va demander à l'utilisateur pour le nom de fichier et il va produire des données statistiques sur le contenu du fichier.
Cependant, quand j'ai coder en dur le nom du fichier dans une variable dès le début, il fonctionne très bien, mais quand je demande à l'utilisateur de saisir le nom de fichier ne fonctionne pas.
après un peu de débogage, j'ai découvert que le programme ajoute 0x00 char et 0x0a char (à vérifier asciitable.com à la fin de la saisie de l'utilisateur dans la mémoire et c'est pourquoi il n'ouvre pas le fichier basé sur la saisie de l'utilisateur.
quelqu'un a une idée sur la façon de se débarrasser de l'excès de chars, ou comment ouvrir le fichier après l'obtention de son nom de l'utilisateur??
voici mon code complet (il fonctionne très bien, sauf pour le nom de fichier de l'utilisateur de chose, et n'importe qui est libre de l'utiliser pour n'importe quel but, il/elle veut):
.data
fin: .ascii "" # filename for input
msg0: .asciiz "aaaa"
msg1: .asciiz "Please enter the input file name:"
msg2: .asciiz "Number of Uppercase Char: "
msg3: .asciiz "Number of Lowercase Char: "
msg4: .asciiz "Number of Decimal Char: "
msg5: .asciiz "Number of Words: "
nline: .asciiz "\n"
buffer: .asciiz ""
.text
#-----------------------
li $v0, 4
la $a0, msg1
syscall
li $v0, 8
la $a0, fin
li $a1, 21
syscall
jal fileRead #read from file
move $s1, $v0 #$t0 = total number of bytes
li $t0, 0 # Loop counter
li $t1, 0 # Uppercase counter
li $t2, 0 # Lowercase counter
li $t3, 0 # Decimal counter
li $t4, 0 # Words counter
loop:
bge $t0, $s1, end #if end of file reached OR if there is an error in the file
lb $t5, buffer($t0) #load next byte from file
jal checkUpper #check for upper case
jal checkLower #check for lower case
jal checkDecimal #check for decimal
jal checkWord #check for words
addi $t0, $t0, 1 #increment loop counter
j loop
end:
jal output
jal fileClose
li $v0, 10
syscall
fileRead:
# Open file for reading
li $v0, 13 # system call for open file
la $a0, fin # input file name
li $a1, 0 # flag for reading
li $a2, 0 # mode is ignored
syscall # open a file
move $s0, $v0 # save the file descriptor
# reading from file just opened
li $v0, 14 # system call for reading from file
move $a0, $s0 # file descriptor
la $a1, buffer # address of buffer from which to read
li $a2, 100000 # hardcoded buffer length
syscall # read from file
jr $ra
output:
li $v0, 4
la $a0, msg2
syscall
li $v0, 1
move $a0, $t1
syscall
li $v0, 4
la $a0, nline
syscall
li $v0, 4
la $a0, msg3
syscall
li $v0, 1
move $a0, $t2
syscall
li $v0, 4
la $a0, nline
syscall
li $v0, 4
la $a0, msg4
syscall
li $v0, 1
move $a0, $t3
syscall
li $v0, 4
la $a0, nline
syscall
li $v0, 4
la $a0, msg5
syscall
addi $t4, $t4, 1
li $v0, 1
move $a0, $t4
syscall
jr $ra
checkUpper:
blt $t5, 0x41, L1 #branch if less than 'A'
bgt $t5, 0x5a, L1 #branch if greater than 'Z'
addi $t1, $t1, 1 #increment Uppercase counter
L1:
jr $ra
checkLower:
blt $t5, 0x61, L2 #branch if less than 'a'
bgt $t5, 0x7a, L2 #branch if greater than 'z'
addi $t2, $t2, 1 #increment Lowercase counter
L2:
jr $ra
checkDecimal:
blt $t5, 0x30, L3 #branch if less than '0'
bgt $t5, 0x39, L3 #branch if greater than '9'
addi $t3, $t3, 1 #increment Decimal counter
L3:
jr $ra
checkWord:
bne $t5, 0x20, L4 #branch if 'space'
addi $t4, $t4, 1 #increment words counter
L4:
jr $ra
fileClose:
# Close the file
li $v0, 16 # system call for close file
move $a0, $s0 # file descriptor to close
syscall # close file
jr $ra
Note: je suis en utilisant MARS Simulateur, si cela a un différent
Mise à jour:
J'ai résolu le problème en écrivant et en appelant la procédure suivante:
nameClean:
li $t0, 0 #loop counter
li $t1, 21 #loop end
clean:
beq $t0, $t1, L5
lb $t3, fin($t0)
bne $t3, 0x0a, L6
sb $zero, fin($t0)
L6:
addi $t0, $t0, 1
j clean
L5:
jr $ra
OriginalL'auteur Hassan Al-Jeshi | 2010-04-04
Vous devez vous connecter pour publier un commentaire.
Caractère 10 (0xa) est le code Ascii pour le saut de ligne, dont beaucoup de *nix utilisation de systèmes d'exploitation pour terminateur de ligne. Il ne devrait pas faire partie du nom de fichier. Juste la bande. En outre, ces systèmes d'exploitation, utilisez 0 pour un terminateur de chaîne. Il devrait être à la fin du nom de fichier, à moins que l'appel d'offres ouvert prend un nombre de caractères paramètre.
La solution est de prendre de l'utilisateur de répondre, trouver de caractère de 10 et de le remplacer avec de zéro. Utiliser le résultat comme le nom de fichier à ouvrir.
OriginalL'auteur wallyk