我对 PIC18 寻址有一些误解(如我所见)。所以有一部分是XC8生成的lst文件。在代码的末尾,我们可以看到 switch/case 运算符比较块,然后分支到 case 部分。所以让我们得到两个一致的标签 l884 和 l885。它的地址是 1984h 和 1990h(12 个字节或 6 个字的距离)。但是如果我们寻找代码,它是它们的分支,我们可以看到:
E0F7 bz l885
和
E0EF bz l884
距离是 8 !!!不是 6,不是 0C,而是 8 ???!!!我希望将此函数中的 switch()/case 块更改为计算 goto,因为这一点对速度至关重要(这就是我观看此列表的原因)但现在我不明白我必须使用哪个乘数 6、8 ,还是 12?
addr hex code label disasm
001984 l884:
;main.c: 405: Run(canIdCheckers[1].func);
001984 C102 F03C movff _canIdCheckers+2,Run@addr
001988 C103 F03D movff _canIdCheckers+3,Run@addr+1
00198C ECB2 F014 call _Run ;wreg free
001990 l885:
;main.c: 407: Run(canIdCheckers[0].func);
001990 C100 F03C movff _canIdCheckers,Run@addr
001994 C101 F03D movff _canIdCheckers+1,Run@addr+1
001998 EFB2 F014 goto _Run ;wreg free
00199C l5504:
00199C 501E movf _canIdCheckerCount,w,c
; Switch size 1, requested type "space"
; Number of cases is 48, Range of values is 1 to 48
; switch strategies available:
; Name Instructions Cycles
; simple_byte 145 73 (average)
; Chosen strategy is simple_byte
00199E 0A01 xorlw 1 ; case 1
0019A0 E0F7 bz l885
0019A2 0A03 xorlw 3 ; case 2
0019A4 E0EF bz l884