パス

命令形式

          // 直交形式
<dst> = pass <dreg>;

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

          // 即値形式
[ IF <cond> ] pass <dst> = <imm>;

          // 直交形式
AR = pass MX0;

          // 基本形式
AR = pass 0;
AR = pass AX0;
AR = pass AY0;

          // 即値形式
AR = pass 1024;

説明

パス命令はオペランドの値をARあるいはAFに代入します。この命令はレジスタ間移動命令や即値ロード命令とよく似ていますが、ASTATに影響を与える点が大きく違います。

たとえば

AR = pass -3;  // AR に -3 を代入。ASTATが変化する。
AR = -3;       // AR に -3 を代入。ASTATは変化しない。
AF = pass AX0; // AF に AX0 の値を代入。ASTATが変化する。
AF = AX0;      // AF に AX0 の値を代入。ASTAは変化しない。

といった違いがあります。

ISRにもこの点に関して混乱があります。ISR 3-20によれば"pass"という記号は省略してもいいことになっています。しかしながら、"pass"を省略するとアセンブラは通常のレジスタ間移動、あるいは即値ロード命令としてアセンブルしますので、ASTATの値は変化しません。

ISRの記述にかかわらず、"pass"は省略不能だと考えてください。

もうひとつpass命令で混乱するのは、そのオペランドの変則さです。たとえば、

  1. AR = pass 1; が基本形式になっている。
  2. 通常の即値形式では許されない1025などが許されている。

これらは、pass命令が単一命令でないことからきています。下に少し例を挙げてみましょう。

AR = pass -1;   // AR = 0 - 1 の省略形    ( <yop>-1 : <yop>=0 )
AR = pass 0;    // 正真正銘 pass 命令
AR = pass 1;    // AR = 0 + 1 の省略形    ( <yop>+1 : <yop>=0 )
AR = pass 1023; // AR = 1024 - 1 の省略形 ( <yop>-1 : <yop>=1024 )
AR = pass 1024; // 正真正銘 pass 命令
AR = pass 1025; // AR = 1024 + 1 の省略形 ( <yop>+1 : <yop>=1024 )

このようにpass命令は複数の命令の特殊形の寄せ集めになっているため、やや規則が煩雑です。また、<yop>=0は基本形式なので、pass -1, 0, +1も基本形式となります。

文法要素

<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>  ::= <即値>, および即値+1, 即値-1
<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 |