微处理器系统结构与嵌入式系统-第九单元.pptVIP

微处理器系统结构与嵌入式系统-第九单元.ppt

  1. 1、本文档共69页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long C程序中嵌入汇编代码 ARM体系结构支持C、C++以及汇编语言的混合使用,内嵌汇编器还允许在C程序中嵌入汇编代码,以提高程序的效率。 在ARM C语言程序中使用关键词_asm来标识一段汇编指令程序,其格式如下: _asm { instruction [; instruction] …… [instruction] } 如果一行有多个汇编指令,则指令之间用分号隔开; 如果一条指令占多行,则要使用续行符号(\); 在汇编指令段中可以使用C语言的注释语句。 内嵌汇编中使用物理寄存器的注意事项1 一般不要直接指定物理寄存器存放数据,而应该使用C变量,让编译器自动分配寄存器。 _asm /*错误 { MOV R0, x ADD y, R0, x/y } int cvar; _asm /*正确 { MOV cvar, x ADD y, cvar, x/y } C编译器计算x/y值时会破坏R2,R3,R12和LR的值;更新N,Z,C和V条件标志位;并在R0中返回商,R1中返回余数。因此左边代码段中R0存放的数据在执行ADD指令前已被修改。 建议也不要使用复杂的C表达式,因为编译器在计算汇编代码中的C表达式时,可能会使用物理寄存器(如R0~R3、 R12、SP、LR ) ,并修改CPSR中的标志位。如果编译器无法分配使用合适的寄存器,将会报告寄存器冲突错误。 不要使用物理寄存器代替变量。尽管有时寄存器明显对应某个变量,但也不能直接使用寄存器代替变量。 */52 内嵌汇编中使用物理寄存器的注意事项2 int example1(int x) /*错误 { _asm { ADD R0, R0, #1 } return x; } int example1(int x) /*正确 { _asm { ADD x, x, #1 } return x; } 进入子程序example1后,参数x的值的确保存在寄存器R0中,但编译器认为内嵌汇编发生了寄存器冲突,可能使用其他寄存器存放x。因此左边代码段并不能完成对x的加1操作。 内嵌汇编语言中其他的注意事项 内嵌汇编指令可以使用C表达式,编译器会计算表达式的值并为其分配寄存器。但其值被视为无符号数;若为带符号数则用户需要自己处理与符号有关的操作; 若内嵌汇编指令中的C表达式包含有逗号,则该表达式应该包含在括号中; 如: _asm{ADD x, y, (f(), z)} ; (f(), z)为C表达式 内嵌汇编指令中常量前面的“#”可以省略,并使用“0x”代替“” 表示十六进制数; 不支持内存分配伪指令,可通过定义变量由编译器自动完成分配; 不支持BX指令,并且只有B指令可以使用C程序标号,而BL不行; 不能向PC赋值,程序跳转只能使用B或BL指令; 内嵌的SWI和BL指令除了正常的操作数外,可增加几个可选的寄存器列表用于参数传送; …… 内嵌汇编指令的应用举例:两个数相加 #include stdio.h int add(int i, int j) { int res; /*定义中间变量res*/ __asm { ADD res, i, j // ;实现res=i+j } return res; } void main( ) { int a; a = add(2,3); printf(addition result is : %d\n,a); } 求和子程序 调用子程序(注意书上漏印) 例9.10所示程序在RVDS上的运行结果 作业 必做:9.2-9.5、 9.8、 9.15-9.18 选做:9.6、9.7、9.12、9.14

文档评论(0)

精品课件 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档