大学课件16位单片机及语音嵌入式系统-赵定远-第4章 程序设计.ppt
文本预览下载声明
汇编调用C的函数 : // 描述: 汇编调用C的函数 .EXTERNAL _F_Sub_C .CODE .PUBLIC _main; // 函数: main() // 描述:主函数 _main: R1 = 1; PUSH R1 TO [SP]; //第3个参数入栈 R1 = 2; PUSH R1 TO [SP]; //第2个参数入栈 R1 = 3; PUSH R1 TO [SP]; //第1个参数入栈 CALL _F_Sub_C; POP R1,R3 FROM [SP]; //弹出参数回复SP指针 GOTO _main; RETF; //void F_Sub_C(int i,int j,int k); 来自于asm.c。延时程序,入口参数i,j,k;返回i // main.asm 结束 C语言子函数如下: //函数: F_Sub_C() //语法:void F_Sub_C(int i,int j,int k) //描述:延时程序 //参数:i,j,k //返回:i int F_Sub_C(int i,int j,int k) { i++; j++; k++; return i; } C语言的嵌入式汇编 : 为了使C语言程序具有更高的效率和更多的功能,需在C语言程序里嵌入用汇编语言编写的子程序。一方面是为提高子程序的执行速度和效率;另一方面,可解决某些用C语言程序无法实现的机器语言操作。而C语言代码与汇编语言代码的接口是任何C编译器毋庸置疑要解决的问题。 通常,有两种方法可将汇编语言代码与C语言代码联合在一起。一种是把独立的汇编语言程序用C函数连接起来,通过API (Application Program Interface) 的方式调用;另一种就是我们下面要讲的在线汇编方法,即将直接插入式汇编指令嵌入到C函数中。 GCC的基本数据类型 采用GCC规定的在线汇编指令格式进行指令的输入,是GCC实现将μ’nSP?汇编指令嵌入C函数中的方法。GCC在线汇编指令格式规定如下: asm (“汇编指令模板”:输出参数:输入参数:clobbers参数); 若无clobber参数,则在线汇编指令格式可简化为: asm (“汇编指令模板”:输出参数:输入参数); 1) 汇编指令模板 模板是在线汇编指令中的主要成分,GCC据此可在当前位置产生汇编指令输出。例如,下面一条在线汇编指令: asm (%0 += %1 : +r (foo) : r (bar)); 此处,%0 += %1就是模板。其中,操作数%0、%1作为一种形式参数,分别会由第一个冒号后面实际的输出、输入参数取代。带百分号的数字表示的是第一个冒号后参数的序号。 如下例: asm (%0 = %1 + %2 : =r (foo) : r (bar), i (10)); %0会由参数foo取代,%1会由参数bar取代,而%2则会由数值10取代。 在汇编输出中,一个汇编指令模板里可以挂接多条汇编指令。其方法是用换行符\n来结束每一条指令,并用Tab键符\t将同一模板产生在汇编输出中的各条指令在换行显示时缩进到同一列,以使汇编指令显示清晰。如下例: asm (%0 += %1\n\t%0 += %1 : +r (foo) : r (bar)); 2) 操作数 在线汇编指令格式中,第一冒号后的参数为输出操作数,第二冒号后的参数为输入操作数,第三冒号后跟着的则是clobber操作数。在各类操作数中,引号里的字符代表的是其存储类型约束符;括弧里面的字符串表示的是实际操作数。 如果输出参数有若干个,可用逗号“,”将每个参数隔开。 同样,该法则适用于输入参数或clobber参数。 3) 操作数约束符 约束符的作用在于指示GCC,使用在汇编指令模板中的操作数的存储类型。表4.9列出了一些约束符和它们分别代表的操作数不同的存储类型,也列出了用在操作数约束符之前的两个约束符前缀。 操作数存储类型约束符及约束符前缀 利用嵌入式汇编实现对端口寄存器的操作 : 在C的嵌入式汇编中,当使用端口寄存器名称时,需要在C文件中加入汇编的包含文件,如下所示: asm(“.include hardware.inc”); 那么,我们就可以使用端口寄存器的名称,而不必去使用端口的实际的地址 1)
显示全部