首页 理论教育嵌入式程序设计:AVR单片机与传感器学习指南

嵌入式程序设计:AVR单片机与传感器学习指南

【摘要】:单片机C语言编程中也可以嵌入汇编语言,CVAVR嵌入C语言的方式如下:在一行中使用多条汇编指令可以用“\”分开。C语言程序中也可以调用汇编语言编制的函数,下面这段C语言调用汇编语言的代码,对我们理解单片机的工作过程和原理是非常有益的:这个汇编函数的主要任务是完成两个整型变量及一个无符号字符型变量的求和。

在涉及精确计算指令消耗时间等特殊情况时,最好用汇编语言(Assembly Language)来编写代码。单片机C语言编程中也可以嵌入汇编语言,CVAVR嵌入C语言的方式如下:

在一行中使用多条汇编指令可以用“\”分开。

上面程序中“nop”指令是AVR单片机汇编语言的空执行指令,即什么都不做,只是消耗了一个时钟周期的时间。“sei”是AVR单片机汇编语言的打开全局中断开关的指令,即便在C语言编程时,也是用这条指令打开全局中断的。

C语言程序中也可以调用汇编语言编制的函数,下面这段C语言调用汇编语言的代码,对我们理解单片机的工作过程和原理是非常有益的:

这个汇编函数的主要任务是完成两个整型变量及一个无符号字符型变量的求和。在C语言中调用函数时,将函数中要用到的3个参数压入堆栈。在堆栈中,整型变量占用两个字节,字符型变量占用1个字节内存。变量a先压入堆栈,其次压入变量b,最后变量c被压入堆栈。进入汇编函数后,堆栈指针y指向最后压入堆栈的字节,即变量c,y+1指向变量b的低字节,y+2指向b的高字节,y+3指向变量a的低字节,y+4指向a的高字节。汇编程序先把变量a的高字节和低字节分别送给寄存器R31和R30,然后将b的高字节和低字节分别送给寄存器R27和R26。接着将两个整型变量的高低字节分别相加,结果存在寄存器R31和R30中。最后把字符型变量c扩展为整型,并把高低字节分别送给寄存器R27和R26。同样将上次求和结果与c的高低字节分别相加,最终结果仍然存在寄存器R31和R30中。

CVAVR中规定,汇编函数使用寄存器返回计算结果(从LSB到MSB)如下:(www.chuimin.cn)

R30用于返回字符型和无符号字符型数据;

R30、R31用于返回整型和无符号整型数据;

R30、R31、R22、R23用于返回长整型和无符号长整型数据。

所以这个汇编函数将整型计算结果作为函数返回值,存储在寄存器R30、R31中,而在C语言程序中,直接将寄存器R30、R31中的返回值送给了整型变量r。