訂正・NOP命令の誕生

目次

まずはお詫び

701/702/650 の NO OP 命令

IBM 702 の構造

IBM 702 の NO OP双子の命令自己書き換えの必要性

NO OP から NOP へ

TX-0 の NOP

調査済みの歴史

現在の NOP

まとめ


調査済みの歴史

今回取り上げなかった部分も含め、現状で調査済みのことをまとめておきます。

NOP のあり・無しの欄は、根拠となる資料へリンクします。

コンピューター名は、僕が記事を書いている場合、その記事へリンクします。


このまとめに乗っていないコンピューターは僕は存在すら気づいていません。気づいたら教えてください。

未調査、となっているものは資料不足です。こちらも、どなたか資料を知っていましたら教えてください。

2015.5.19追記 2015.6.19修正

当初、気になりながら資料不足だった IBM SSEC (702 より古い機械)の命令表を見つけ、NOP の存在を確認しました。

SSEC の詳細はIBM SSECのページにまとめます。また、NOP に関しては再訂正・NOP命令の誕生にまとめています。

以下の年表は、SSEC も含め、現時点で調査済みの一覧です。

機械名NOP付記
Zuse Z31941 無し パンチテープによりプログラム可能な、2進法リレー計算機。
世界初のプログラム可能計算機とされる。
IBM ASCC1944 無し 歯車式計算機。Harvard mark I とも呼ばれる。
IBMが初めてつくった、ソフトウェア作成可能な自動計算機。
プログラム内蔵式ではないが、紙テープに機械語コードでプログラムできた。
IBM PSRC1944 無し IBM ASCC の経験をもとに作られた、リレー計算機。ASCC より高速。
プログラムは可能だが、配線によって行った。機械語が無いので NOP もない。
ENIAC1946 無し プログラム内蔵式ではなく、配線によってプログラム。機械語がないので NOP も無い。
1948年にプログラム内蔵型に改造されているが、NOPは無い。
IBM SSEC1948 あり ASCC / PSRC の経験をもとに作られた真空管計算機。紙テープでプログラム可能だが、メモリに命令を置けた。
メモリ上の命令を自己書き換えすることにより、条件分岐可能だった。
IBM 公式には計算機。コンピューターではない。
The Baby1948 無し Manchester Mark 1 のプロトタイプ。
Manchester Mark 11949 未調査 機械語コード不明で NOP 未調査。
しかし、この後作られる量産機には NOP は無い。
EDSAC1949 無し? プログラム内蔵式。NOP 相当の「何もしない」命令があったとされている。
しかし、リンク先にあるように、後世の捏造の可能性大。
BINAC1949 無し ENIAC 設計者による、世界初の商用マシン。(もっとも、量産されなかった)
CISRAC1949 無し 世界初の電子音楽を奏でたオーストラリアのマシン。
UNIVAC 11011950 無し UNIVAC 社の作った最初のコンピューター。事実上世界初の商用マシン。
EDVAC1951 無し ENIAC プロジェクトが作った後継機(設計者は途中離脱)。
UNIVAC I1951 無し ENIAC 設計者による商用マシン。大統領選の結果を予想したマシンとして有名。
Ferranti Mark 11951 無し Manchester Mark 1 の量産機。
Whirlwind I1951 無し 現代的な最初のコンピューター。
IBM 7011952 あり IBM 702 より後に開発が始まり、先に発売。
NO OP が存在するが、なぜかマニュアルに詳細がない。
IBM 7021953 あり NO OP が存在するだけでなく、利用意図まで明確。
マニュアルも非常に詳細。
IBM 6501954 あり NO OP が存在するが、マニュアル上は「何もしない」と書かれているのみ。
IBM 7041954 あり IBM 701 の後継機。互換性は無い。
NOP 命令が存在する。
TX-01956 あり トランジスタ式。Whirlwind I を元にしている。
当初から「何もしない」命令はあったが、特に名前は付いていなかった。
(重要と考えてなかった)
1960年の改造時に NOP と名付け、今後も何もしないことを保証。
今回の調査以前は、この NOP が歴上最初と思っていました。
PDP-11960 あり TX-0を元にして改良・拡張した量産機。
当初から「何もしない」命令はあったが、特に名前は付いていなかった。
TX-0がNOPを「保障」したのを受け、1961年マニュアルにNOPを記載。
先行研究では、PDP-1が最初とされていました。

