2016-12-05 3 views
1
00111100000000010001000000000001 
00110100001001000000000000000000 
00100100000000100000000000000100 
00000000000000000000000000001100 
00100100000000100000000000001010 
00000000000000000000000000001100 

このマシンコードでは、最初の行(32)文字を取得してMIPS命令に変換できるようにする必要があります。私は、コードの最初の行を取得してレジスタに格納する方法を理解するのに問題があります。誰にも最初の行を取得する方法についてのアイデアはありますか?私はsllやsrl命令を試すためのヒントを与えられましたが、そうするとコードに変更はありません。指定された文字数をMIPSの文字列から取得する方法は?

ファイルbincode1.txtには、前の6行のマシンコードがあります。私は32でそれをシフトしようとすると私はエラーが発生し、これは間違っていることを知っているが、私はここから何をするか分からない。どんな提案も役に立ちます。

+0

私のコードでは、最初の行の上の.data部分をコピーするのを忘れていました。それもそこにあるはずです。 – Jonathan

+0

あなたの質問を編集して修正したり、タグの下で "編集"を探すことができます。**それが答えられた後に、単にコード/質問**を変更しないでください。その時点で、正誤表または追加情報を含む段落を追加するだけで、元の質問にはまだ関連しています。あなたが何か答えを得る前に、あなたが望むだけあなたの質問を改善してください。既に妥当に見えますが、使用する環境(アセンブラ、デバッガ、コマンドライン構築の実行方法など)を同じ情報に追加して、同じenvを持つ人が同じ問題にコピー/ペースト+を実行できるようにしてください。 – Ped7g

答えて

0

検証のために内容を印刷した後にブレークポイントを設定し、アドレス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つの値にグループ化すると、サイズの大きい数字を表示する方が良い)など、さまざまな状況で特定の値を簡単にチェックすることができます。次に、予想される出力を計算するために入力データをどのように扱うのか想像し、そのアルゴリズムを記述してください。

関連する問題