XC8アセンブラ理解/数値比較
変数と定数の比較の実例
code:main.c
volatile uint8_t led_mode, pwmtmr_count;
void pwmtmr_isr() {
if (led_mode > 3) {
return;
}
pwmtmr_count += 2;
}
code:xc8compiler-test.X.production.lst
1772 07DB _inc_pwmtmr:
1773
1774 ;main.c: 15: if (led_mode > 3) {
1775
1776 ;incstack = 0
1778 07DB 3004 movlw 4
1779 07DC 0274 subwf _led_mode,w ;volatile
1780 07DD 1803 btfsc 3,0
1781 07DE 0008 return
1782
1783 ;main.c: 18: pwmtmr_count += 2;
1784 07DF 3002 movlw 2
1785 07E0 00F0 movwf ??_inc_pwmtmr
1786 07E1 0870 movf ??_inc_pwmtmr,w
1787 07E2 07F3 addwf _pwmtmr_count,f ;volatile
1788 07E3 0008 return
1789 07E4 __end_of_inc_pwmtmr:
最適化レベルO3
SUBWF _led_mode,wは W = led_mode - W;
この命令実行時、Wは4になっているので、W = led_mode - 4;と等価
BTFSC 3,0は、レジスタ3のビット0を調べ、0ならスキップ
0x03にあるレジスタはSTATUSレジスタ、ビット0はCarryフラグ
Cフラグは、SUBWFの結果、最上位ビットからボローが発生すると0になる
つまり、led_mode - 4 < 0なら、C=0となり、BTFSC 3,0の次の命令がスキップされる。
逆に、led_mode - 4 >= 0 ⇔ led_mode - 3 > 0 なら、C=1となり、RETURNが実行される。
変数と定数の比較の一般形
8ビット変数xと定数kの比較 if (x > k) return; は一般にこうなる?
code:変数と定数の比較の一般形.asm
MOVLW k + 1
SUBWF x, W # W = x - (k + 1)
BTFSC STATUS, CF # W < 0 なら次の命令をスキップ
RETURN