減算

命令形式

          // 直交形式
<dst> = <dreg> - <dreg>;
<dst> = <dreg> - <dreg> + c -1;
<dst> = <dreg> + c - 1;

          // 基本形式
[ IF <cond> ] <dst> = <xop> - <yop>;
[ IF <cond> ] <dst> = <xop> - <yop> + c -1;
[ IF <cond> ] <dst> = <xop> + c -1;

          // 即値形式
[ IF <cond> ] <dst> = <xop> - <imm>;
[ IF <cond> ] <dst> = <xop> - <imm> + c -1;

          // 直交形式
AR = MX0 - MY0;
AF = MX0 - SI + C - 1;  // ボロー補正
AR = MX0 + C - 1;       // ボロー補正のみ

          // 基本形式
AR = AX0 - AY0;
AR = MR1 - AY1 + C - 1; // ボロー補正
AR = AX1 + C - 1;       // ボロー補正のみ
IF EQ AR = AX0 - AY0;   // 条件実行

          // 即値形式
AR = AX0 - 128;
AR = AX1 - 256 + C - 1; // ボロー補正

説明

第一オペランドから第二オペランドを引いた結果をARまたはAFに格納します。 "+ C - 1 "を付け加えることで、下位からのボロー(Borrow : 桁下げ)を受け取ることができます。「なぜ + C - 1なんて面倒なことするの?」という声が聞こえそうです。減算のとき、キャリーフラグは「ボローの否定」を表します。したがって、C=1ならばボロー無し、C=0ならボローありなので - 1となり、結局 + C - 1 となるのです。

なんか変ですよね。ハードウェアに忠実すぎる気がします。" - B " という表記を認めてもいいような気がしますが、ハードウェアのCフラグの意味があいまいになるのを恐れたのでしょう。

文法要素

<dst>  ::= AR, AF
<dreg> ::= AX0, AX1, AY0, AY1, MX0, MX1, MY0, MY1, 
           SI, AR, MR2, MR1, MR0, SR2, SR1, SR0
<xop>  ::= AX0, AX1, AR, MR2, MR1, MR0, SR1, SR0
<yop>  ::= AY0, AY1, AF, 0
<imm>  ::= <即値>
<cond> ::= EQ, NE, GT, LE, LT, GE, AV, NOT AV, AC, NOT AC, 
           SWCOND, NOT SWCOND, MV, NOT MV, NOT CE, TRUE
2191空挺団 | プログラム | EZ-KIT | こぼれ話 | アーキテクチャー | 命令 | レジスタ | DSP掲示板 | FAQ |