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

合集下载

C语言与汇编语言互相调用

C语言与汇编语言互相调用

浅谈C程序中调用汇编模块的方法C语言是目前非常流行的一种编程语言,除具有高级语言使用方便灵活、数据处理能力强、编程简单等优点外,还可实现汇编语言的大部分功能,如可直接对硬件进行操作、生成的目标代码质量较高且执行的速度较快等。

所以在工程上对硬件处理速度要求不很高的情况下,基本可以用C代替汇编语言,编写接口电路的控制软件。

但C也不能完全取代汇编语言,如在一些对速度要求很高的实时控制系统中,以及对硬件的特殊控制方面,C有时也不能完全很好胜任,还需要汇编语言来编写。

因为汇编语言目标代码更精练,对硬件直接控制能力更强和执行速度更快,但汇编语言编程烦难、表达能力差也显而易见。

比较好的解决办法是C与汇编语言混合编程,即用C编写软件的调度程序、用户界面以及速度要求不高的控制部分,而用汇编语言对速度敏感部分提供最高速度的处理模块,供C调用。

这种方法提供了最佳的软件设计方案,做到了兼顾速度效率高和灵活方便。

由于本人的毕业设计需要C 程序中调用汇编模块的方法来提高ARM定点指令的执行速度,故对这方面进行了学习。

学习心得如下:对于C和汇编语言的接口主要有两个问题需要解决。

一、调用者与被调用者的参数传递这种数据传递通过堆栈完成,在执行调用时从调用程序参数表中的最后一个参数开始,自动依次压入堆栈;将所有参数压入堆栈后,再自动将被调用程序执行结束后的返回地址(断点)压入堆栈,以使被调程序结束后能返回主调程序的正确位置而继续执行。

例如一调用名为add汇编程序模块的主函数:main( ){...... add(dest,op1,op2,flages);......}。

在此例中对主函数进行反汇编,主函数在调用add函数前自动组织的堆栈。

...lea 0xfffffffe8(%ebp),%eax #flages数组的首地址入栈push %eaxpushl 0xfffffff8(%ebp) #OP2入栈pushl 0xfffffffc(%ebp) #OP1 入栈pushl 0xfffffff0(%ebp) #dest地址入栈call 0x80483f0 <add> #调用add函数..执行完add调用语句后,栈内数据结果如图一所示。

嵌入式实验(汇编和C语言混合编程实验)

嵌入式实验(汇编和C语言混合编程实验)

嵌入式实验(汇编和C语言混合编程实验)汇编和C语言混合编程实验7.1实验目的①掌握C程序中内嵌指令的使用方法。

②理解汇编程序调用C程序函数和变量的方法。

7.2 实验环境①硬件:PC机②软件:ADS1.27.3 实验内容①使用内嵌汇编的方法设计允许和禁止中断程序。

②验证汇编程序调用C程序函数和访问C程序变量的执行过程。

7.4 实验过程1、实验7-1 允许和禁止中断程序本实验使用内嵌汇编的方法完成允许和禁止中断程序设计,这里使用Armulator 作为调试的目标机。

(1)新建ARM工程exp7_1启动ADS开发环境,选择File→New(Project)选项,使用ARM Executable Image工程模板创建一个工程exp5_1.(2) 新建汇编程序文件exp7_1_1.c,并将其添加到工程exp7_1中选择File→New(File)选项,新建汇编源程序文件exp7_1_1.c并添加到工程exp7_1中,exp7_1_1.c源程序的参考代码如下: #include__inline void enable_IRQ(void) {int tmp;__asm {MRS tmp, CPSRBIC tmp, tmp, #0x80 MSR CPSR_c, tmp } }__inline void disable_IRQ(void) {int tmp; __asm{MRS tmp, CPSR ORR tmp, tmp, #0x80 MSR CPSR_c, tmp } }int main(void) {enable_IRQ( ); disable_IRQ( ); return 0;}(3) 设置工程exp7_1的编译和链接选项选择Edit→DebugRel Settings选项,打开DebugRel Settings对话框,设置工程编译和链接选项,在Language Settings→ARM Assembler选项中,选择Target选项卡,修改处理器类型为ARM920T. (4) 编译和链接工程在工程exp7_1窗口中,选择Make工具按钮,编译和链接工程exp7_1,如果有错误提示,请检查修改程序中的语法错误,直到编译和链接通过。

《c语言程序设计》实验报告(实验-2)

《c语言程序设计》实验报告(实验-2)

《c语⾔程序设计》实验报告(实验-2)《C语⾔程序设计》实验报告2013~2014学年第⼆学期班级姓名学号指导教师实验⼀实验项⽬名称:C程序的运⾏环境和运⾏C程序的⽅法所使⽤的⼯具软件及环境:Visual C++ 6.0⼀、实验⽬的:1.了解在Visual C++ 6.0环境下如何编辑、编译、连接和运⾏⼀个C程序;2.通过运⾏简单的C程序,初步了解C源程序的特点。

