Mips Assembler: Warum wird meine eingelesene Datei nicht vollständig ausgegeben?

InfDude

Cadet 4th Year
Registriert
Apr. 2016
Beiträge
95
Hi, habe eine Funktion in Mips Assembler geschrieben die eine Datei einliest und in der Konsole ausgibt. Allerdings wird die letzte Zeile in der Datei immer doppelt ausgegeben, wobei die "zweite letzte" Zeile nicht einmal vollständig ist. Je nachdem wie ich den Buffer ändere wird mehr vom Ende der Datei abgeschnitten, ich finde den Fehler nicht..

Ich hoffe wirklich hier finden sich welche die Assembler programmieren können und mir helfen... ich bin seit ewigen Stunden am suchen und finde nichts, bin echt am verzweifeln.. hier der Code:


HTML:
.data
file:   .asciiz "file"
buffer: .space  4096

.text
main:



# READ FILE
li $v0, 13
la $a0, file
li $a1, 0
li $a2, 0
syscall

# SAVE FD
move $t1, $v0

# READ TO BUFFER
li $v0, 14
move $a0, $t1
la $a1, buffer
li $a2, 4096
syscall

move $t0, $v0

# PRINT TEXT
li $v0, 4
move $a0, $a1
syscall

# CLOSE FILE
li $v0, 16
move $a0, $t1 # fd
syscall

li $v0, 10
syscall
move $v0, $t0
 
Zunächst einmal: Ich kenne den MIPS-Assembler nicht, aber laut meiner Google-Suche erwartet der System-Call zur Stringausgabe einen nullterminierten String. Dies wird bei dir nicht der Fall sein. Deshalb wird dir ein String bis zum ersten Auftreten eines Nullbytes ausgegeben. Die Zeichen, die nach dem Inhalt der Datei ausgegeben werden, sind also mehr oder weniger zufällig. Du liest auch nicht die Datei ein, sondern nur die ersten 4096 Zeichen einer Datei. Ist die Datei kürzer, sollte der Systemcall, der das macht, eigentlich die Anzahl der wirklich gelesenen Zeichen zurückgeben. Da musst du mal in die Dokumentation schauen, wo der das zurückgibt. Dann solltest du an die entsprechende Stelle in deinen Puffer ein Nullbyte schreiben. Deshalb sollte dein buffer auch um ein Byte grösser sein (4097) als die maximal gelesenen Zeichen (4096), damit im ungünstigsten Fall (Datei hat genau 4096 Zeichen oder mehr) noch Platz für das Nullbyte ist. Sollte die Datei allerdings beliebige binäre Daten enthalten, kommst du mit der Ausgabe nicht weit, sondern nur bis zum ersten auftretenden Nullbyte. Davor kann aber Müll ausgegeben werden.
 
Ah vielen Dank, hat tatsächlich geklappt. Hätte ich drauf kommen können :rolleyes:
Danke Danke Danke!
 
Zurück
Oben