如何在MIPS中将int写入文件?

时间:2016-12-09 01:14:08

标签: list mips system-calls

我正在做一个家庭作业,我必须从文本文件中读取由\ 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

但这也没有效果。

1 个答案:

答案 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