我在PIC18地址中有一些问题(如我所见)。因此,有一部分由XC8生成的lst文件。在代码的末尾,我们可以看到开关/ case操作符比较块,然后分支到case部分。因此,让我们获得两个一致的标签l884和l885。它的地址是1984和1990 h(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发布于 2017-05-01 20:23:54
PIC18汇编程序的一些指令,比如:movff, call, goto是双字而不仅仅是单字,所以在跳转计算时要注意这个指令!当然没有乘数,只有计算指令。
补充说明:
001984 l884: <<
001984 C102 F03C movff _canIdCheckers+2,Run@addr -2
001988 C103 F03D movff _canIdCheckers+3,Run@addr+1 -2
00198C ECB2 F014 call _Run ;wreg free -2
001990 l885: <<
001990 C100 F03C movff _canIdCheckers,Run@addr -2 -2
001994 C101 F03D movff _canIdCheckers+1,Run@addr+1 -2 -2
001998 EFB2 F014 goto _Run ;wreg free -2 -2
00199C l5504:
00199C 501E movf _canIdCheckerCount,w,c -1 -1
00199E 0A01 xorlw 1 ; case 1 -1 -1
0019A0 E0F7 bz l885 -1 >>-1
0019A2 0A03 xorlw 3 ; case 2 -1
0019A4 E0EF bz l884 >>-1
=========
(sum of words)) -17 -9行的计算:bz l884 -17 =(256-17)= 238或0xF7 Asm代码:E0F7
行的计算:bz l885 -9 =(256-9) =247或0xEF Asm代码:E0EF
如果您不习惯使用PCLAT跳转,然后将第一个值放入PCLATU和PCLATH,最后将更新PC的内容放到PCLATL,然后跳转到PCLAT地址,则可以使用表来存储地址。如果您使用的是计算跳转,那么所有例程都必须具有与nop垫片相同的大小。
https://stackoverflow.com/questions/43725068
复制相似问题