2011-12-31 4 views
1

高レベルのMIPSアセンブラを作成しています。 fwriteを正しく出力しようとするバットに問題があります。例えば、アセンブリファイルは、次のようになります擬似MIPSアセンブラとfwriteをバイナリエンコーディング用に書く

.text 
    addi $t0,$0,7 
    addi $t1,$0,1 
L1: 
    beq $t0,$0,DONE 
    mult $t1,$t0 
    mflo $t1 
    addi $t0,$t0,-1 
    j L1 
DONE: 
    add $a0,$0,$t1 
    addi $v0,$0,1 
    syscall 
    addi $v0,$0,10 
    syscall 

私のコードは、32ビットのバイナリ命令にこれらを変換し、擬似的なCPUによって読み取られるファイルにそれらをFWRITE必要があります。

ファイルの先頭にある32ビットの区切り文字が0xf0f0f0f0であるバットに問題があります。バイナリファイルを "読む"ことはできませんが、私が持っているサンプルファイルを見れば、区切り文字はfwriteによって書き込まれた後に/ 360/360/360/360で表されます。これはなぜですか、自分のファイルを書いているときにその動作をどのように再現するのでしょうか(他のバイナリファイルを作成するためにfwriteを使うためにはどうすればよいですか?)

答えて

0

あなたの区切りのためのfwrite(3)は、次のようになります。

unsigned int delim = 0xF0F0F0F0; 

fwrite(&delim, sizeof delim, 1, output); 

これは、標準のCストリームoutputdelimの大きさの一つのオブジェクトを書き込みます。

あなたは、バイナリファイルを「読む」ためにod(1)xxd(1)を使用することができます。

$ od -bc /etc/passwd 
0000000 162 157 157 164 072 170 072 060 072 060 072 162 157 157 164 072 
      r o o t : x : 0 : 0 : r o o t : 
$ xxd /etc/passwd 
0000000: 726f 6f74 3a78 3a30 3a30 3a72 6f6f 743a root:x:0:0:root: 
0000010: 2f72 6f6f 743a 2f62 696e 2f62 6173 680a /root:/bin/bash. 

Ubuntuの上hexerパッケージ中(hexer(1)プログラムは、()たくさんのインタラクティブxxd(1)のようなものです、あなたは、いくつかのそれが役に立つかもしれません

+0

fwriteはint値ではなく、最初の引数として配列へのポインタをとります。 – mathjacks

+0

@flapjackery:デリミタの代わりに&delimを使用します。 – BlackBear

+0

男、私は愚かです。 :) – sarnold