我正在做一个家庭作业,我必须从文本文件中读取由\ n分隔的非固定数量的整数,并将它们排序在链表中(并在数组中,以比较性能)。之后,我必须将排序列表写入另一个文本文件,这就是我的问题所在。我真的不知道系统调用15是如何工作的(写入文件)。我不知道它会打印到文件的输入类型。我的意思是,我猜他们必须是字符串,而不是整数...所以我做了一个小测试程序而且它没有用。这是:
.data
archivo: .asciiz "salida.txt"
.text
# reservar memoria para 3 chars + \0
li $v0, 9
li $a0, 4
syscall
move $s0, $v0
# agregar al array el numero 1 ascii
addi $t0, $zero, 49
sw $t0, 0($s0)
addi $s0, $s0, 4
# agregar al array el numero 0 ascii
addi $t0, $zero, 48
sw $t0, 0($s0)
addi $s0, $s0, 4
# agregar al array el numero 0 ascii
addi $t0, $zero, 48
sw $t0, 0($s0)
addi $s0, $s0, 4
# agregar al array \0 al final
addi $t0, $zero, 0
sw $t0, 0($s0)
addi $s0, $s0, -12
# abrir archivo en modo lectura
li $v0, 13
la $a0, archivo
li $a1, 1
li $a2, 0
move $s1, $v0
syscall
# escribir buffer $s0 en el archivo
li $v0, 15
move $a0, $s1
move $a1, $s0
addi $a2, $zero, 4
syscall
# cerrar archivo
li $v0, 16
move $a0, $s1
syscall
# finalizar ejecucion
li $v0, 17
syscall
我试图为3个字符+ \ 0 char分配足够的内存,以便将数字100写入文件" salida.txt"。因此,我将ascii值1,0,0存储到一个数组(这是分配的内存)中,然后递减指针,指向该内存块的开头。之后,我以写模式打开文件并写入缓冲区$ s0的4个字符。 不幸的是,这只会创建文件,但不会在其中写入任何内容。任何帮助,将不胜感激。感谢。
我还尝试编写一个在.data中声明的变量,如下所示:
.data
hola: .asciiz "hola"
.text
la $s3, hola
...
# do syscall 15 with move $a1, $s3
但这也没有效果。
答案 0 :(得分:1)
事实证明,您需要将数字作为字节存储在要打印的数组中。因此,如果要编写数字,则使用" sb"将其ascii编号存储为字节。我使用了一个我在网上找到的例子并将其修改为我的测试需求。我将一个数字向后存储在一个数组中并将其写入文件。
.data
fout: .asciiz "testout.txt" # filename for output
.text
# allocate memory for 3 chars + \n, no need to worry about \0
li $v0, 9
li $a0, 4 # allocate 4 bytes for 4 chars
syscall
move $s0, $v0
addi $s0, $s0, 3 # point to the end of the buffer
li $t3, 10 # end line with \n
sb $t3, 0($s0)
addi $s0, $s0, -1
# start witing the number 100 backwars. ascii_to_dec(48) = 0, ascii_to_dec(49) = 1
li $t3, 48
sb $t3, 0($s0)
addi $s0, $s0, -1 # move the pointer backwards, meaning you go from the end to the beginning
li $t3, 48
sb $t3, 0($s0)
addi $s0, $s0, -1
li $t3, 49
sb $t3, 0($s0)
# Open (for writing) a file that does not exist
li $v0, 13 # system call for open file
la $a0, fout # output file name
li $a1, 1 # Open for writing (flags are 0: read, 1: write)
li $a2, 0 # mode is ignored
syscall # open a file (file descriptor returned in $v0)
move $s6, $v0 # save the file descriptor
# Write to file just opened
li $v0, 15 # system call for write to file
move $a0, $s6 # file descriptor
move $a1, $s0 # address of buffer from which to write
li $a2, 4 # hardcoded buffer length
syscall # write to file
# Close the file
li $v0, 16 # system call for close file
move $a0, $s6 # file descriptor to close
syscall # close file