|
まずは基本的なところから。 BCD演算では4ビットを使って十進数の0〜9を表す。文字コードでは8ビット(ASCIIで0x30〜0x39)なので、上位4ビットを落として詰める必要があり、これをPACK操作と言う。 BCD演算は基本的にPACK形式で行われる。元の8ビットの文字列に戻すにはUNPACK操作を行う。 RISCアーキにはBCD演算はない。RISCではばっさり切り捨てられた。(PowerISA2.06で追加されているが) COBOLを使う商用計算機では欠かせない機能だった…はずだが、今は内部で二進数で計算している。SPARC用COBOLコンパイラのコンパイル結果を見て驚いた覚えがある。アタリマエだが。 ・x86 8ビットの8080の頃を引きずっている。 通常の二進演算 ADD,ADC,SUB,SUBB,MUL,DIVに対し、1バイト単位で補正を行う。 パック加減算補正 DAA,DAS / アンパック加減乗除補正 AAA,AAS,AAM,AAD ・68000 1バイト単位の演算 ABCD.B Dn,Dn / ABCD.B -(An),-(An) BCD加算 SBCD.B Dn,Dn / SBCD.B -(An),-(An) BCD減算 NBCD.B <ea> Xフラグ=0のとき10の補数/Xフラグ=1のとき9の補数をとる ・PowerISA 2.06 通常の二進演算に対し変換を行う 3.3.14章 BCD Assist Instructions cdtbcd RA,RS RSの下位20ビットを6個のBCD(4bit)に変換してRAに入れる。RAの余りビットは0。 cbcdtd RA,RS cdtbcdの反対。BCDの値が9より大きい場合はUndfined。 addg6s RT,RA,RB RA,RBを加算し、4ビットごとにキャリーを生成してRTに代入。 なお5章には十進浮動小数点についての定義がある。 ・System/360 コンピュータ・アーキテクチャ定量的アプローチ第一版から PACK パック形式(BCD)に変換 UNPK アンパック形式に変換 AP パック形式加算 CP パック形式比較 DP パック形式除算 MP パック形式乗算 SP パック形式減算 ZAP ZERO and add packed ・Gmicro (TRONチップ) レジスタ長32bit=BCDで8桁まで計算できる 基本十進命令 ADDDX 十進数加算 SUBDX 十進数減算 PACK パック UNPACK アンパック 強化十進命令 符号付き十進数を扱う(0xa,0xc,0xe,0xfが正、0xb,0xdが負) DCADD/DCSUB 符号付き十進数加算/減算 DCADDU/DCSUBU 無符号十進数減算/減算 DCX 拡張十進加算 DCADJ/DCADJU 符号付き/無符号十進補正 DCADJX 拡張十進補正 DCCMP/DCCMPU 符号付き/無符号十進比較 扱えるサイズと機能で言ったらGmicro最強。System/360は乗除算がある。いずれも専用のALUを持っているっぽい。(か、ALUがBCD演算機能を持っている) PowerISA2.06は二進と十進の変換機能を持っているので演算自体は二進数でやっている。変換器がちょっと大変か。 |
| << 前記事(2009/09/25) | ブログのトップへ | 後記事(2009/10/02) >> |
| タイトル (本文) | ブログ名/日時 |
|---|
| 内 容 | ニックネーム/日時 |
|---|---|
いくつか事実の指摘: |
m.ukai 2009/09/30 10:41 |
ご指摘ありがとうございました。 |
houmei 2009/09/30 20:40 |
| << 前記事(2009/09/25) | ブログのトップへ | 後記事(2009/10/02) >> |