PICC 内嵌汇编

来源:互联网 发布:银行大劫案 知乎 编辑:程序博客网 时间:2024/05/16 05:21

因为我想用到滚动码HCS300/301的解码算法,但是C语言的效率肯定不如汇编,所以打算夹入汇编来实现PIC的KEELOQ的decrypt();   打算用以下介绍的第三种方法来实现

来自:http://blog.sina.com.cn/s/blog_4de52ced0100zqti.html

PICC 内嵌汇编

  (2012-05-05 17:53:22)
标签:  

杂谈

分类: 硬件

有两个原因决定了用 C 语言进行单片机应用程序开发时使用汇编语句的必要性:

单片机的一些特殊指令操作在标准的 C 语言语法中没有直接对应的描述,例如 PIC 单片机的清看门狗指令“clrwdt”和休眠指令“sleep”;

单片机系统强调的是控制的实时性,为了实现这一要求,有时必须用汇编指令实现部分代码以提高程序运行的效率。这样,一个项目中就会出现 C 和汇编混合编程的情形,我们在此讨论一些混合编程的基本方法和技巧。

嵌入行内汇编的方法

在 C 原程序中直接嵌入汇编指令是最直接最容易的方法。如果只需要嵌入少量几条的汇编指令,PICC 提供了一个类似于函数的语句:
asm("clrwdt")
双引号中可以编写任何一条 PIC 的标准汇编指令。例如:
for (;;) {
   asm("clrwdt"); //清看门狗
   Task();
   ClockRun();
   asm("sleep"); //休眠
   asm("nop");   //空操作延时
}



如果需要编写一段连续的汇编指令,PICC 支持另外一种语法描述:用“#asm”开始汇编指令段,用“#endasm”结束。例如下面的一段嵌入汇编指令实现了将 0x20~0x7F 间的
RAM 全部清零:

#asm
   movlw    0x20
   movwf    _FSR
   clrf     _INDF
   incf     _FSR,f
   btfss    _FSR,7
   goto     $-3
#endasm




C 语言中定义的全局或静态变量寻址是最容易的,因为这些变量的地址已知且固定。按C 语言的语法标准,所有 C 中定义的符号在编译后将自动在前面添加一下划线符“_”,因此,若要在汇编指令中寻址 C 语言定义的各类变量,一定要在变量前加上一“_”符号,我们在上面例 11-9 中已经体现了这一变量引用的法则,因为 FSR 和 INDF 等所有特殊寄存器是以 C 语言语法定义的,因此汇编中需要对其寻址时前面必须添加下划线。

对于 C 语言中用户自定义的全局变量,用行内汇编指令寻址时也同样必须加上“_” ,下面的例 11-10 说明了具体的引用方法
volatile unsigned char tmp; //定义位于bank0的字符型全局变量

void Test(void)     //测试程序
{
       #asm      //开始行内汇编
       clrf     _STATUS    //选择bank0
       movlw    0x10    //设定初值
       movwf    _tmp    //tmp=0x10
       #endasm     //结束行内汇编
       if (tmp==0x10) {    }; //开始C语言程序

0 0
原创粉丝点击