5.5 汇编与C语言相互调用实例
5.5.1 实验目的
(1)阅读S3C2410启动代码,观察处理器的启动过程.
(2)学会使用MDK集成开发环境辅助窗口来分析和判断调试的过程和结果.
(3)学会在MDK集成开发环境中编写、编译与调试汇编和C语言相互调用的程序.
5.5.2 实验设备
(1)硬件:PC.
(2)软件:μVision IDE for ARM集成开发环境,Windows 98/2000/NT/XP.
5.5.3 实验内容
使用汇编完成一个随机数产生函数,通过C语言调用该函数,产生一系列随机数,存放到数组里面.
5.5.4 实验原理
ARM过程调用ATPCS(ARM).
ATPCS是一系列用于规定应用程序之间相互调用的基本规则,这些规则包括:
支持数据栈限制检查;
支持只读段位置无关(ROPI);
支持可读/写段位置无关(RWPI);
支持ARM程序和Thumb程序的混合使用;
处理浮点运算.
使用以上规定的ATPCS规则时,应用程序必须遵守如下:
程序编写遵守ATPCS;
变量传递以中间寄存器和数据栈完成;
汇编器使用-apcs开关选项.
关于其他ATPCS规则,用户可以参考ARM处理器相关书籍或登录ARM公司网站.
程序只要遵守ATPCS相应规则,就可以使用不同的源代码编写程序.程序间的相互调用最主要的是解决参数传递问题.应用程序之间使用中间寄存器及数据栈来传递参数,其中,第一个到第四个参数使用R0~R3,多于四个参数的使用数据栈进行传递.这样,接收参数的应用程序必须知道参数的个数.
但是,在应用程序被调用时,一般无从知道所传递参数的个数.不同语言编写的应用程序在调用时可以自定义参数传递的约定,使用具有一定意义的形式来传递,可以很好地解决参数个数的问题.常用的方法是把第一个或最后一个参数作为参数个数(包括个数本身)传递给应用程序.
ATPCS中寄存器的对应关系如表5-2所列:
表5-2 ATPCS规则中寄存器列表
续表
5.5.5 实验操作步骤
(1)参考5.1.5小节实验的操作步骤建立一个新的工程,命名为explasm,注意在建立工程的过程中添加设备数据库中S3C2410芯片自带的启动代码,也可手动添加启动代码startup.s.
(2)参考5.1.5小节实验的步骤和实验参考程序编辑输入源代码,保存文件为randtest.c和random.s.
(3)在Project workspace工作区中右击target1→Source Group 1,在弹出菜单中选择" Add file to Group'Source Group 1'",在随后弹出的文件选择对话框中,选择刚才建立的源文件randtest.c和random.s.
(4)在Option for Target对话框Linker页Scatter File对话框中添加分散加载描述文件explasm.sct,文件内容与5.5.6小节CTest2.sct相同.
(5)选择菜单项Project→Build target或快捷键F7,生成目标代码.
(6)选择菜单项Debug→Start/Stop Debug Session或快捷键Ctrl+F5,即可进入调试模式.这里使用的是μVision3IDE中的软件仿真器.
(7)选择菜单项Debug→run或F5,即可运行代码.
(8)打开memory、register、watch、Local窗口,单步执行,并通过memory、register、watch、variable窗口分析判断结果.注意观察程序如何从跳转进主程序_main,在call stack窗口观察当前执行函数之间的调用.
(9)结合实验内容和相关资料,观察程序运行.
(10)理解和掌握实验后,完成实验练习题.
5.5.6 实验参考程序
(1)randtest.c参考源代码.
(2)random.s参考源代码.
5.5.7 练习题
使用嵌入汇编语言实现R1+R2=R0的加法运算,运算结果保存在R0.调试时打开Register窗口,观察嵌入汇编语句运行前后R0、R1、R2、SP寄存器以及ATPCS寄存器对应的ARM寄存器内容的变化.
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。