20180720 (20180702_02) 【参考】アドレッシングモード(addressing mode) ○命令の操作対象(オペランド部)を指定する方法、  あるいは、データの存在場所(アドレス)を指定する方法。 ○つぎのように、3つの分類の観点がある(その他も含めれば4種類か?)。  (1) レジスタ(register)、メモリ(memory)、I/O(input/output)  (2) 直接(direct, absolute)、間接(indirect)  (3) 修飾あり(indexed)、修飾なし  (4) その他 即値(immediate, literal)、 暗黙(implied, implicit)、 相対(relative)、 ゼロページ(zero page)、 ・・・・ (注意1)PICの場合: レジスタのみで、メモリはない(汎用ファイルレジスタはデータメモリとも解釈できるが、・・・)。 直接、即値アドレッシングモードが基本。 間接指定は、特殊レジスタのFSR(04h番地)とINDF(00h番地)とを組合せて実現している。 (注意2)修飾アドレッシングモードの場合には、 複数のオペランドを組み合わせて、アクセス(読んだり書いたり)する番地を決定する。 組み合わせるオペランド毎にそれぞれのアドレッシングモードがあることに注意。 (注意3) 決定されたアクセス(読んだり書いたり)する番地を、実行アドレス(effective address)という。 (例1)直接メモリ・アドレッシングモード(修飾なし) データが格納されている(あるいは格納する)メモリの番地を直接指定して、アクセス(読んだり書いたり)する。 (例2)レジスタ間接メモリ・アドレッシングモード(修飾なし) 指定したレジスタの内容を番地とするメモリをアクセスする。 (例3)即値アドレッシングモード オペランドに記述された数値を、直接にデータとして扱う。 番地(データの存在場所)を指定している訳ではない。 【2018.07.20 追記】 ◎実際のアドレッシングモードの実装 ○2項演算と単項演算では、それぞれ3個と2個の演算対象(オペランド)があると考えられる。   2項演算 (演算対象C) ← (演算対象A) (演算) (演算対象B)   単項演算 ((演算対象C) ← (演算) (演算対象A) ○演算対象A,B,Cに対して、それぞれに様々なアドレッシングモードを指定できることが理想ではあるが、  表現するために大きなビット長を必要とするアドレッシングモード(ファイルレジスタ番地やリテラル)を  複数のの演算対象に指定することは現実的ではない。 ○そこで、この内の1つの演算対象にだけレジスタ番地やリテラルを指定するようにして、  残りの演算対象にはビット長の小さなアドレッシングモード(インプライド等)を指定するようにしている。  特に、演算対象Cについては、第2オペランドに1ビット長の指定をして、  0ならばWレジスタ(W)、1ならば(演算対象Aと同じ)ファイルレジスタ(F)に対して、  演算結果を格納するようにしている。  (例) ADDWF 20H,F ; (20H) <- (20H) + W ○また、必要ならば、操作を2つ以上の命令に分けて記述し、それぞれの命令において、  ビット長の大きなアドレッシングモードを指定をするようにしている。  (例) ; (22H) <- (20H) + (21H) MOVF 20H,W ; W <- (20H) ADDWF 21H,W ; W <- (21H) + W MOVWF 22H ; (22H) <- W ○FSRレジスタとINDFレジスタとを用いた間接アドレッシングモードの実現も、2ステップ以上の命令が必要であり、  この考え方と同様である。  (例) ; W <- (30H) MOVLW 30H ; W <- 30H MOVWF FSR ; (FSR) <- W MOVF INDF,W ; W <- (INDF)