以下のコードでは、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