ARM学习笔记14——C语言和汇编相互套用

时间:2023-03-09 16:08:48
ARM学习笔记14——C语言和汇编相互套用

  这里,我们要准备两个文件,一个是汇编文件start.S,另一个是C文件led.c。汇编文件套用C文件中的开关灯函数,C文件套用汇编文件中延时函数。

//start.S 

.global led_init 

led_init:    

  @;GPC1CON  

  @;GPC1PUD

loop:  

  mov r0,#    @将1存到寄存器r0中,实现LED开灯效果

  bl led_ops   @调用C文件中的led_ops函数,此时led_ops函数调用的参数会自动从寄存器中取,即r0

   mov r0,#    @将0存到寄存器r0中,实现LED关灯效果

  bl led_ops

   b loop      @执行循环,使LED灯不停闪烁

delay:  

  sub r0,r0,#  

  cmp r0,#  

  bne delay  

  mov pc,lr

  下面是C文件

//led.c 

void led_ops(int a){  

  if(a){   

    volatile int *p=(int *)0xe0200080;   //volatile关键字确保本条指令不会因编译器的优化而省略,且要求每次直接读值,注意这个关键字在嵌入式C中非常重要

    *p=*p | (<<);  

  }

  else{   

    volatile int *p=(int *)0xe0200080;   

    for(int i=;i<;i++){          //执行位清零操作

      *p++=0x00000000;   

    }  

  }  

  delay(0xff0000);             //调用汇编文件中delay标签,执行延时

}

  编译方法如下:arm-linux-gcc led.c -o led.o
           arm-linux-gcc start.S -o start.o
         arm-linux-gcc -nostartfiles -nostdlib start.o led.o