- 1、本文档共56页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
嵌入式系统汇编语言和C语言相互转换、中断
02a 汇编和C语言的相互调用
主要内容:
C语言的编译过程
C语言程序→汇编语言程序→目标可执行程序
汇编语言的函数调用过程
参数准备
函数返回
汇编函数间调用
函数调用举例
C语言调用汇编函数
汇编语言调用C语言函数
命令脚本文件和链接脚本文件
C和汇编语言混合编程
C语言程序→汇编语言程序→目标可执行程序
C程序先要转化为汇编程序,意味着C和汇编语言混合编程时,最终可以从汇编语言之间的相互调用过程着眼
C语言函数→汇编函数
int test_fun(paras...){
[处理过程]
}
test_fun:
mov ip, sp
stmdb sp!, {fp, ip, lr, pc}
sub fp, ip, #4 ; 0x4
[处理过程]
ldmdb fp, {fp, sp, pc}
函数名转化 为标号
栈回溯结构
退出
fp (r11): Frame Pointer
ip (r12):
sp (r13): Stack Pointer
lr (r14): Link Register
pc (r15): Program Counter
ip →外层函数的栈顶
fp →当前函数的栈底
参数个数≤4时 - 输入参数
在函数体内使用参数(4个参数见下表)
别名
寄存器
说明
a1
r0
参数1
a2
r1
参数2
a3
r2
参数3
a4
r3
参数4
参数个数≤4时 - 返回值
函数结束时,应将返回值存放到r0中
用汇编语言编写函数举例(参数个数≤4)
C语言函数total_fun(int p1,int p2,int p3),返回三数之和,用汇编语言实现
total_fun: /* 函数名由标号替代 */
mov ip, sp /* 栈回溯结构 */
stmdb sp!, {fp, ip, lr, pc}
sub fp, ip, #4
add a1,a1,a2 /* 实现p1+p2,存放在r0中 */
add a1,a1,a3 /* 实现p1+p2+p3,存放在r0中 */
ldmdb fp, {fp, sp, pc} /* 返回 */
汇编语言调用函数(参数个数≤4)
如何准备函数参数
将参数依次直接存入R0-R3
如何获得函数返回值
从寄存器R0中读取
举例:
mov r0,#1 /* 准备参数1 */
mov r1,#2 /* 准备参数2 */
mov r2,#3 /* 准备参数3 */
bl total_fun /* 调用刚编写的求和函数*/
/* 此时,r0中的值应该是6 */
参数个数4时 - 输入参数
test_fun:
mov ip, sp
stmdb sp!, {fp, ip, lr, pc}
sub fp, ip, #4 ; 0x4
sub sp, sp, #32
[处理过程]
ldmdb fp, {fp, sp, pc}
ip →外层函数体的栈顶
fp →当前函数体的栈底
sp→当前函数体的栈顶
#32→当前函数所用栈容量
当前函数所用栈容量
临时变量个数+函数参数个数多于4个的部分
例如:
int foo(int x1,int x2){ int a,b,c; /* 3个临时变量 */ }
其使用的栈容量=3
int foo(int x1,int x2, int x3, int x4, int x5){ int a,b,c; /* 3个临时变量 */ ...}
其使用的栈容量=3+(5-4) = 4
当前函数内存布局
外层函数栈顶
当前函数栈顶
子函数参数5
子函数参数6
子函数参数:由顶开始依次存放
pc
fp
ip
lr
现场信息
函数变量
子函数参数
函数变量2
函数变量1
函数中的临时变量:由底开始依次存放
ip
fp
ip →外层函数体的栈顶
fp →当前函数体的栈底
当前函数内存布局 - 思考题
如果当前函数有多个子函数,那么它的内存布局是如何的?
例如:
int foo(){ int x1,x2,x3,x4,x5,x6; foo1(x1,x2); foo2(x1,x2,x3,x4); foo3(x1,x2,x3,x4,x5,x6);}
子函数参数5
子函数参数6
pc
fp
ip
lr
函数变量
子函数参数
函数变量2
函数变量1
C语言调用汇编函数
1 extern int unsigned
2 total_fun(int p1,int p2, int p3);
3 int test(){
4 int y;
5 y = total_fun(1,2,3);
6 return y;
7 }
1 .global total
文档评论(0)