以下のコードでは、TRIS レジスタの 1 番目、2 番目、3 番目、最後に 4 番目のビットを設定しています。生成されたアセンブリ コードが...おかしいのはなぜですか?
知っておくと便利: コードがコンパイルされるマイクロコントローラーのデータ メモリは、いくつかのバンクに分割されます。ビット 6 と 7 はstatusレジスタの位置 5 と 6 に入り、ビット 0 ~ 5 のみがオペコードに格納されます。TRISしたがって、位置 0x86 のレジスタにアクセスする場合、オペコードに格納される値は6.
具体的な質問:
(134)^080: これは、特定の銀行6のアドレスである に変換されます。TRISなぜコンパイラは単に or を書かないの(6)です(134)か? TRIS がバンク 0 にないことを明確にするためだけですか、それとも他の理由がありますか?+(0/8):0ビット位置を表し、8そのレジスタ内の総ビット数を表します。私の意見では、結果は常に分数であり、決して整数ではないため、この式は何の役にも立ちません。したがって、アドレス計算には寄与しません。(0)&7:(0)は再びビット位置を表しますが、バイナリ AND がどのような目的で7機能するのかは、私にはよくわかりません。- コマンドは何をし
lineますか?
コード (生成された *.as ファイルからの抽出)
;main.c: 9: TRISB |= 1;
bsf status, 5 ;RP0=1, select bank1
bcf status, 6 ;RP1=0, select bank1
bsf (134)^080h+(0/8),(0)&7 ;volatile
line 10
;main.c: 10: TRISB |= 2;
bsf (134)^080h+(1/8),(1)&7 ;volatile
line 11
;main.c: 11: TRISB |= 4;
bsf (134)^080h+(2/8),(2)&7 ;volatile
line 12
;main.c: 12: TRISB |= 8;
bsf (134)^080h+(3/8),(3)&7 ;volatile
line 13