現在の NOP

PDP-1 に受け継がれた NOP は、PDP-8 / PDP-11 にも受け継がれます。

PDP-8 を参考に、初期の1チップ CPU である、Intel 4004 や Mos 6502 が作られます。また、PDP-11 を参考に、Motorola 6800 が作られます。


このため、8bit 時代のパソコン CPU には当然のように NOP がありました。


一方、IBM の POWER アーキテクチャに端を発し、1990年代から流行した RISC 命令セットには、NOP がないものが多いようです。

RISC とはもともと、CPU に「なくてもよい」命令を徹底して排除し、CPU の回路を簡素にし、駆動速度を上げることが目的でした。

NOP は不要なものの筆頭として削除されたのでしょう。POWER はもちろん、PowerPC 、SPARC、ARM、MIPS …などなど、みな NOP を持っていません。


今回の調査で驚いたのは、RISC ではない Intel の 8086 にも NOP がなかったという事実。8080 や Z80 にあったから、当然 8086 にもあると思ってた!


ただし、いずれの CPU でも、アセンブラ上では NOP が使えます。NOP を指示すると、「最小の命令サイズ」「最小の実行時間」で「何も影響がない」命令が埋め込まれます。

レジスタに 0 を足す、レジスタを 0回 シフトする、同じレジスタに対して内容をコピーする…などが良く使われるようです。


8086 の場合、XCHG EAX,EAX (EAX レジスタの内容と、EAX レジスタの内容を交換する)が使われるそうです。

ただ、これまた余談ですが、近年の Intel プロセッサではこの命令は実行を阻害して「遅く」してしまう作用があり、何もしないわけではないそうな…


前回文章を書いた際に、「NOP は大抵の CPU にある」と書いてしまったのですが、RISC 以降の CPU 事情を十分知りませんでした。
上記は今回の調査で知ったこと。

8086 でアセンブラはやったのだけど、NOP と書けるからあるのだと思っていたよ…
SH-2 でアセンブラやったけど、RISC なのに NOP 命令持ってるよ…

ちなみに、ARM は各種命令セットがありますが、中には NOP を持つセットもあります。
(32bit-Thumb2 セットと、64bit-AArch64 セットには NOP があるのだとか)

まとめ

最初に書いた通り、前回記事に書いた「TX-0 が NOP の最初」は間違っていました。申し訳ありません。

(申し訳ないとは思いますが、今後も方針は変えずに記事を書き続けます)


現時点のまとめとしては、世界で最初に NOP が搭載されたマシンは IBM 701 。

ただし、登場順では後だが、開発は先に始まっていた IBM 702 の開発チームが考案したものと思われます。


NOP 導入の理由は、「常に真」の条件分岐(無条件分岐)に対し、「常に偽」の条件分岐(つまり「なにもしない」)があると、自己書き換えプログラムを作るうえで便利だったから。

NOP は「何もしない命令」ではなくて「分岐しない分岐命令」だったのですね。



勘違いしないでほしいのは、前回書いた TX-0 の NOP 導入の理由は、TX-0 に関して言えば間違っていないということです。

世界初と書いたことが誤りだっただけで、記事内容全てが間違えているわけではない。


一度書いたことに対して負け惜しみを言っているわけではなくて、歴史上、様々な理由で「世界初」があるのは当然だと思っています。

IBM 702 と TX-0 は、それぞれ別の理由で「何もない命令」を作る必要があった。それぞれの工夫は素晴らしいもので、TX-0 が後だから真似しただけ、ということではないように思うのです。


2014. 7. 6 初公開
2014. 7. 8 ENIAC の命令一覧発見、NOPがないことを確認。
2015. 5.12 Z3 の命令一覧発見、NOPがないことを確認。
2015. 5.19 SSEC の特許書面と、その概要を発見。NOPを発見!(困った)

参考文献:当時のマニュアルなど、多くの文献を当たっています。
基本的には、途中に書かれた年表からリンクしています。


前ページ 1 2 3 4

(ページ作成 2014-07-06)
(最終更新 2015-06-13)

前記事:世界初のテレビゲーム     戻る
トップページへ

-- share --

74000

-- follow --




- Reverse Link -