原创 在程序中使用宏实现跨PAGE调用和跳转

2006-12-4 20:07 4977 12 12 分类: MCU/ 嵌入式

在程序中使用宏实现跨PAGE调用和跳转【转】


以前看过不求深究,理解了~~


义隆的单片机如果不使用PAGE的概念,那么大小会被限制在1K范围内。
当开发稍微复杂些的产品的时候,不可避免的需要使用PAGE来保证程序的
正确流程,并且可以允许在超过1K的地址空间。
    关于PAGE相关的Register有:R2和R3。PC是个8bit的寄存器,可以查
询和修改PC的A0-A9。STATUS中有几个BIT表示PAGE选择器。分别为PS0、
PS1(此为EM78P447,更大的单片机还有PS2、PS3等)。
    当有JMP或CALL发生的时候,PC的整个地址会被压栈,高位地址使用
PS0、PS1作为A10、A11,A0-A9使用JMP或CALL指定的地址。当RET、RETI
或RETL发生的时候,从堆栈中弹出完整的PC,注意这里是完整的A0-A11。
这样就可以实现对其他PAGE子程序的调用了。
    看EMC提供的Far Call宏,第一行为宏定义;第二行指令实现PAGE寄存
器的修改;第三行产生真正的call,去调用其他page的子程序;第四行在
把PAGE寄存器修改为当前PAGE。CALL为什么可以正常返回?请看上面的叙述
“从堆栈中弹出完整的PC”。
FCALL   MACRO ADDRESS
    PAGE ADDRESS / 0X400
    CALL ADDRESS % 0X400
    PAGE $ / 0X400
    ENDM
    这样,使用这个宏,就不用再独立考虑PAGE的问题了。Far Jmp的宏大家
可以参考上面的解释去理解。
FJMP MACRO ADDRESS
    PAGE ADDRESS / 0X400
    JMP ADDRESS % 0X400
    ENDM

文章评论0条评论)

登录后参与讨论
我要评论
0
12
关闭 站长推荐上一条 /2 下一条