0

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

2 に答える 2

0

コンパイラは、特定の正規表現によりアセンブラ コードを生成し、正しい値をそれに挿入するだけです。特定の単語lineは実際のアセンブラ コマンドではありません。

于 2014-07-27T17:29:44.570 に答える