- 1、本文档共33页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
汇编语言与C的混合编程.ppt
3.汇编程序调用C程序 汇编程序的设计要遵守ATPCS,保证程序调用时参数的正确传递。在汇编程序中使用IMPORT伪操作声明将调用C程序。下面是一个汇编程序调用C程序的例子。其中在汇编程序中设置好各参数的值,本例中有5个参数,分别使用寄存器R0存放第1个参数,R1存放第2个参数,R2存放第三个参数,R3存放第4个参数,第5个参数利用数据栈传送。注意若利用数据栈传递参数,则在程序中调用结束后要调整数据栈指针。本例中程序如下: //C程序 /*函数sum5()返回5个整数的和*/ int sum5(int a,int b,int c,int d,int e) { return(a+b+c+d+e); } ;汇编程序 ;调用C程序sum5计算5个整数i,2*i,3*i,4*i,5*i的和 EXPORT CALLSUM5 ;声明外部标号sum5,即C函数sum5() AREA Example,CODE,READONLY IMPORT sum5 CALLSUM5 STMFD SP!,{LR} ;LR寄存器入栈 ADD R1,R0,R0 ;设置sum5函数入口,R0为参数a ADD R2,R1,R0 ;R1为参数b,R2为参数c ADD R3,R1,R2 ;参数e要通过堆栈传递 STR R3,[SP,#-4]! ;R3为参数d BL sum5 ;调用sum5(),结果保存在R0 ADD SP,SP,#4 ;修正SP指针 LDMFD SP!,{PC} ;子程序返回 END 嵌入式系统中汇编语言与C语言的混合编程 1内嵌汇编器 内嵌汇编器指的是包含在C编译器中的汇编器。使用内嵌汇编器后,就可以在C源程序中直接使用大部分的ARM指令和Thumb指令,可以在C程序中实现C语言不能够完成的一些操作,同时程序的代码效率也比较高。 内嵌汇编器的汇编指令包括大部分ARM指令和Thumb指令,但由于它嵌入在C程序中使用,故在用法上有一些特点。 1.1操作数 内嵌的汇编指令中作为操作数的寄存器和常量可以是C表达式。这些表达式可以是char、short或者int类型,而且这些表达式都是作为无符号数进行操作。如果需要带符号数,则用户需要自己处理与符号有关的操作。编译器将会计算这些表达式的值,并为其分配寄存器。 当汇编指令中同时用到了物理寄存器和C的表达式时,要注意使用的表达式不要过于复杂。因为表达式过于复杂时,将会需要较多的物理寄存器,这些寄存器可能与指令中的物理寄存器的使用冲突。当编译器发现了寄存器的分配冲突时,会产生相应的错误信息,报告寄存器分配冲突。 1.2物理寄存器 在内嵌的汇编指令中使用物理寄存器有一下限制: 不能直接向PC寄存器中赋值,程序的跳转只能通过B指令和BL指令实现。 在使用物理寄存器的内嵌汇编指令中,不要使用过于复杂的C表达式,因为当表达式过于复杂时,将会需要较多的物理寄存器,这些寄存器可能与指令中的物理寄存器的使用冲突。 编译器可能会使用R1寄存器或者R13寄存器存放编译的中间结果,在计算表达式值时可能会将寄存器R0~R3、R2以及R14用于子程序的调用。因此在内嵌的汇编指令中,不要将这些寄存器同时指定为指令中的物理寄存器。 在内嵌的汇编指令中使用物理寄存器时,如果有C变量使用了该物理寄存器,编译器将在合适的时候保存并恢复该变量的值。需要注意的是,当寄存器sp、sl、fp以及sb用做特定的用途时,编译器不能恢复这些寄存器的值。 通常推荐在内嵌的汇编指令中不要指定物理寄存器,因为这可能会影响编译器分配寄存器,进而可能影响代码的效率。 1.3常量 在内嵌的汇编指令中,常量前的符号#可以省略。如果在一个表达式前使用#,则该表达式必须是一个#。 1.4指令展开 内嵌的汇编指令中如果包含常量操作数,则该指令可能会被汇编器展开成几条指令。例如指令: ADD R0,R0,#1023 可能会被展开成下面的指令序列 ADD R0,R0,#1024 SUB R0,R0,#01 乘法指令MUL可能会被展开成一系列的加法操作和移位操作。 事实上,除了与协处理器相关的指令外,大部分的ARM指令和Thumb指令中包含常量操作数都可能被展开成多
文档评论(0)