2024.12.24
「経営陣が見たい数字」が見えない状況からの脱却法 経営課題を解決に導く、オファリングサービスの特長
オクタルはオタクるとは違うよ(どうして昔の人は八進数でしゃべるのか。いにしえの命令フォーマットについて)(全1記事)
リンクをコピー
記事をブックマーク
takeoka氏(以下、takeoka):takeokaです。低レイヤー、長い人生、そして……まぁ、格調が低い話をします。
私は16進世代です。若い人にはわからないかもしれませんが、昔はTK-80しかなく、assembleしてくれる機械なんて持っていなかったので、みんなアセンブラ・ニーモニックでバーっとプログラムを書いて、それが終わったらおもむろに16進コードへの変換を手でやっていました。だからよく使う命令は、基本的に暗記していました。
あれですね。HLレジスタへのimmediateのloadは「21」とか、Aレジスタへのimmediate loadは「3E」とか、サブルーチンコールは「CD」とか、リターンは「C9」とかです。
友だちの中には、「どうせ16進にするんだから、ニーモニックなんか覚える意味がない」とか言って、16進コードしか覚えない強者が何人もいました。私が大学入った時に入れ替わりで卒業した先輩も、「あいつは16進でしかしゃべれなかった」とか言っていました。
そんな感じで僕は16進世代ですが、僕の上の世代はオクタルでしゃべる人が多くて「8進なんでやねん?」と思ったので、今日の話です。
PDP-11はみんなが大好きUNIXとCが作られた機械です。伝説の機械で、僕もけっこう使っていました。
レジスタマップを見ると、レジスタは8個。8個なので3bitでちょうどいいです。一応、UNIXはod(octal dump)があって、hd(hex dump)というコマンドはありません。結局オクタルが大好きなんです。PDP-11はlittle endianマシンで、odのデフォルトは16bit単位です。「命令コードがdumpできると便利だな」みたいな感じですね。
あと、Cができた時から「¥007」とか書くと、オクタルではどんな文字コードでも書けました。この頃は16進で書けるようになっていますが、当時は書けませんでした。
見ると、一応レジスタとアドレッシング・モードというのが組になっています。これはMC68000の頃には「直交性」と言って、あるレジスタに対してすべてのアドレッシング・モードが全部使えます。
(スライドを示して)これはレジスタの値を取る。これはレジスタで指されているところを取る。これは「*p++」です。「*p++」がなぜあるかというと、PDP-11の機械語にあったからです。これの1Byte版と……charとshortかな。shortはintなんですけれど。
そういうのがあって、転送命令の場合、ソースレジスタには今のアドレッシング・モードが使えるので、このレジスタの中を使ってメモリから取ってくるとか、置くこともできます。対称性があって、メモリからメモリ転送もできます。
結局これはRegisterで8個なので3bitで、このアドレッシング・モードが8通りなので3bit。(スライドを示して)この組でソースとデスティネーションを表します。命令が16bitしかなくて、ソースとデスティネーションを入れると満杯になるので、一応、2オペランド。今の普通のRISCは3オペランドですが、dstとsrcで、2オペランドになっています。
これ全体が豆知識なのですが、PDP-11は、引き算の時は「sub dst, src」と書くと、「dst-src」ですが、なぜかcmp命令は「cmp dst, src」と書くと引き算の方向が反対で、私はビビりました。
(スライドを示して)このように、これ3bit3bit3bit、8進数で書いていたとすると、ここだけちょろっと4bitぐらいあります。jump命令も、一応3bit3bitが基本です。これはオフセットを大きく取りたいので、ちょっと大きいです。サブルーチンコールもレジスタ間接になっていることが多いので、これはRISCと同じで退避レジスタですね。
これは、PDP-11が大好きな人が好きなコンソールです。(スライドを示して)ここがデータや命令を置く時のスイッチですが、3bitずつ色分けがされていて、否が応にもオクタルマシンですね。アドレスが長い時があるのでちょっと長いですけど、(スライドを示して)16bit目はここまでですね。
時代が回って 、私たちのZ80の先祖です。Z80はこれ(Intel 8080)の上位互換です。なので、8080とZ80の16進コードは基本同じです。
アセンブラ・ニーモニックを見ると、明らかにPDP-11を意識しています。命令語は8bitですが、フィールドは3bitです。レジスタは8個。8bitレジスタが8個ぐらいあるように見えます。
そうすると、(スライドを示して)これはRISCでの転送命令でこれも2オペランドですが、ソースとデスティネーションで3bitずつです。ADDはAレジスタが対象と決まっています。(スライドを示して)ここが実はまたちょっと3bitでできています。それからINR、DCRも対象レジスタも3bitです。
このように8080は、アセンブラ・ニーモニックを見ても、このようなレジスタ構成を見ても、すごくPDP-11を意識しています。MC68000がPDP-11を真似したと言いますが、あれは汚いアーキテクチャで、とても私は認めることはできません。
そう言いながら、次に調べるのはCray-1です。世界で最初のスパコンですね。Cray-1も、「え、アセンブラなんか使うの?」みたいな、やっぱりアセンブラを覚える気がしない人がたくさんいます。一応64bit1ワードで、そこに命令が4つだけ入ります。たまに32bit命令があります。
次に、一応レジスタ構成チェックします。ベクトル・レジスタは、0から77と、78個のデータが置けます。これはもっと短くてもいいです。その長さはベクトル長・レジスタで指定します、それは今回はどうでもいいのですが。このベクトル・レジスタが0から7まで、8個あって、これも8個です。昔の機械は大事なものは全部8個です。
(スライドを示して)ここがオペレーションコードを入れます。src src dst、そして(スライドを示して)命令コードです。一応この4が、この最上位ビットが4の1の1です。それから(スライドを示して)ここの3bitはfloating addです。vector float add命令は171、あとdst, src, srcで2オペランドですね。
アセンブラ・ニーモニックの文法はすごいです。普通(スライドを示して)ここにaddとかを書くのですが、デスティネーションレジスタの番号を書いて、スペース空けて、次のレジスタ番号を書いて、足すで、一応「F」をつけて、レジスタ番号を書きます。ここに「F」があるとfloat addとわかります。
この場合、Cray-1通の人は「いちいちこんなしょーもないもん書かんでええやんけ」と171の何番何番何番といって覚えています。例えばfloating vector multiは161なので、もう171や161がパッと頭に浮かんで、バババッと8進数で書いてしまう。「これが普通やろ」と言われて私は「えー!」となりました。
今度はスパコンの反対で「記号処理や」と言って、LISPマシンのマクロ命令だすと。そうすると、微妙なのですが、主なフィールドは全部3の倍数になっています。オペコードが(スライドを示して)このへんにあって、ここは4ですが、基本3です。この3と6はアドレスのオフセットとかに使うやつですね。この時はこの3と6を足して9bitのデータを示すものだったりします。
最後ですが、MIPSはスカスカやなと。RISC-Vもスカスカやなと。immediateが頭になければいいですねと以前言ったことがあります。
ARMはなんか変なエンコードがされていて、僕はARMは嫌です。以上です。
関連タグ:
2024.12.20
日本の約10倍がん患者が殺到し、病院はキャパオーバー ジャパンハートが描く医療の未来と、カンボジアに新病院を作る理由
2024.12.19
12万通りの「資格の組み合わせ」の中で厳選された60の項目 532の資格を持つ林雄次氏の新刊『資格のかけ算』の見所
PR | 2024.12.20
モンスター化したExcelが、ある日突然崩壊 昭和のガス工事会社を生まれ変わらせた、起死回生のノーコード活用術
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
2024.12.18
「社長以外みんな儲かる給与設計」にした理由 経営者たちが語る、優秀な人材集め・会社を発展させるためのヒント
2024.12.20
「資格のかけ算」で切り開くキャリア戦略 4パターンの資格の組み合わせで自分の強みを最大化するヒント
2024.12.23
DMM亀山会長が語る、事業撤退の見極め 600もの事業に挑戦した中でロジックよりも大事にしていたこと
2024.12.24
なぜ「場当たり的」なタスク処理になるのか? マッキンゼー流、「優先順位づけ」のポイント
2024.12.17
面接で「後輩を指導できなさそう」と思われる人の伝え方 歳を重ねるほど重視される経験の「ノウハウ化」
2024.12.16
32歳で成績最下位から1年でトップ営業になれた理由 売るテクニックよりも大事な「あり方」