MIP 파일에서 (부분적으로) 성공적으로 읽을 수있었습니다. 아래는 현재 코드입니다. QtSpim에서 실행할 때 $ a1에서 파일 포인터를 얻지 만 파일의 마지막 몇 문자는 두 번 반복됩니다. 반복되는 문자 수는 파일에 따라 다릅니다. 필자가 보았던 것에서는 개행 문자가 파일의 맨 끝에 있지 않으면 파일의 개행 문자 수에 연결되어있는 것 같습니다 (즉, 5 개의 개행 문자가있는 경우 파일의 마지막 5 문자는 읽은 파일의 끝에서 복제 된 것처럼 보일 것입니다.) 이것이 사실이어야하는 이유는 없습니다.MIPS에서 파일을 읽을 때 마지막 줄 두 번 읽음
.data
fin: .asciiz "c:/input.txt"
fBuffer: .space 1024
.text
main:
jal openFile
jr $ra
#returns: pointer to file's text in $a1
openFile:
li $v0, 13 # system call for open file
la $a0, fin #fin is the file name
li $a1, 0 # 0 means 'read'
li $a2, 0
syscall # open file
move $s6, $v0 # save the file descriptor
#read from file
li $v0, 14 # system call for read from file
move $a0, $s6 # file descriptor
la $a1, fBuffer
li $a2, 1024 # hardcoded buffer length
syscall # read from file
# Close the file
li $v0, 16 # system call for close file
move $a0, $s6 # file descriptor to close
syscall # close file
jr $ra
감사합니다. 이것은 그것을했다. 참고로, 코드의 두 번째 줄은 "li $"가 아닌 "la $ a0, fBuffer"가되어야합니다. 그러나 이는 단순한 오타입니다. 내가 파일의 끝 부분에 null char을 수동으로 추가해야하는 잘못된 것을하고 있습니까? 왜 파일의 끝을 복제할까요? –
@Cruzer 파일 읽기는 괜찮습니다 (1024자를 넘지 않는 한). 인쇄 루틴이 예상 한대로 입력을 문자열로 변환하면됩니다. 'fread'를 사용하여 파일을 읽고'puts'를 사용하여 문자열을 인쇄한다면 C에서 똑같은 작업을해야합니다. syscall이 자신의 버퍼링 바로 뒤에 메모리를 사용하여 완료된 후에 데이터를 남겨두기 때문에 중복이 나타나는 것 같습니다. 당신의 print 문은 버퍼의 끝에서 syscall 영역으로 흘러 갔고, 반복 된 정보는 단지 우연이었습니다. 어떤 쓰레기라도 될 수있었습니다. – Gene