2016-12-09 74 views
0

我正在做一個家庭作業,我必須從文本文件中讀取由\ n分隔的非固定數量的整數,並將它們排列在鏈表(並在數組中,以比較性能)。之後,我必須將排序後的列表寫入另一個文本文件,這就是我的問題所在。我真的不知道系統調用15如何工作(寫入文件)。我不知道它將輸出到文件的輸入類型。我的意思是,我猜他們必須是字符串,而不是整數......所以我做了一個小測試程序,但它不起作用。在這裏它是:如何將int寫入MIPS文件?

.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炭分配足夠的存儲器,以數字100寫入文件「salida.txt」。所以,我將ascii值1,0,0存儲到一個數組(這是分配的內存),然後遞減指針,指向該內存塊的開始。之後,我以寫模式打開文件並寫入緩衝區$ s0的4個字符。 不幸的是,這隻會創建文件,但什麼都不寫。任何幫助,將不勝感激。謝謝。


我也試着寫的。數據聲明的變量,就像這樣:

.data 
hola: .asciiz "hola" 
.text 
la $s3, hola 
... 
# do syscall 15 with move $a1, $s3 

但是這也不能工作。

回答

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