2016-12-09 3 views
0

텍스트 파일에서 \ n으로 구분 된 고정되지 않은 수의 정수를 읽고 숙제하고 있는데, 링크 된 목록 (및 배열에서 성능을 비교하기 위해)으로 정렬해야합니다. 그 후, 정렬 된 목록을 다른 텍스트 파일에 써야하는데, 이것이 내 문제입니다. 나는 정말로 시스템 콜 15 개가 어떻게 작동 하는지를 모른다 (파일에 써라). 필자는 파일에 어떤 종류의 입력이 인쇄 될지 알지 못합니다. 내 말은, 그들은 정수가 아닌 문자열이어야한다고 생각합니다 ... 그래서 약간의 테스트 프로그램을 만들었고 작동하지 않았습니다. 여기있다 :MIPS에서 int 파일을 작성하는 방법?

.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 

내가 파일 "salida.txt"에 숫자 100를 기록하기 위해, 3 개 문자 + \ 0 문자에 대한 충분한 메모리를 할당하려고 노력했다. 그래서 1, 0, 0의 아스키 값을 배열 (할당 된 메모리)에 저장 한 다음 포인터를 감소시켜 해당 메모리 블록의 시작 부분을 가리 킵니다. 그런 다음 쓰기 모드에서 파일을 열고 버퍼 $ s0의 4자를 씁니다. 불행히도 파일을 만들지 만 아무것도 쓰지 않습니다. 어떤 도움을 주시면 감사하겠습니다. 감사.


나는이 같은 .DATA에서 선언 된 변수를 작성했습니다 :

.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 
관련 문제