大学课件16位单片机及语音嵌入式系统-赵定远-第4章 程序设计.pptVIP

大学课件16位单片机及语音嵌入式系统-赵定远-第4章 程序设计.ppt

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
大学课件16位单片机及语音嵌入式系统-赵定远-第4章 程序设计

汇编调用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)

文档评论(0)

ctuorn0371 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档