回答

收藏

atmel studio C语言与汇编混合编程

其他 其他 7555 人阅读 | 0 人回复 | 2013-01-08

本帖最后由 lianlei 于 2013-1-8 09:55 编辑

在Atme studio 6中如果需要使用汇编语言和C语言混合编程,还是比较麻烦的,这里通过查看avr-libc-user-manual.pdf文件的第七章 Inline Assembler Cookbook简单介绍一下在混合编程的一写方法,也算是抛砖引玉,希望能得到高手的点评。
1、C函数中内嵌汇编函数

  1. void delay(uint8_t ms)
  2. {
  3. uint16_t cnt;
  4. asm volatile (
  5. "\n"
  6. "L_dl1%=:" "\n\t"
  7. "mov %A0, %A2" "\n\t"
  8. "mov %B0, %B2" "\n"
  9. "L_dl2%=:" "\n\t"
  10. "sbiw %A0, 1" "\n\t"
  11. "brne L_dl2%=" "\n\t"
  12. "dec %1" "\n\t"
  13. "brne L_dl1%=" "\n\t"
  14. : "=&w" (cnt)
  15. : "r" (ms), "r" (delay_count)
  16. );
  17. }
复制代码
在例子中介绍了我们在C语言中定义一个变量cnt,而在汇编语言中如何使用这个变量。

2、在汇编中使用C语言名
默认情况下,AVR-GCC使用相同的的符号名在C语言和汇编代码的函数或变量。
您可以指定一个不同的名称为汇编代码中使用一种特殊形式的汇编语句:
  1. unsigned long value asm("clock") = 3686400;
复制代码
上面的语句指明,汇编器使用clock名称,而不是使用value名称。
在AVRGCC中,也可以会使用一个特殊的寄存器,如:
  1. void Count(void)
  2. {
  3. register unsigned char counter asm("r3");
  4. ... some code...
  5. asm volatile("clr r3");
  6. ... more code...
复制代码
上面的clr r3就是清零变量counter,系统在编译时会保留r3寄存器。
3、如果我们有一个汇编函数,想在C函数中调用这个汇编函数,使用如下的方式,就可以实现C语言调用汇编函数
  1. extern long Calc(void) asm ("CALCULATE");
复制代码
当在C语言中调用Calc函数时,调用的函数就是汇编函数CALCULAE

ok,关于C和汇编混合编程就到这了,不足之处还望指点,如需了解详细的参考avr-libc-user-manual.pdf文件的第七章 Inline Assembler Cookbook。

分享到:
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条