LoginSignup
74

More than 3 years have passed since last update.

CPUの珍命令

Last updated at Posted at 2020-07-14

EDIT: はてなブックマークのエントリ だと ABCD (BCD加算) や DJNZ (ループ命令) が人気なようだ(Wikipediaしばりなもんで...) 。6502によくある JSR / RET が対応しないコーディングや、Z80で PUSH を目的外利用するような例は入れても良かったのかも。 DOOMの例を追加。


Wikipediaに個別ページができちゃうくらい有名な命令のメモ。

きっかけ

を受けて、

実際にはHCFやNOPくらいはページはあるだろうと思ったけど、 Wikipediaにページがあるほど有名な命令 ってのは中々珍しい命令と言えるのかもしれない。

フフフ...Sign EXtend!

最初のツイートで挙げられている SEX (Sign EXtention) 命令は6809等に見られる命令で、この手の話をするときに99割話題に出ると言える。もちろんCPUは文字列を処理するのではないので、仕様書とかアセンブラでこの命令が何と呼ばれているかが全てになるが、

コメント 2020-07-14 195027.png

実際に載っている。

Wikipediaの他の用法も興味深い。エンディアンネスをアーキテクチャの性別(sex)とする表現が過去に存在したらしい。同性でないと情報交換に適さないというのは少々直感に反するかもしれない。

EIEIO

eieio はPowerPCのバリア命令の一種で、アーキテクチャ文書では sync と並んで解説されている。この命令はPowerPCの命令解説である PowerPC Virtual Environment Architecture Book II には39回も登場する。そんな大事な命令をギャグみたいな命名して良いのか。。

単純に大文字で書くとerrnoっぽいと思った思った人も多いかもしれないが、 GNU HurdにはマジでEIEIOというerrnoが存在する

CPUID

やっとまともな命令だ! CPUID 命令はIA-32系のプロセサでCPU種別等をレジスタに格納させるために使用する。この命令はプログラムに対して利用可能なCPU拡張命令を通知するのに使用されるため、仮想化が可能であったりとかなり厚遇されている。(Wikipediaの記事もかなり長い)

... まともじゃない用法としては、 CPUID 命令はシリアライズ命令とされているため、Out-Of-Order動作をするCPUのパフォーマンス測定のために推奨されている時期が存在した。当然そのような方法では正確にはならないので、専用の命令 RDTSCP が導入されている。

ちなみに RDTSC の方はTime Stamp Counter( https://en.wikipedia.org/?title=RDTSC&redirect=no )のリダイレクトとなっている。

HCF(自爆命令)

HCF(Hold Halt-and-Catch-Fire)は、実行するとプロセッサが(リセットしない限り)復帰不可能な形で停止する未公開命令で、6800で特にそう呼ばれたとされる。特に6502では12のHCF命令が知られている。

Wikipediaの記事では他のCPU事例についても触れていて興味深い。また、この記事からはx86の(正当な)命令である HLT の記事( https://en.wikipedia.org/wiki/HLT_(x86_instruction) )へのリンクがある。

NOP

HCFと同様に何もしない命令ではあるがより一般的に、かつ、安全に何もしない命令としては NOP がある。Wikipediaのページにあるように、大抵のプロセッサでは NOP という名前で呼んでいるが、MMIX(クヌースによる命令セット)では SWYM http://mmix.cs.hm.edu/doc/instructions/swym.html と呼んでいる。

x86の NOP0x90 に割り当てられていて、これは本来 xchg ax,ax (axレジスタと ax レジスタを交換する)命令、つまり "事実上"何もしないだけ の命令であった。これがAMD64では(本来の xchg 挙動だと部分レジスタアクセスになるなど都合が悪いので)本当に何もしない命令として再定義され元の xchg の意味が失われている。

さらに、パディングに使う等の目的で、 NOP合計9種類も 定義している:

コメント 2020-07-14 221427.png

元々 xchg で実現されていたように、結果的に何もしない命令というのはいくらでも考えられるが、CPU内部の予測機構にやさしいバリエーションを定義しておくことには意味があると言える。

x86の正当/未公開な命令

... もっとも、Wikipediaにはx86の命令というカテゴリ https://en.wikipedia.org/wiki/Category:X86_instructions が存在する。

個人的なお気に入りは LOADALL 命令( https://en.wikipedia.org/wiki/LOADALL )で、この未公開命令は本来内部ステートである特殊レジスタ類も含めてまるごとメモリから読み取らせることができる。 超あぶねぇ。 この命令は286/386時代に HIMEM.SYS EMM386のような特殊なメモリ/CPUコンテキスト処理が必要なシチュエーションで使われた。

みんな水をあんまり特殊な物質だとは思っていないのと同じように、x86の異常性をみんなあんまり普段は意識していない気がする。MOV命令はそれ単体でチューリング完全ということでesolang Wikiに載ってる( https://esolangs.org/wiki/Mov )し、すごいシンプルな命令であるところの PUSH SP の結果が8086/8088とそれ以外で互換性が無いんだぞ!

かんそう

命令単体が面白いというのはなかなかレアなのかなと思った。NOPが9種類もの表現手法があるとか、実行したら死ぬ命令が(Pentiumの世代くらいまで)普通にバグとして存在したとかはあるものの、やっぱりCPUアーキテクチャ全体の面白さを伝えきれないな。と。

最近のIntelの調子悪さとかApple Silicon(ARMとは呼ばない)とかソフトバンクがArmと売りそうとか最近プロセッサのトピックは面白いので何かネタを見つけて書きたいところ。。以前の 4 + 4命令プロセッサを作る実験 以来そういうネタをやってないので。。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
74