C及汇编语言的混合编程.ppt

C及汇编语言的混合编程.ppt

ID:56527481

大小:215.00 KB

页数:29页

时间:2020-06-27

C及汇编语言的混合编程.ppt_第1页
C及汇编语言的混合编程.ppt_第2页
C及汇编语言的混合编程.ppt_第3页
C及汇编语言的混合编程.ppt_第4页
C及汇编语言的混合编程.ppt_第5页
资源描述:

《C及汇编语言的混合编程.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、7.1ARMC/C++编译器7.2在C/C++程序中内嵌汇编指令7.3从汇编程序中访问C程序变量7.4汇编程序、C程序及C++程序相互调用7.5嵌入式C编程第七讲C/C++及汇编语言的混合编程17.1ARMC/C++编译器ARM集成开发环境中包含的C/C++编译器:编译器名称编译器种类源文件类型源文件后缀输出目标文件类型armccCC*.C32位ARM代码tccCC*.C16位Thumb代码armcppC++C/C++*.C/*.C++32位ARM代码tcppC++C/C++*.C/*.C++16位Thumb代码27.2在C/C++程序中内嵌汇编指令在C

2、C++程序中使用内嵌的汇编指令的语法格式:在ARMC语言程序中,使用关键字__asm来标识一段汇编指令程序。__asm{汇编语言程序~~~~~~~~汇编语言程序}其中:如果一行中有多个汇编指令,指令之间使用分号(;)分开。在一条指令占多行,要使用续行符号().37.2在C/C++程序中内嵌汇编指令在C/C++程序中内嵌汇编指令注意事项:必须小心使用物理寄存器,如R0~R3,SP,LR和CPSR中的N,Z,C,V标志位.因为计算汇编代码中的C表达式时,可能会使用这些物理寄存器,并会修改N,Z,C,V标志位。__asm{MOVR0,xADDy,R0,x/

3、y//计算x/y时R0会被修改}在计算x/y时R0会被修改,从而影响R0+x/y的结果.47.2在C/C++程序中内嵌汇编指令在C/C++程序中内嵌汇编指令注意事项:用一个C程序的变量代替R0就可以解决这个问题:__asm{MOVvar,xADDy,var,x/y}注意:内嵌汇编器探测到隐含的寄存器冲突就会报错.57.2在C/C++程序中内嵌汇编指令在C/C++程序中内嵌汇编指令注意事项:不要使用寄存器代替变量.尽管有时寄存器明显对应某个变量,但也不能直接使用寄存器代替变量.intbad_f(intx)//x存放在R0中{__asm{ADDR0,R0,#

4、1//发生寄存器冲突,实际上x的值没有变化}return(x);}尽管根据编译器的编译规则似乎可以确定R0对应x,但这样的代码会使内嵌汇编器认为发生了寄存器冲突.67.2在C/C++程序中内嵌汇编指令在C/C++程序中内嵌汇编指令注意事项:这段代码的正确写法如下:intbad_f(intx){__asm{ADDx,x,#1}return(x);}77.3从汇编程序中访问C程序变量在C程序中声明的全局变量可以被汇编程序通过地址间接访问。具体访问方法如下:使用IMPORT伪指令声明这个全局变量。使用LDR指令读取该全局变量的内存地址,通常该全局变量的内存地址

5、存放在程序的数据缓冲池中。根据该数据类型,使用相应的LDR指令读取该全局变量的值;使用相应的STR指令修改该全局变量的值。87.3从汇编程序中访问C程序变量例如:C语言源程序str.c如下:#includeintglobvar=3;//定义一个整型全局变量intmain(){return0;}97.3从汇编程序中访问C程序变量例如:汇编源文件hello.s:AREAglobals,CODE,READONLYEXPORTasmsubIMPORTglobvar;声明外部变量globvarasmsubLDRR1,=globvar;装载变量地址

6、LDRR0,[R1];读出数据ADDR0,R0,#2;修改R0的值STRR0,[R1];保存变量值MOVPC,LREND10C程序与汇编程序互相调用规则寄存器的使用规则子程序间通过寄存器R0~R3来传递参数。在子程序中,使用寄存器R4~R11来保存局部变量。寄存器R12用于子程序间scratch寄存器(用于保存SP,在函数返回时使用该寄存器出桟),记作IP。寄存器R13用于数据栈指针,记作SP。寄存器SP在进入子程序时的值和退出子程序时的值必须相等。寄存器R14称为链接寄存器,记作LR。它用于保存子程序的返回地址。寄存器R15是程序计数器,记作PC11A

7、TPCS中各寄存器的使用规则及其名称12ATPCS中各寄存器的使用规则及其名称参数传递规则参数不超过4个时,可以使用寄存器R0~R3来传递参数,当参数超过4个时,还可以使用数据栈来传递参数。结果为一个32位整数时,可以通过寄存器R0返回结果为一个64位整数时,可以通过寄存器R0和R1返回,依次类推。137.4汇编程序、C程序及C++程序相互调用C程序调用汇编程序:汇编程序的设置要遵循ATPCS规则,保证程序调用时参数的正确传递。在汇编程序中使用EXPORT伪指令声明本子程序,使其它程序可以调用此子程序。在C语言程序中使用extern关键字声明外部函数(声

8、明要调用的汇编子程序),即可调用此汇编子程序。14C程序调用汇编程序(调用汇编的

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。