- 1、本文档共69页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 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 * Load ADdRess Load ADdRess long * Load ADdRess Load ADdRess long int g(int a, int b, int c, int d, int e) { return a + b + c + d + e } 在汇编函数f中调用C函数g( ),以实现下面的功能: int f(int i){ return - g(i, 2*i, 3*i, 4*i, 5*i)} EXPORT f AREA f, CODE, READONLY IMPORT g ; 声明g为外部引用符号 STR LR, [SP, #-4]] ; 将断点存入堆栈 ADD R1, R0, R0 ; (R1)=i*2 ADD R2, R1, R0 ; (R2)=i*3 ADD R3, R1, R2 ; (R3)=i*5 STR R3,[SP, #-4]] ; 将(R3)即第5个参数i*5存入堆栈 ADD R3, R1, R1 ; (R3)=i*4 BL g ; 调用C函数g(),返回值在R0中 ADD SP, SP, #4 ; 调整数据栈指针,准备返回 LDR PC, [SP, #4] ; 恢复断点 END * */52 例9.8在RVDS上的运行结果 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; } 进入
文档评论(0)