PIC18在处理

时间:2017-05-01 19:17:16

标签: assembly pic18 xc8

我对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,因为这一点对速度至关重要(这是我看这个列表的原因)但是现在我不会unserstand现在哪个乘数我必须使用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

1 个答案:

答案 0 :(得分:0)

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 CODE:E0F7

线的计算:bz l885 -9 =(256 -9)= 247或 0xEF Asm CODE:E0EF

如果你不想使用PCLAT跳转,那么将第一个值放到PCLATUPCLATH,最后放到PCLATL什么会更新PC并跳转到{{ 1}}地址,您可以使用表来存储地址。如果使用calcolated jump,则所有例程的大小必须与PCLAT pading相同。