首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PIC18在寻址方面有些奇怪

PIC18在寻址方面有些奇怪
EN

Stack Overflow用户
提问于 2017-05-01 19:17:16
回答 1查看 70关注 0票数 0

我在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的乘法器吗?

代码语言:javascript
复制
  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
EN

回答 1

Stack Overflow用户

发布于 2017-05-01 20:23:54

PIC18汇编程序的一些指令,比如:movff, call, goto是双字而不仅仅是单字,所以在跳转计算时要注意这个指令!当然没有乘数,只有计算指令。

补充说明:

代码语言:javascript
复制
  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跳转,然后将第一个值放入PCLATUPCLATH,最后将更新PC的内容放到PCLATL,然后跳转到PCLAT地址,则可以使用表来存储地址。如果您使用的是计算跳转,那么所有例程都必须具有与nop垫片相同的大小。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43725068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档