2016-04-22 7 views
0

コンテンツ(文字列と浮動小数点数)をファイルに出力したい。私がこれまで実施してきたものだファイルへのMips-プリント

.data: 
    line_break: .asciiz "\n" 
    buffer: .space 1024 
.text: 
main: 
    addi $t0, $zero, -1 
    jal open_file       # open the file to write to 
    beq $v0, $t0, create_file    # if return value -1 --> file not available --> create the file 
    move $s6, $v0       # save the file descriptor 
    [...] 
    ulw $t0, print_initiaton_message  # save the print_initiaton_message in a temp 
    sw $t0, buffer       # put print_initiaton_message on buffer 
    li $v0, 15        # syscall to write to file 
    move $a0, $s6       # move file descriptor to $a0 
    la $a1, buffer       # target to write from 
    li $a2, 1024       # amount to be written 
    syscall         # syscall to write in file 
    [...] 
    s.s $f12, buffer 
    li $v0, 15        # syscall to write to file 
    move $a0, $s3       # move file descriptor to $a0 
    la $a1, buffer       # target to write from 
    li $a2, 4        # amount to be written 
    syscall         # syscall to write in file 
    [...] 

基本的な考え方は、バッファに必要な情報を入れることで、その後、システムコールを実行します。

ファイルが正しく作成されているため、後で開いたり閉じたりするため、動作しているようです。その中のコンテンツもありますが、期待される成果がありません。最初の位置で

’®)@ 

PÀ<@ 

[...] 

は、浮動小数点に続く改行が続く文字列、、があるはずです。

私の質問: - 出力の適切な書式設定を実現するにはどうすればよいですか? - 入力がバッファサイズを超えた場合のバッファサイズとは何ですか? - 書き込む金額は何を意味していますか?

私は(すなわちthis one)いくつかのシステムコールの参照を通過しようとしたが、例(およびfound this、またはthat)を探したが、主な問題は、それらがコードのみを提供し、上記の私の質問をカバーしていないということです。

答えて

0

私は最終的に解決策を見つけた:

私が印刷された1024年の数字/文字列のサイズを設定します。したがって、私のプログラムは、バッファのアドレスから内容を取り出し、ヒープ(またはデータ)セクションから1023文字を追加で出力しました。私は文字列の文字数を数えることでこれを解決しました(これは教育目的のプロジェクトなのでOKです)。サイズを文字数に設定します。 \ nは1バイトです。

私のプログラムで表示される奇妙な文字は、対応する16進数値を表すASCII記号です。私の間違いは、左から右に文字を読まなければならないと仮定することでした。 MIPSは、Big Endian formatを利用しているため、ASCII文字を右から左に読み取らなければなりません。 Hexダンプを作成して、対応する浮動小数点数を計算すると、正しい結果が得られます。

混乱したASCIIベースの出力を避けるには、追加の文字列キャスティングが必要です。考えられるのは、各番号ごとに対応するASCII文字を計算し、結果の値を出力することです。

0

sw $t0, buffer

print_initiaton_messageのアドレスをバッファの最初の32ビットを設定するコードのこの行。私はファイルI/Oシステムコールに慣れていません。しかし、あなたが本当にこれをしたい場合、私は疑問に思う:

li $v0, 15        # syscall to write to file 
move $a0, $s6       # move file descriptor to $a0 
la $a1, print_initiation_message  # target to write from 
li $a2, <actual length of initiation message> 
syscall         # syscall to write in file 
+0

MIPS命令リファレンス([ここで利用可能](http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html))によれば、swは$ t0の内容を指定されたアドレス、バッファ私はpreviosサブプロシージャの出力をバッファに保存して、それを印刷できるようにしたいと思います。 –

+0

バッファの出力はどのデータ型ですか?出力が文字列の場合は、文字列をバッファにコピーする必要があります。出力が単一の整数である場合、最初に整数を文字列としてフォーマットする必要があります。 – Zack

+0

はい、下記の私の答えを参照してください。私は解決策を見つけた –