SEX命令のすべて

 きっかけはこれ。SEX (computing)(Wikipedia)

 Sign Extend(符号拡張)命令とは、2の補数表現のデータをより大きいビット幅に変換する命令。元データの最上位にある符号ビットの値を先データの空き部分に埋める。

 よく知られたMC6809のSEX命令は上位側を8bitのアキュムレータA、下位側を8bitのアキュムレータBで構成された16bitのアキュムレータDについて、アキュムレータBの値を2の補数とみなしアキュムレータDの16bit幅に符号拡張を行う。Bの最上位ビットが1ならば0xFF、そうでなければ0x00をアキュムレータAにセットする。
 Bが正の値(0~127)なら上位8bitを0にすればそのままで正しい値となる。Bが負の値(-128~-1)について考えてみる。
例としてBが0x91(2進数で10010001)= -111とする。8bitの範囲では最上位ビットの重み付けが-128、その他は2のn乗(nは0から数える下位側からの桁数)となるので-128+16+1=-111。これを16bitに拡張すると表現できる数値の範囲は-32768~32767となり、最上位ビットの重みは-32768となる。これを符号拡張でbit14~bit8までを'1'にすると16384+8192+4096+2048+1024+512+256=32512で、-32768+32512=-256となる。元々のbit7~bit0は正の値として扱うので-256+128+16+1= -111 となる。

追記:元のデータの最上位ビットの重みをa、残りのビットの重みの合計をbとすると2の補数表現での値は-a+b(a>b)。符号拡張の操作で上位側に増えたビットについて、色々省略するが最上位をマイナスとして合計すると-2aとなる。これと元データを重ねると、元データの最上位ビットはマイナスではなくそのままで扱うのでa+b。合計して-2a+a+b= -a+bとなり、元の値と同じになる。

 MC6809と同じモトローラ製の68HC12(68HC11の16bit拡張)も同様のアキュムレータ構成で、同じくSEX命令を持つ。MC6801や68HC11はアキュムレータ構成は同じでもこの命令はない。

ジャーゴンファイルを見てみるとCDP1802(COSMAC)にもSEX命令はあるけどこれはSEt X register命令なので符号拡張とは関係ない。

 " The Data General instruction set also had SEX."とあるので調べてみたら『超マシン誕生』で登場した開発コードEagle、Eclipse MV/8000に当該命令が存在した。これ以前のNOVAやEclipseには存在しない。これはEagleが32bitマシンで従来の16bitで表現された2の補数を扱うためと考えられる。
スクリーンショット 2020-07-14 22.28.34.jpg

 ロード命令でメモリからレジスタにレジスタ幅より小さい値を転送するときに、一緒に符号拡張するプロセッサも複数ある。
例:SPARC V8のLDSB(Load Signed Byte)命令、LDSH(Load Signed Halfword)命令、PDP-11のMOVB命令、など

 さてジャーゴンファイルを読んでいるとPDP-11は同じ動作をする符号拡張命令をSXT命令と呼んでいる。同様にインテル8086はCBW(Convert Byte to Word)命令、CWD(Convert Word to Doubleword)命令というようにSEX命令と呼ぶのを避けている。ニーモニックは人間が読み書きするものなので決めたところの社風とか文化が反映されているのでしょう。

超マシン誕生 新訳・新装版 - トレイシー・キダー, 糸川洋
超マシン誕生 新訳・新装版 - トレイシー・キダー, 糸川洋


ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント