嵌入式系统汇编语言和C语言相互转换、中断.ppt

嵌入式系统汇编语言和C语言相互转换、中断.ppt

  1. 1、本文档共56页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

bodkd + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档