2016-05-30 11 views
1

MIPSの次のコードをmarsシミュレータで実行しています コードを書き込み用にテキストファイルを開きます 結果に問題がありますそれはここに私のコードはmipsのテキストファイルに新しい行を印刷するだけで、空白が印刷されます

.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 

答えて

0

ある 代わりに新しい行のそれは、印刷スペースを保っ動作しませんでした私は、文字列から新しい行を分離しようとした任意の新しい行を印刷せずに、私は 私のコードで提供するすべての文字列を印刷しておきますあなたのベースコードはかなり正確でした。とよくコメント!よくやった。

主な問題は、文字列の長さをハードワイヤリングしていたことでした。

bufferの最初のシステムでは、長さは46 [高すぎる]で、ファイルの行にEOS文字があります。そこにであり、その後に改行が出力されました。

bufferの2番目のシステムでは、長さは44 [低すぎる]であり、ファイル行が細断されました。 の改行は、あなたが1つのためにsyscallをしなかったので、その後にありました。

ので、簡単な修正は、単に手動で長さを調整することであろうが、私はあなたがC.

にやるだろうと同じように、テキスト文字列の出力にstrlenアプローチをお勧めします私はにあなたのコードを修正しました内部ループとしてstrlenを持ってfputs機能を追加[ご容赦ください無償スタイルのクリーンアップ]:

.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:

あなたのコードマーズを使用しましたが、印刷する新しい行はありません。火星は新しい行を無視し、それをヌル値として扱います。

私はあなたの最後に何が起こっているのか分かりません。私はmarsでこれをテストし、コードは正しいです。

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.. 

対照的に、元のコードの進ダンプをした:ここでは、[私は投稿する前に確認していた]をtestout.txtの進ダンプがある

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. 

私はそのことを考えることができる唯一のこと違いはOSかもしれない。私はLinuxを使用しています。あなたのOSは何ですか? Windows?もしそうなら、nlがする必要があるかもしれません:

nl: .asciiz "\r\n" 

他のすべてのOSは問題ないはずです。

+0

コードマーズを使用していますが、印刷する新しい行がありません – hani94

+0

火星は新しい行を無視してnull値として扱います – hani94

+0

OSは私がウィンドウを使用しているので、 n 助けてくれてありがとう – hani94

関連する問題