实验二 _C语言程序和C调用汇编程序实验

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验二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。

//--------------------------------------------------------------

//程序清单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,READONL Y

EXPORT doadd

doadd ADD R0,R0,R1

相关文档
最新文档