

私は最近Cしか扱わないのですがハンドアセンブルとアセンブラを扱ったことがあります。しかし、教科書に沿った内容しか扱いませんでした。  
ふと今原点に帰り1と0の世界ですべてのビット列に対して命令が割り当てられているのか疑問に思いました

もし、割り当てられていなかったとしたら命令割り当てのないビット列を入れて実行したらどのようになってしまうのか今更ながら疑問に思います

扱ったと言ってもこの程度で、熱心に研究された方がいらっしゃれば回答を頂きたいなと思います。


CC BY-SA 3.0
2015-08-06T06:01:59.360
13097
2015-08-06T08:40:47.477
2015-08-06T06:07:31.537
10826
10826
question
言語仕様
命令はすべてのビット列に対して割り当てられているのか


全てに割り当てられているわけではない、と考えるほうが無難でしょう。

未割り当てのコードを実行した場合の動作については、3つに分類して良いかと思います。

  1. なにも起こらない (NOP相当、割り込みが発生するケースもこちらに入れて良いかも)
  2. ハングする (意図しない内部状態になり、誤動作するケースを含む)
  3. 隠し機能が実行される (厳密に言うと、公開されているドキュメントがないだけで、割り当てられてはいる)

実際に何が起こるかはCPUの種類や、場合によってはバージョンによっても異なってくるので、一概には言えないでしょう。

なお、未割当のコードを実行すると何が起こるかについては、[コンピュータシステムの理論と実装――モダンなコンピュータの作り方](http://www.oreilly.co.jp/books/9784873117126/)
のような本などで、CPUがコードを物理/電気的にどのように実行しているかを具体的に知ることで、おおよそのイメージが掴めるかと思います。

(以上は、熱心に研究したというわけではありませんが、経験と知識から考察した回答です)


CC BY-SA 3.0
2015-08-06T06:24:12.953
13099
2015-08-06T06:24:12.953
208
13097
answer


一例として RX マイコンを挙げてみると  
JTAG デバッガで「データ」領域を故意に逆アセンブルすると、メモリバイトの特定の値に対しては  
逆アセンブラが翻訳不可能、つまり対応する命令が無いと表示してくれます。すなわち、  
全てのビットパターンに対して命令を割り振っているわけではないということです。

ものすごく乱暴な言い方すると（表現として適切でないことは百も承知で）  
\- RX マイコンの命令は９０種類です  
\- H8/S マイコンの命令は６９種類です  
\- SH2 マイコンの命令は６２種類です  
\- １バイトの値は２５６種類です  
から、命令を割り振られていない値というのはあって当然です。

また RX では「未定義命令」を実行しようとすると「未定義命令例外」が発生します。  
例外はデバッガで捕らえることができるのでバグっていることがすぐにわかるようになっています。

んで、この辺の「仕様」はマイコンごとに違います。  
必要なら当該マイコンの仕様書を読み解いてください。


CC BY-SA 3.0
2015-08-06T07:18:29.450
13101
2015-08-06T07:18:29.450
8589
13097
answer


当然ながらCPU依存な話題ではありますが、仮に全てのビット列に命令が割り当てられていたとすると、それ以降、そのCPUに命令拡張を行う機会はないということになります。

例えばIntelプロセッサーの場合、[SSE; Streaming SIMD
Extensions](https://ja.wikipedia.org/wiki/Streaming_SIMD_Extensions)命令は追加され続けているのが現実です。更には`UD2`命令なんかも用意されています。これは今後命令拡張したとしても無効なオペコード例外が発生することが保証されているオペコードです。


CC BY-SA 3.0
2015-08-06T08:40:47.477
13105
2015-08-06T08:40:47.477
4236
13097
answer