1 / 26
文档名称:

第5章 c及汇编语言的混合编程.ppt

格式:ppt   大小:592KB   页数:26页
下载后只包含 1 个 PPT 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

第5章 c及汇编语言的混合编程.ppt

上传人:350678539 2022/7/3 文件大小:592 KB

下载得到文件列表

第5章 c及汇编语言的混合编程.ppt

相关文档

文档介绍

文档介绍:第5章 C及汇编语言的混合编程
第一页,共26页。
第五章 C/C++及汇编语言的混合编程
ARM C/C++编译器
在C/C++程序中内嵌汇编指令
从汇编程序中访问C程序变量
汇编程序、C保存子程序的返回地址。
寄存器R15是程序计数器,记作PC
第八页,共26页。
ATPCS中各寄存器的使用规则及其名称
第九页,共26页。
ATPCS中各寄存器的使用规则及其名称
参数传递规则
参数不超过4个时,可以使用寄存器R0~R3来传递参数,当参数超过4个时,还可以使用数据栈来传递参数。
结果为一个32位整数时,可以通过寄存器R0返回
结果为一个64位整数时,可以通过寄存器R0和R1返回,依次类推。
第十页,共26页。
汇编程序、C程序及C++程序相互调用
C 程序调用汇编程序:
汇编程序的设置要遵循ATPCS 规则,保证程序调用时参数的正确传递。
在汇编程序中使用EXPORT 伪指令声明本子程序,使其它程序可以调用此子程序。
在C 语言程序中使用extern 关键字声明外部函数(声明要调用的汇编子程序),即可调用此汇编子程序。
第十一页,共26页。
汇编程序、C程序及C++程序相互调用
C程序调用汇编程序
调用汇编的C 函数:
#include <>
extern void strcopy(char *d,const char *s) //声明外部函数,即要调用的汇编
//子程序
int main(void)
{
const char *srcstr=“First string-source”; //定义字符串常量
char dstsrt[] =“Second string-destination”;//定义字符串变量
printf(“Before copying:\n”);
printf(“’%s’\n ‘%s\n,”srcstr,dststr); //显示源字符串和目标字符串的内容
strcopy(dststr,srcstr); //调用汇编子程序,R0=dststr,R1=srcstr
printf(“After copying:\n”)
printf(“’%s’\n ‘%s\n,”srcstr,dststr); //显示strcopy 复制字符串结果
return(0);
}
第十二页,共26页。
汇编程序、C程序及C++程序相互调用
C程序调用汇编程序
被调用汇编子程序:
AREA SCopy,CODE,READONLY
EXPORT strcopy ;声明汇编程序strcopy,以便外部程序引用
strcopy ;R0 为目标字符串的地址
;R1 为源字符串的地址 ;
LDRB R2,[R1],#1 ;读取字节数据,源地址加1
STRB R2,[R0],#1 ;保存读取的1 字节数据,目标地址加1
CMP r2,#0 ;判断字符串是否复制完毕
BNE strcopy ;没有复制完毕,继续循环
MOV pc,lr ;返回
END
第十三页,共26页。
汇编程序、C程序及C++程序相互调用
汇编程序调用C程序
汇编程序的设置要遵循ATPCS 规则,保证程序调用时参数的正确传递.
在汇编程序中使用IMPORT 伪指令声明将要调用的C 程序函数.
在调用C 程序时,要正确设置入口参数,然后使用BL 调用.
第十四页,共26页。
汇编程序、C程序及C++程序相互调用
汇编程序调用C程序
汇编调用C 程序的C 函数:
/*函数sum5()返回5 个整数的和*/
int sum5(int a,lit b, int c,int d,int e)
{
return(a+b+c+d+e); //返回5 个变量的和
}
第十五页,共26页。
汇编程序、C程序及C++程序相互调用
汇编程序调用C程序
汇编调用C 程序的汇编程序
AREA sample, CODE,READONLY
IMPORT sum5 ;声明外部标号sum5,即C 函数sum5()
CALLSUM
STMFD SP! {LR} ;LR 寄存器放栈
ADD R1,R0,R0 ;设置sum5 函数入口参数,R0 为参数a
ADD R2,R1,R0