Ваш пользовательский ввод вызов сделал не программу настройки указатель buffer
. Таким образом, он будет читать вместо prompt
. Кроме того, данная длина была 454
вместо [предназначен] 45
. Кроме того, этот syscall делает не возвращает длину, поэтому сохранение v0
ничего не сделало.
После закрепления вышеуказанного программа работает. Но он записывал выходной сигнал фиксированной длины, поэтому в конце были бинарные нули.
Я добавил код для вычисления длины строки (например, strlen
). Я также добавил комментарии к боковой панели в большинстве строк. Я очень рекомендую это для любого asm. Во всяком случае, вот исправленная программа [пожалуйста, помилование бесплатной очистки стилей]:
.data
file1: .asciiz "file1.txt"
prompt: .asciiz "User entry\n"
buffer: .space 46
.eqv BUFMAX 45 # usable buffer length (one less)
.text
# prompt user
la $a0,prompt # prompt string
li $v0,4 # puts syscall number
syscall
# read user string
li $v0,8
la $a0,buffer # FIXME -- this was missing
li $a1,BUFMAX # FIXME -- this was 454
syscall
###move $s1,$v0 # FIXME -- does nothing v0 is not length
###li $s1,BUFMAX # use fixed length
###j writeFile1 # would do write with zeroes in file
# calculate string length (e.g. like strlen)
move $s1,$a0 # point to buffer start
getlen:
lb $t0,0($s1) # get byte -- is it zero?
addi $s1,$s1,1 # advance pointer
bne $t0,$zero,getlen # no, loop
sub $s1,$s1,$a0 # get length from end pointer
subi $s1,$s1,1 # compensate for preincrement
writeFile1:
# open the output file
li $v0,13 # open syscall number
la $a0,file1 # filename
li $a1,1 # open for writing
li $a2,0 # open mode
syscall
move $s6,$v0 # save fildes number
# write
li $v0,15 # write syscall number
move $a0,$s6 # get fildes number
la $a1,buffer # get buffer pointer
move $a2,$s1 # get buffer length
syscall
# close
li $v0,16
move $a0,$s6 # get fildes number
syscall
j exit
exit:
li $v0,10 # exit syscall number
syscall
Определить _ «вход не записан в файл правильно» _. – Michael
, например, когда вход "тест", выход на файле: 4675 6e63 696f 6e6f 7520 6120 6573 6372 6974 6120 6e6f 2041 7271 7569 766f 2032 2e00 0000 0000 0000 0000 0000 00 –
Ну, так вы используете syscall 8, не имеет большого смысла. Обратитесь к [документации] (http://courses.missouristate.edu/KenVollmar/mars/Help/SyscallHelp.html) за правильное использование. – Michael