实验二 C语言程序和C调用汇编程序实验
一、实验目的
了解ARM 启动过程,学会使用ADS 编写简单的C 语言程序
掌握C 语言调用汇编程序,并进行调试的方法
二、实验设备
硬件:嵌入式实验平台一套、仿真器一个、PC机一台。
软件:Windows XP 操作系统、仿真器驱动程序、ADS开发软件一套。
三、实验内容
在C 语言程序中调用汇编子程序,实现计算1+2+3+…+(N-1)+N 的值(N>0)的加法运算。汇编子程序实现两个数的加法运算,其原型为:uint32 doadd(uint32 x,uint32 y),其中uint32 已定义为unsigned int 。
四、实验原理
(1)作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但重要性却勿
庸置疑,因为它能够完成许多其它语言所无法完成的功能。就拿 Linux 内核来讲,虽然绝
大部分代码是用 C 语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中
主要是在 Linux 的启动部分。由于这部分代码与硬件的关系非常密切,即使是 C 语言也会有些力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能。大多数情况下 Linux 程序员不需要使用汇编语言,因为即便是硬件驱动这样的底层程序在 Linux 操作系统中也可以用完全用 C 语言来实现,再加上 GCC 这一优秀的编译器目前已经能够对最终生成的代码进行很好的优化,的确有足够的理由让我们可以暂时将汇编语言抛在一边了。但实现情况是 Linux 程序员有时还是需要使用汇编,或者不得不使用汇编,理由很简单:精简、高效和 libc 无关性。假设要移植 Linux 到某一特定的嵌入式硬件环境下,首先必然面临如何减少系统大小、提高执行效率等问题,此时或许只有汇编语言能帮上忙了。
汇编语言直接同计算机的底层软件甚至硬件进行交互,它具有如下一些优点:
能够直接访问与硬件相关的存储器或 I/O 端口;
能够不受编译器的限制,对生成的二进制代码进行完全的控制;
能够对关键代码进行更准确的控制,避免因线程共同访问或者硬件设备共享引起的死锁;
能够根据特定的应用对代码做最佳的优化,提高运行速度,能够最大限度地发挥硬件的功能。
同时还应该认识到,汇编语言是一种层次非常低的语言,它仅仅高于直接手工编写二进制的机器指令码,因此不可避免地存在一些缺点:
编写的代码非常难懂,不好维护;
很容易产生 bug,难于调试;
只能针对特定的体系结构和处理器进行优化;
开发效率很低,时间长且单调。
(2)混合编程的一般方法有三种:一是对C 程序编译后形成的汇编程序进行手工的修改与优化。二是直接在C 语言程序中嵌入汇编语句。三是分别编写C 程序和汇编程序,再独立编译成目标代码模块,再进行链接。
第一种编程方式要求对汇编与C 语言都极其熟悉,并且这样的编程方式对程序的可读性和扩展性的负面影响比较大。
第二种方法适用于语句执行频率非常高,并且C 编程与汇编编程效率差异较大的情况,例如进入中断的通用中断子程序等。
第三种方式是混合编程最常用的方式之一。在这种方式下,C 程序与汇编程序均可使用另一方定义的函数与变量。变量定义是混合编程的基本问题。C 程序与汇编程序定义的变量相互之间可以进行访问。在汇编程序中定义时,需要在变量前加下划线“_”,然后再用.global定义为全局变量。在C 程序中则需要说明为extern变量。
五、实验操作步骤
1.启动ADS1.2,使用ARM Execuatable Image 工程模板新建一个工程;
2.建立源文件test2.c 和tasm.S,编写实验程序,添加到工程中;
3.编译链接选项的设置同前面实验;
4.编译链接工程,点击Debug 按钮,启动AXD 进行调试;
5.在test2.c 的“sum=doadd(sum,i)”处设置断点,然后全速运行程序;
6.程序在断点处停止。单步运行程序,判断程序是否跳转到tasm.S 汇编程序中运行;
7.选择【Processor Views】->【Variables】打开变量观察窗口,观察全局变量sum 的值,单步/全速运行程序,判断程序的运行结果是否正确。
11. 理解并掌握本实验原理及程序,完成练习题
六、实验参考程序
C 语言实验的参考程序见程序清单1。
//--------------------------------------------------------------
汇编语言转c语言的软件//程序清单1 C 语言实验参考程序
#define uint8 unsigned char
#define uint32 unsigned int
#define N 100
extern uint32 doadd(uint32 x,uint32 y);
uint32 sum;
void Main(void)
{
uint32 i;
sum=0;
for(i=0;i<=N;i++)
{
sum=doadd(sum,i);
}
while(1);
}
;//------------------------------------------------------
程序清单2 汇编加法函数代码
;加法函数,原型为uint32 doadd(uint32 x,uint32 y)
AREA ASMADD,CODE,READONLY
EXPORT doadd
doadd ADD R0,R0,R1
MOV PC,LR
END
七、练习题
1.在汇编程序中是否可以调用C 语言程序?
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论