XC8アセンブラ理解/FCALL
FCALLとMOVLP
code:コンパイラの出力.lst
1705 07F2 3002 movlw 2
1706 07F3 3187 27E0 3187 fcall _add_uint8_values
1707 07F6 0097 movwf 23 ;volatile
code:逆アセンブル
07F2 3002 MOVLW 0x2
07F3 3187 MOVLP 0x7
07F4 27E0 CALL 0x7E0
07F5 3187 MOVLP 0x7
07F6 0097 MOVWF LATB
FCALL→MOVLP, CALL, MOVLPに展開されるようだ。
MOVLPはMove literal to PCLATH
PCLATHはプログラムカウンタの上位7ビットを表すレジスタ。
CALL時にPCLATHの値がPCにロードされる。
https://gyazo.com/f418f2f81693cece7e70fbe8c2f9381c
FCALLは下位11ビットで表せない範囲をCALLする(疑似)命令。
しかし、上記のプログラムでは07F4にあるCALL命令で0x7E0の関数を呼ぶので、PCLATHの調整は不要と思う。
最適化レベルO3でもMOVLPが出力されてしまう。