⼆、预习内容:教材《C语⾔程序设计教程》第1章。

三、实验内容:1. 在Visual C++ 6.0环境下输⼊并运⾏下⾯的程序:#includeint main( ){printf("This is a C program.\n");return 0;}2. 在Visual C++ 6.0环境下输⼊下⾯的程序(有语法错误),编译、连接、调试该程序,直⾄程序⽆语法错误,然后运⾏程序,并观察分析运⾏结果。

#includeint main( ){int a,b,suma=3;b=4;sun=a+b;print(“%d+%d=%d\n”,a,b,sum);return 0;}四、实验结果:1. 运⾏结果(或截图):This is a C program.Press any key to continue2. (1) 改正后的源程序:#includeint main( ){int a,b,sum;a=3;b=4;sum=a+b;printf("%d+%d=%d\n",a,b,sum);return 0;}(2) 运⾏结果(或截图):3+4=7五、思考题:1. ⼀个C程序上机的步骤有哪些?答:上级输⼊与编辑源程序—对原程序进⾏编译–与库函数链接–运⾏可执⾏的⽬标程序。

2. 组成C程序的基本单位是函数,⼀个函数包括哪⼏个部分?答:⼀个函数包括两部分:分别为函数头或函数⾸部和函数体。

成绩指导教师签名实验⼆实验项⽬名称:数据类型、运算符和表达式所使⽤的⼯具软件及环境:Visual C++ 6.0⼀、实验⽬的:1.掌握整型、实型与字符型这三种基本类型的概念;2.掌握常量及变量的使⽤⽅法;3. 掌握基本算术运算符及其表达式的使⽤⽅法;4. 掌握++、--运算符、赋值运算符及其表达式的使⽤⽅法。

C语言和汇编语言的互调

C语言和汇编语言的互调
-t
AX=83EC BX=0000 CX=003ADX=0000 SP=FFF0 BP=FFFE SI=0000 DI=0000
DS=142B ES=142B SS=143B CS=143B IP=0013 NV UP EI NG NZ NA PE NC
143B:0013 8B5E06 MOV BX,[BP+06] SS:0004=04EC
int count[]={0,0,0,0,0};
position=buffer;
for (i=0;i<=4;i++){
count[i]=CHANGE(a[i],position);
p=position;
for (j=0;j<5-count[i];j++){
*p=' ';
p++;
}
position+=5;
-t
AX=0000 BX=0000 CX=003ADX=0000 SP=FFF0 BP=FFFE SI=0000 DI=0000
DS=142B ES=142B SS=143B CS=143B IP=0010 NV UP EI NG NZ NA PE NC
143B:0010 8B4604 MOV AX,[BP+04] SS:0002=83EC
-t
AX=83EC BX=04EC CX=000ADX=0000 SP=FFF0 BP=FFFE SI=0000 DI=0004
DS=142B ES=142B SS=143B CS=143B IP=001CNV UP EI NG NZ NA PE NC
143B:001C33D2 XOR DX,DX
-t

C语言程序设计实训教程第2章 基础实验

C语言程序设计实训教程第2章  基础实验

19
(2)编写程序求出任一输入字符的 ASCII码。 提示:从键盘输入一个字符赋给字符变量,以 整型格式输出该变量。 (3)编写程序,由键盘任意输入 3个 1位整数 (第一个整数不为 0),将它们按输入顺序组合为 一个 3位数输出,如输入 2,5,8,则输出为258。 提示:输入 a,b,c3个整数,组合整数为 d =a﹡100 +b﹡10 +c。
(3)写一个函数,用“冒泡法”对输入的 10 个数字由小到大顺序排列,并输出。 提示: ①排序的函数名为 Sort。 ②排序前后的输入输出都应在主函数中完成。 ③使用数组作为函数参数。 ④使用“冒泡法”排序。
67
(4)写一函数,使给定的一个二维数组(5 ×5)转置,即行列互换。 提示: ①使用 5 ×5的二维数组存放数据。 ②矩阵转置的函数名为 Turn。 ③转置前后的输入输出都应在主函数中完成。 ④使用数组作为函数参数。
20
2.3
数据的输入和输出
1)实验目的 ①熟悉顺序结构的程序设计方法。 ②熟练使用 C 的赋值语句和各种表达式。 ③熟练掌握各种数据的输入、输出方法,能正 确使用各种格式转换符。
21
2)实验内容 程序验证性实验
22
23
24
25
程序填空性实验 程序功能:可以计算两个整数的商和余数。
26
程序设计性实验 (1)编写程序由键盘输入任意一个数字字符 (0 ~ 9),将其转换为数字输出。 提示:将该字符和“0”字符相减(字符的 ASCII码值相减)即得到数字。 (2)输入三角形三边长 a,b,c,求三角形 周长 l和面积 s。用 scanf()函数输入数据,printf ()函数输出计算结果,输出时要求有文字说明。
2)实验内容 程序验证性实验

实验二 简单的C程序设计

实验二  简单的C程序设计

