2017-04-11 12 views
0

私は4バイトに分割したい32ビット命令を持っています。 レッツは、命令は次のようになります言う:32ビット命令をバイトに分割し、cを使用して結果を別のアドレスに移動

yyyyyzzzzzzxxxxxx????????? 

命令は、4つの符号なし整数型で構成されてい言葉です。 yは操作コードを表し、???は未使用領域を表します。私はビッグエンディアンのマシンで作業しています。

z + wからaに値を移動するとします。

私は以前はCで働いたことがありませんでしたが、私はこれをこのようにしようとしました。ここで

私はちょうどので、私は、各バイトをプリントアウトCA、言葉を読んでどのようにである:ここでは

unsigned int a, b, c, o; 
w = instruction << 24; 
z = instruction << 16; 
x = instruction << 8; 
y = instruction; 

私は結果が何であるかを確認するために、符号なしの値を印刷します。

printf("%u\n", w); 
printf("%u\n", z); 
printf("%u\n", x); 
printf("%u\n", y); 
printf("\n"); 

regs[x] = instruction + instruction << 8; 

私はこの後regs[x]の値をプリントアウトした場合、その後、私は今、値を持っているが、これはそれを行うための正しい方法であることがわかりますか?私がこれを好きになると、レジスタ= z + wを設定しますか?

EDIT 私はこのようなビットを取得する必要がありますか?その後、

  y = (inst >> 24) & 077; 
      x = (inst >> 16) & 0xffff; 
      z = (inst >> 8) & 0xffff; 
      w = (inst) & 0xffff; 

と、次のように行います:あなたが唯一のビット位置を使用したいとカウントした場合は、次のビットとデクリメントを設定すると、すなわち9ビットのビットマスクを構築することができ

regs[y] = z + w; 
+0

"バイト"は一般的に8ビットと見なされるため、32ビットを4バイトに分割して未使用のビットを3つ取得するのは難しいことに注意してください。このような単語を説明するときにも、各文字は通常1ビットを表すべきです。しかし、あなたは23文字しか表示しません(最後に '? 'を含む)、これを解釈するのが難しくなります。 – unwind

+0

@unwind申し訳ありません、はい、私はyyyyyzzzzzzxxxxxx ?????????多分私は何をしなければならなかったのか誤解しました。私は質問に編集しました – user123

答えて

0

(1 < < 10)-1。あなたの値は

#define MASK(n) ((1<<(n+1))-1) 

unsigned int w = instruction & MASK(9); 
unsigned int x = (instruction >> 9) & MASK(6); 
unsigned int z = (instruction >> 15) & MASK(6); 
unsigned int y = (instruction >> 21) & MASK(5); 

です。すべての値が下にシフトしています。ですから、ZおよびZは、6ビットが含まれているため、wは9ビット、または

unsigned int wz = w<<6 | z; 

が含まれているので、あなたが

unsigned int zw = z<<9 | w; 

になりますwを組み合わせることが好きなら。

+0

これは私がそれをやりたかったように見えます、あなたはMASK定義が何をしているのか説明できますか?それは0で拡張されますか?その質問が意味をなすならば、 – user123

+0

マスク(9)は '0b000000000000000000000111111111'の32ビット値を構築します。このマスクを '&'演算で使用すると、maskに1に設定されているすべてのビットの値が得られます。 – Holger

+0

これは理にかなっています!だから、私が16ビットに拡張したいなら、私はMASK(6)を置くことができました、助けてくれてありがとう – user123

関連する問題