// 直交形式 <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命令で混乱するのは、そのオペランドの変則さです。たとえば、
これらは、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