实验二简单的C程序设计实验目的:1.掌握C语言的运算符和表达式的正确使用以及C语言的几种基本数据类型和基本输入输出函数的使用方法。

2.通过编程进一步理解和掌握运算符的确切含义和功能。

3.理解和掌握运算符与运算对象的关系,优先级和结合方向。

1.通过编程,掌握C语言的几种基本数据类型,int、char、flloat、double,以及由这些基本数据类型构成的常量和变量的使用方法。

2.掌握基本输入/输出函数的使用方法,包括printf()、scanf()、getchar()、putchar()。

3.掌握简单的C程序的查错方法。

实验内容:一、输入程序,观察输出结果,并对输出结果作出合理的解释。

1./* e1.cpp */#include<stdio.h>void main(){ float x;double y;x=213.82631;y=213.82631;printf("%-4.2f,-6.2e\n",x,y);}输出结果:解释:2./* e2.cpp */#include<stdio.h>void main(){ char ch;int k;ch=’a’;k=10;printf(“%d,%x,%o,%c”,ch,ch,ch,ch,k);printf(“k=%%d\n”,k);}输出结果:解释:3./* e3.cpp */#include<stdio.h>void main(){ float a1,a2;double b1,b2;a1=3141.59;a2=0.000001;b1=3141.59;b2=0.000001;printf(“%f,%lf\n”,a1+a2,b1+b2);}输出结果:解释:4./* e4.cpp */#include<stdio.h>void main(){ float x=5/2,y=5.0/2;printf("x=%f,y=%f\n",x,y);}输出结果:解释:二、编写程序。

实验二 汇编语言与C语言混合编程

实验二   汇编语言与C语言混合编程

实验二汇编语言与C语言混合编程
一、教学目的和要求
熟悉ADS1.2开发环境编译、下载、调试程序的基本过程;
掌握C和汇编语言混合编程方法。

掌握ATPCS中的寄存器及参数传递规则。

二、实验内容
1、分别编写C程序和汇编程序,要求在C程序中调用汇编程序实现字符串拷贝功能。

C程序中设定源字符串及目的字符串;汇编程序实现拷贝功能。

2、分别编写C程序和汇编程序,要求在汇编程序中调用C程序实现4个整型数的求和运算。

汇编程序实现变量的赋值及C函数的调用;C程序实现求和运算。

3、编写C程序内嵌汇编语句,对两个整型数a、b进行求和运算,和值存放到变量c中。

(1)要求main( ) 函数完成变量赋值及a、b、c数值信息输出;内嵌汇编语句实现求和计算。

(2)要求C程序中main( ) 函数完成变量赋值及a、b、c信息打印,add()函数实现加法运算;main( ) 函数中的内嵌汇编调用C函数add()进行求和运算。

三、思考题
1、什么是ATPCS?它有哪些规则?
2、C程序调用汇编程序需要进行哪些设置?参数如何传递?
3、汇编程序调用C程序需要进行哪些设置?参数如何传递?
4、C程序中内嵌的汇编语句有何限制?用什么关键字表示内嵌汇编?。

C语言实验报告,实验一和实验二

C语言实验报告,实验一和实验二

实验一C语言的运行环境、运行过程和表达式的使用一、目的与要求1、了解Dos、Windows环境下C语言的运行环境,了解所用的计算机系统的基本操作方法,学会独立使用该系统。

2、了解在该系统上如何编辑、编译、连接和运行一个C程序。

3、通过运行简单的C程序,初步了解C源程序的特点。

4、掌握C语言数据类型,熟悉如何定义一个整型、字符型、实型变量,以及对它们赋值的方法,了解以上类型数据输出时所用的格式转换符。

5、学会使用C的有关算术运算符,以及包含这些运算符的表达式二、上机实验及运行结果1、例题实验及运行结果例一:#include"stdio.h"void main(){printf("Hello,World!\n");printf("Wolcome to the C language world!\n");printf("Everyone has been waiting for.\n");}运行结果为Hello, world !Welcome to the C language world!Everyone has been waiting for.在第一次输入源程序时,由于粗心在printf(“Hello,world!”)后面忘记输入“;”,在编译中检查出来,修改后编译成功。

例二:#include"stdio.h"void main(){int a,b,sum;a=123;b=456;sum=a+b;printf("sum is %d\n",sum);}运行结果为:sum is 579。

一次编译就成功了。

例三:#include"stdio.h"void main(){int a,b,c;int max(int,int);scanf("%d,%d",&a,,&b);c=max(a,b);printf("max=%d",c);}int max(int x,int y){int z;if (x>y) z=x;else z=y;return(z);}键盘输入“8,9”,屏幕上输出“max=9”例四:#include"stdio.h"void main(){char c1 , c2;c1=97;c2=98;printf("%c %c", c1, c2);}在此基础上1)加一个printf语句,并运行之。

  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
MOV PC,LR
END
七、练习题
1.在汇编程序中是否可以调用C 语言程序?。

相关文档
最新文档