如何通过程序集使用用户输入创建文件
How to create a file using user input with assembly
我正在尝试使用程序集在文件中记录用户输入。
我正在使用此代码,但在创建文件时,输入未正确记录在文件中。有人可以帮我吗?这是我的代码:
.data
file1: .asciiz "file1.txt"
prompt: .asciiz "User entry\n"
buffer: .space 45
.text
la $a0,prompt
li $v0,4
syscall
li $v0, 8
li $a1, 454
syscall
move $s1, $v0
j writeFile1
writeFile1:
li $v0, 13
la $a0, file1
li $a1, 1
li $a2, 0
syscall
move $s6, $v0
#write
li $v0, 15
move $a0, $s6
la $a1, buffer
li $a2, 45
syscall
#close
li $v0, 16
move $a0, $s6
syscall
j exit
exit: li $v0, 10
syscall
您的用户输入调用没有设置指向buffer
的指针。因此,它会改为读入 prompt
。此外,给定的长度是 454
而不是 [预期的] 45
。此外,此系统调用 而不是 return 长度,因此保存 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
我正在尝试使用程序集在文件中记录用户输入。
我正在使用此代码,但在创建文件时,输入未正确记录在文件中。有人可以帮我吗?这是我的代码:
.data
file1: .asciiz "file1.txt"
prompt: .asciiz "User entry\n"
buffer: .space 45
.text
la $a0,prompt
li $v0,4
syscall
li $v0, 8
li $a1, 454
syscall
move $s1, $v0
j writeFile1
writeFile1:
li $v0, 13
la $a0, file1
li $a1, 1
li $a2, 0
syscall
move $s6, $v0
#write
li $v0, 15
move $a0, $s6
la $a1, buffer
li $a2, 45
syscall
#close
li $v0, 16
move $a0, $s6
syscall
j exit
exit: li $v0, 10
syscall
您的用户输入调用没有设置指向buffer
的指针。因此,它会改为读入 prompt
。此外,给定的长度是 454
而不是 [预期的] 45
。此外,此系统调用 而不是 return 长度,因此保存 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