MIPS では、ワード境界に整列していないアドレスからワードをロードすることはできません。それがCPUの限界です。
あなたの場合、t5のアドレスは整列されていません-list
整列されていますが、それに3を追加します。その3が何のためにあるのかわかりません。バイトごとに処理したい場合は、次のことができます。しかし、その後は使用しないでくださいlw
。とにかく、それは非常に最適ではありません。
バイナリ表現を書き出す場合は、ワードをロードし、list
シフトおよび AND 演算を使用してビットを 1 つずつ抽出します。
編集: コンパイルされたコードで数値の 16 進表現が存続すると仮定するのは誤りです。コンパイルされたコードでは、取得できるのはバイナリだけです。でワードをロードするlist
と、値 0x12345678 (16 進数) の整数がレジスタに取得されます。これは、305419896 (10 進数) または 10010001101000101011001111000 (2 進数) と同じです。
とにかく、当面のタスクはバイナリ文字列を作成することです。割り当ては、出力に先行ゼロを含めるかどうかをカバーする必要があります。先行ゼロは問題ないと仮定しましょう。これにより、ロジックが簡単になります。
整数は、一連のビットとして内部的に格納されます。各ビットを左から右に取り、それを ASCII 数字 (「0」または「1」) に変換します。
数値から単一のビットを取得するには、このビットのみを含む定数 (別名マスク) を使用してビットごとの AND 演算を実行する必要があります。つまり、0 番目のビットを確認するには 1 と AND し、31 番目のビットを確認するには 0x80000000 と AND します。演算の結果が 0 の場合、ビットは最初からゼロでした。結果がゼロ以外の場合 (実際、マスク自体と等しい場合)、ビットは 1 でした。
もう 1 つのヘルパーは、シフト操作です。ビットをループできます。ビットを左から右に綴りたいので、一番左のビットをチェックして左にシフトします。
要約すると、単語をレジスタにロードします。32 回の反復のループを作成します。繰り返しごとに、マスク 0x80000000 のビットの値を確認します。その値に応じて、'0' または '1' を出力配列に書き込みます。
これをさらに詳しく説明する必要がありますか、それともそのようなアルゴリズムを MIPS アセンブリに変換できますか?
re:code を編集します。
ループの反復ごとに変数をロードする必要はありません。ループの前に一度ロードします。あなたがそれをシフトしているので、そうでなければうまくいきません。t2 の初期値は 0x12345678 ですが、ビットを 1 つずつ処理し始めます。値をリロードすると、それが台無しになります。
lb
無意味です。あなたはすでにあなたの言葉を記憶しています。
出力配列への条件付き書き込みはありません。AND を実行しますが、まったく奇妙な方法です。ところで、あなたの AND コマンドでは、t5 の値を台無しにしています。そして、あなたはその AND からフォローアップしません。出力配列にバイトを格納し、そのバイトの値が AND の結果に依存する何らかのロジックが必要です。
そして、あなたはまだ何list
を表しているのか混乱していると思います. メモリ内の配列ではありません。これは 4 バイトで、別名 1 つの 32 ビット ワードです。のバイトをループする必要はありませんlist
。ビットをループする必要があります。
全体の混乱は、変数「リスト」を呼び出すことから始まりました。非常に誤解を招く名前です。変数は何かのコレクションではなく、スカラー、32 ビット整数です。