検証のために内容を印刷した後にブレークポイントを設定し、アドレスbuffer
を指すようにメモリビューを開くと、ファイルの内容がテキストを形成するためにASCIIエンコードされた連続バイト値として読み取られます。
だから、実際のバイト値は以下のとおりです。
buffer: .byte 48, 48, 49, 49, 49, ... , 48, 49, <EOL>, 48, 48, ...`
<EOL>
はライン(MIPS上おそらく
13
、多分ちょうど
10
または両方)の終わりがある
、および48
ASCII文字の値が'0'
と49
がの値であり、 ASCII文字'1'
。
一部のヘキサビューアで "bincode1.txt"ファイルの内容を表示すると、同じバイトが表示されます。
32ビットのASCII文字を1つの32b値に変換するには、32バイトをループしなければなりません。文字の読み取りに応じて1ビットを0/1に設定する必要があります('0' (48)
/'1' (49)
、 1桁、簡単にするために、and char,1
を実行して、任意のバイトから0/1ビットを取得し、桁数字以外のものを無視し、間違ったファイルを無視する)、これらのビットを一緒にマージします。
一緒にビットをマージする最も簡単な方法は、buffer
から次の文字を読んだ後、あなたが最初の1 sll $t0, $t0, 1
左に、そのすべてのビットをシフトして、最下位を設定し、ループt0 = 0
のゼロ先にいくつかの一時レジスタを設定することがIMOであります(ビットOR
が役に立つかもしれません。そのあとand char,1
はcharから一番小さい(最も右の)ビットだけを抽出します)。これを32回ループすれば、t0
には32bの数字があります(左にシフトすると、最初の文字の読みは左端のビットで終了します)。
これで数値の値として印刷して、変換結果が正しい結果をもたらすことを確認できます。
ヒント:入力データと出力データを視覚化し、それらのビットがどのように関連しているかをデバッガで少し再生して、メモリとレジスタの値を表示する方法を確認します(おそらく、 ASCIIデータをチェックするときに別々のバイトを見るのが普通ですが、例えば、word
のように4バイトを1つの値にグループ化すると、サイズの大きい数字を表示する方が良い)など、さまざまな状況で特定の値を簡単にチェックすることができます。次に、予想される出力を計算するために入力データをどのように扱うのか想像し、そのアルゴリズムを記述してください。
私のコードでは、最初の行の上の.data部分をコピーするのを忘れていました。それもそこにあるはずです。 – Jonathan
あなたの質問を編集して修正したり、タグの下で "編集"を探すことができます。**それが答えられた後に、単にコード/質問**を変更しないでください。その時点で、正誤表または追加情報を含む段落を追加するだけで、元の質問にはまだ関連しています。あなたが何か答えを得る前に、あなたが望むだけあなたの質問を改善してください。既に妥当に見えますが、使用する環境(アセンブラ、デバッガ、コマンドライン構築の実行方法など)を同じ情報に追加して、同じenvを持つ人が同じ問題にコピー/ペースト+を実行できるようにしてください。 – Ped7g