2016-05-30 1 views
1

Ich habe den folgenden Code in MIPS, dass ich es im Mars-Simulator ausführen Der Code öffnen eine Textdatei zum Schreiben Das Problem mit dem Ergebnis es halten alle Strings drucken, die ich, ohne eine neue Zeile i von der Schnur neue Linie zu trennen versucht, den Druck in Mein Code liefern sie nicht Satzspiegel statt neue Linie meinen Code Hier halten funktioniertenWie kann ich eine neue Zeile zu einer Textdatei in Mips drucken drucken Sie einfach ein Leerzeichen

.data 

fout: .asciiz "testout.txt"  # filename for output 
buffer: .asciiz "The quick brown fox jumps over the lazy dog." 
buffer1: .asciiz "\n" 
.text 
.globl main 
main: 

    ###############################################################  
    # 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  # modeA 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  
    la $a1, buffer # address of buffer from which to write  
    li $a2, 46  # hardcoded buffer length  
    syscall   # write to file  

    ###############################################################  
    # Write to file just opened  
    li $v0, 15  # system call for write to file  
    move $a0, $s6  # file descriptor  
    la $a1, buffer1 # address of buffer from which to write  
    li $a2, 1  # hardcoded buffer length  
    syscall   # write to file  

    ###############################################################  
    # Write to file just opened 
    li $v0, 15  # system call for write to file  
    move $a0, $s6  # file descriptor 
    la $a1, buffer # address of buffer from which to write  
    li $a2, 44  # 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  
    li $v0,10 
    syscall 

Antwort

0

Dein Basiscode war ziemlich korrekt. Und gut kommentiert! Gut gemacht.

Das Hauptproblem war, dass Sie die Stringlängen fest verdrahteten.

Im ersten syscall für buffer war die Länge 46 [zu hoch] und die Datei bekam ein EOS-Zeichen auf der Leitung. Dort war ein Newline-Ausgang danach. Im zweiten Syscall für buffer war die Länge 44 [zu niedrig] und die Dateizeile wurde gehackt. Es gab keine Newline-Ausgabe danach, weil Sie einen Syscall für einen nicht gemacht haben.

So ist die einfache Lösung wäre nur manuell die Längen einstellen, aber ich würde einen strlen Ansatz zur Ausgabe von Textstrings empfehlen, genau wie Sie in C tun würden

ich geändert Ihren Code füge eine fputs Funktion, die die strlen als interne Schleife hat [verzeihen Sie bitte die unentgeltlichen Stil Bereinigungs]:

.data 

fout:  .asciiz  "testout.txt" # filename for output 
buffer:  .asciiz  "The quick brown fox jumps over the lazy dog." 
nl:   .asciiz  "\n" 

    .text 
    .globl main 

main: 

    ############################################################### 
    # 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     # modeA is ignored 
    syscall       # open a file (file descriptor returned in $v0) 
    move $s6,$v0     # save the file descriptor 

    ############################################################### 
    # Write to file just opened 

    # output string the first time 
    la  $a1,buffer 
    jal  fputs 

    # output newline 
    la  $a1,nl 
    jal  fputs 

    # output string the second time 
    la  $a1,buffer 
    jal  fputs 

    # output newline 
    la  $a1,nl 
    jal  fputs 

    ############################################################### 
    # Close the file 
    li  $v0,16     # system call for close file 
    move $a0,$s6     # file descriptor to close 
    syscall       # close 

    li  $v0,10 
    syscall 

# fputs -- output string to file 
# 
# arguments: 
# a1 -- buffer address 
# s6 -- file descriptor 
# 
# registers: 
# t0 -- current buffer char 
# a2 -- buffer length 
fputs: 
    move $a2,$a1     # get buffer address 

fputs_loop: 
    lb  $t0,0($a2)    # get next character -- is it EOS? 
    addiu $a2,$a2,1    # pre-increment pointer 
    bnez $t0,fputs_loop   # no, loop 

    subu $a2,$a2,$a1    # get strlen + 1 
    subiu $a2,$a2,1    # compensate for pre-increment 

    move $a0,$s6     # get file descriptor 
    li  $v0,15     # syscall for write to file 
    syscall 

    jr  $ra      # return 

UPDATE:

Ich verwendete Ihren Code mars noch existiert es keine neue Zeile gedruckt werden soll. mars ignoriert die neue Zeile und behandelt sie als Nullwert.

Ich bin mir nicht sicher, was passiert an Ihrem Ende. Ich hatte dies in mars getestet und der Code ist korrekt. Hier ist der Hex-Dump von testout.txt [die ich überprüft hatte vor der Veröffentlichung]:

00000000: 54686520 71756963 6B206272 6F776E20 The quick brown 
00000010: 666F7820 6A756D70 73206F76 65722074 fox jumps over t 
00000020: 6865206C 617A7920 646F672E 0A546865 he lazy dog..The 
00000030: 20717569 636B2062 726F776E 20666F78 quick brown fox 
00000040: 206A756D 7073206F 76657220 74686520 jumps over the 
00000050: 6C617A79 20646F67 2E0A    lazy dog.. 

dagegen der Hex-Dump für Ihren ursprünglichen Code war:

00000000: 54686520 71756963 6B206272 6F776E20 The quick brown 
00000010: 666F7820 6A756D70 73206F76 65722074 fox jumps over t 
00000020: 6865206C 617A7920 646F672E 000A0A54 he lazy dog....T 
00000030: 68652071 7569636B 2062726F 776E2066 he quick brown f 
00000040: 6F78206A 756D7073 206F7665 72207468 ox jumps over th 
00000050: 65206C61 7A792064 6F672E    e lazy dog. 

Das einzige, was ich daran denken kann, macht vielleicht einen Unterschied ist das Betriebssystem. Ich benutze Linux. Was ist dein Betriebssystem? Windows? Wenn ja, müssen die nl könnte sein:

nl: .asciiz "\r\n" 

Alle anderen OSes sollte in Ordnung sein.

+0

Ich benutzte Ihren Code mars existiert immer noch gibt es keine neue Zeile zu drucken – hani94

+0

mars ignoriert die neue Zeile und behandelt es als Nullwert – hani94

+0

Das Problem war, weil das Betriebssystem ich Windows verwende und Sie sollten \ r vor \ setzen n danke für Ihre Hilfe – hani94

Verwandte Themen