第3次实验 汇编和C语言的相互调用10082130204 潘云
3汇编和C语言的相互调用(实验报告)
第 PAGE \* Arabic \* MERGEFORMAT 9 页第 PAGE \* Arabic \* MERGEFORMAT 9 页
华东师范大学计算机科学技术系上机实践报告
课程名称:嵌入式系统实践
年级:08级
上机实践成绩:
指导教师:金健
姓名:潘云
创新实践成绩:
上机实践名称:汇编和C语言的相
互调用
学号:10082130204
上机实践日期:2011/3/18
上机实践编号:No.3
组号:2
上机实践时间:2学时
实验目的
阅读Embest EduKit-III启动代码,观察处理器启动过程;
学会使用Embest IDE辅助信息窗口来分析判断调试过程和结果;
学会在Embest IDE环境中编写、编译与调试汇编和C语言相互调用的程序。
实验设备
硬件:PC机
软件:Embest IDE Pro ARM集成开发环境,Windows 7/XP
实验内容
编写一个汇编程序mixop.s
– 实现函数 y=mixop(x1,x2,x3)
– y=x1+x2+x3
– 调用c2.c中的multiply函数
? C程序1:c1.c
– 实现函数void init();
– 作为启动时的起始地址
– 在该函数内要调用mixop函数完成6+40*50,结果存放在变量y中。
? C程序2:c2.c
– 实现函数 y=multiply(x1,x2)
– y=x1*x2
? 提示:init()函数结尾时,设置死循环
实验原理
C和汇编语言混合编程
? C语言程序→汇编语言程序→目标可执行程序
C程序先要转化为汇编程序,意味着C和汇编语言混合编程时,最终可以从汇编语言之间的相互调用过程着眼
参数个数≤4时 - 输入参数
? 在函数体内使用参数(4个参数见下表)
参数个数≤4时 - 返回值
? 函数结束时,应将返回值存放到r0中
汇编语言调用函数(参数个数≤4)
? 如何准备函数参数
– 将参数依次直接存入R0-R3
? 如何获得函数返回值
– 从寄存器R0中读取
当前函数所用栈容量
? 临时变量个数+函数参数个数多于4个的部分
当前函数内存布局
命令脚本文件
? 命令脚本文件
– IDE与目标板连接时
– 软件调试过程中
– 复位目标板后
? 需要集成环境自动完成一些特定的功能:
– 复位目标板、清除看门狗、屏蔽中断寄存器,等等
? 这些功能可以由一组命令序列完成,该命令序列保存在文件中。该文
件称为命令脚本文件。文件后缀一般为.cs
命令脚本文件
? 命令
– GO 执行程序:从当前PC开始执行程序
– MEMWRITE 存储区写
? 向地址0x1000写入值0x5A
? memwrite 0x1000 0x5A
– REFRESH 刷新窗口
– REGWRITE 寄存器写
? 向寄存器PC写入值0x3840
? regwrite pc 0x3840
– RESET 复位目标设备
– STOP 停止执行程序
? 命令脚本文件举例(page 122):
stop ; 一般目标板都会处于运行状态
regwrite sp 0x1000 ;程序刚执行时未初始化堆栈地址
? 命令脚本文件
– 类似于Windows操作系统中的autoexec.bat 自动执行批处理文件
命令脚本文件的设置
链接脚本文件
? 在程序编译时起作用。
? 该文件描述代码链接定位的有关信息,包括代码段,数据段,地址段
等,链接器必须使用该文件对整个系统的代码做正确的定位。
? 在IDE开发环境中使用扩展名*.ld
程序入口地址的设置
? 默认是 global _start 标号处
? 也可以人工指定
连接后代码段的组织(默认情况下)
? 单个文件的情况
– 按源程序编写顺序
? 多个文件的情况
– 入口文件放在最前面,其余文件按字母顺序组织
? 如何查看连接后的代码
– 编译连接后可使用Tool>Disassemble all命令,会在工程的Debug目录下
生成一个objdum文件
实验步骤
参考本章其他实验,创建新的工程;
按照参考程序,根据实验内容,编写源代码文件并分别保存把他们加入工程里面;
参照其他基础实验操作,按照编译->汇编器配置->连接器配置->调试器配置设置新工程,并编译、连接工程;
下载调试文件,打开memory/register/watch/variable/call stack 窗
口,单步执行程序。通过以上窗口,跟踪程序运行,观察分析运行结果,
通过实验学会使用Embest IDE 进行应用程序的开发与调试;
理解和掌握实验后,完成实验练习题。
调试过程、结果和分析
创建新工程,根据实验内容要求