您现在所在的是:

嵌入式系统

回帖:0个,阅读:1169 [上一页] [1] [下一页]
1137
xingsharp
文章数:119
年度积分:48
历史总积分:1137
注册时间:2005/3/2
发站内信
08年优秀博客奖
发表于:2009/8/19 2:05:41
#0楼

pic汇编宏技巧-bank切换

mplab中有条非常有用的伪指令:banksel可用它来快捷设置 bank 而不用 status 的 rp0 ,rp1去具体的设置bank 。
banksel ****,通常只改变status,rp1,rp0,而rp1,rp0仅仅对 直接寻址[/b] [/b]有效

但banksel不会改变status,irp,也就是说,banksel的页选择对 间接寻址[/b] [/b]是没有用的.

以877a为例,如果你的寻址目标在bank1,那么你设置banksel bank1,这样直接,间接寻址都有效

但如果你的寻址目标在bank3,而用banksel bank3设置页地址,此时直接寻址有效,但间接寻址就会出错,因为banksel不能改变status,irp

编译是能通过的,没问题,即便你不设置banksel,编译也照样能通过,如果你用bsf(bcf)  status,rp0(rp1)语句编译并烧录后,程序能正常运行,而用banksel bank*,编译并烧录,而程序却不能通过,这样的问题才是古古怪怪的问题,那我也没办法.

我有一个大程序,开始能通过,后来因为扩展,将原来bank1上定义的寄存器改为bank2,对应的页设置也仅仅是用banksel bank3,编译照样能通过,运行时就麻烦了.后来在每个banksel bank*的语句后面紧跟一句bsf(bcf) status,irp.如果要返回bank0时,全部用clrf status(或者同时将irp,rp1rp0)三个位清0



push_macro  macro
   movwf   w_temp
   swapf   status,w
   movfw   status_temp
   endm

pop_macro   macro
   swapf   status_temp,w
   movwf   status
   swapf   w_temp,f
   swapf   w_temp,w
   endm
[URL=http://mayer.spaces.eepw.com.cn/articles/trackback/item/62107][/URL]
----------------------------------------------
此篇文章从博客转发
原文地址: Http://blog.gkong.com/more.asp?id=97832&Name=zjcsharp

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

31.2002