图18 地址有些奇怪

  • 本文关键字:地址 assembly pic18 xc8
  • 更新时间 :
  • 英文 :


我对PIC18寻址有一些误解(如我所见)。 所以有一部分 lst 文件由 XC8 生成。在代码末尾,我们可以看到开关/机箱运算符比较块,然后分支到外壳部分。 因此,让我们得到两个一致的标签 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

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 或0xF7ASM 代码:E0F7

行的计算:bz l885-9 = (256 -9) =247 或0xEFASM 代码:E0EF

如果您不使用PCLAT跳转,则将第一个值放入PCLATUPCLATH,最后PCLATL将更新PC的内容并跳转到PCLAT地址,则可以使用表来存储地址。如果您使用计算跳转,则所有例程的大小必须与填充nop的大小相同。

相关内容

  • 没有找到相关文章

最新更新