实验二 _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语言混合编程实验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语⾔程序设计》实验报告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语言和汇编语言的互调
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章 基础实验
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程序设计实验目的: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语言混合编程
一、教学目的和要求
熟悉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语言的运行环境、运行过程和表达式的使用一、目的与要求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语句,并运行之。
c语言第二部分 实验内容
三、实验内容
1.阅读并输入如下程序,查看运行结果,并分析其功能。 # include "stdio.h" main ( ) { int a, b, c, s ; a = 5; b = 4; c = 6; s = (a+b+c)/ 3; printf (" a = %d, b = %d, c = %d \n, s = %d ", a, b, c, s) ; }
C语言程序设计实验·设计·习题
2.下面是一正方形面积的计算程序,通过输入不同的边长,求 出不同的面积。输入此程序并试运行。 注意:程序中含有输入语句,运行时将会停留在另一窗口中等待 输入数据。 # include"stdio.h" main ( ) { int r, s ; scanf (" %d ",&r) ; s= r*r; printf (" s = %d ", s) ; } 3.在Turbo C中调试并修改以下C程序中的错误。
C语言程序设计实验·设计·习题
三、实验内容
1.改正书中所给的相关程序的错误。 2.程序填空。 (1)按程序中注释的要求填输出语句。 (2)要求运行时必须按如下格式输入数据,请填空。 3.程序编译成功,只是说明没有语法错误,但并不一定能得出 正确结果,因为有可能存在编程逻辑错误。这时,我们需要跟踪变量、 调试程序,找出问题所在。调试的一般方法有: (1)单步跟踪:选择Run菜单下的Step命令,也可以直接按快捷键 F7(可跟踪进函数、过程)或快捷键F8,这样可以每条语句单独运行。 (2)运行至光标处:先将光标移至目标语句,然后选择Run菜单下 的Go to Cursor命令,或按快捷键F4,这样可以连续运行从开始到光 标处的一段程序。
C语言程序设计实验手册
实验手册使用及要求实验操作是教学过程中理论联系实际的重要环节,而实验报告的撰写又是知识系统化的吸收和升华过程,因此,实验报告应该表达完整性、标准性、正确性、有效性。
现将实验报告撰写的有关内容说明如下:1、实验前按实验要求手写程序或程序填空,并走查代码,有疑问处标记,上机时在C语言集成开发环境下输入并调试手写程序,分析运行结果。
2、实验完毕后填写通过后的源程序和对实验的总结。
3、通过后的源程序可以手写也可以打印粘贴。
实验工程一览表实验一熟悉C语言编程环境实验目的:1.熟悉C语言编程环境〔VC++、Cfree、Turboc等〕2.了解C程序的根本框架3.理解程序调试的思想,能找出并改正C程序中的错误实验内容:1.1 建立自己的文件夹:在磁盘上建立一个文件夹,用于存放自己的C程序1.2 编程例如在屏幕上显示一个短句“Programming in C is fun!〞〔教师例如,学生模仿并创新,如输出汉字、特除字符等。
学会使用编程环境VC++,启动、编辑、编译、运行、保存、关闭、翻开〕1.3 编程在屏幕上显示如下网格。
+---+---+| | || | |+---+---+调试例如改正以下程序中的错误,在屏幕上显示“Welcome to You !〞。
〔掌握找错、改错的方法〕源程序:# include <stdio.h>int mian(void){printf(Welcome to You! \n")getchar();return 0;}注:需要修改的语句直接在程序上标注并修改实验总结:实验二用C语言编写简单程序实验目的:1.掌握算术表达式和赋值表达式的使用2.掌握根本输出函数的使用3.能够自己编程实现简单的数据处理4. 熟练掌握简单if语句使用5. 熟练掌握for语句的使用6. 掌握简单C程序的查错方法、单步调试实验内容:2.1 调试以下程序,求华氏温度对应的摄氏温度。
计算公式为:C=5*(f-32)/9#include <stdoi.h>int main(void){int celsius; fahr;scanf("%d ",fahr);celsius = 5 * (fahr - 32) / 9;printf("fahr = d, celsius = %d\n", fahr, celsius);return 0;}注:需要修改的语句直接在程序上标注并修改2.2编写程序计算定期存款本利之和:设银行定期存款的年利率rate为2.25%,并存款期为n年,存款本金为capital元,试编程计算n年后的本利之和deposit。
实验2 C和汇编语言的混合编程实验
汇编程序 }
嵌入式汇编语言不同的地方有: 如果一行中有多个汇编指令,指令之间用分号(;)隔离 如果一天指令占多行,要使用续行符号(\) 在汇编指令段中可以使用 C 语言的注释语句
4、实验电路图
(*(volatile unsigned *)0x56000050) //Port F control (*(volatile unsigned *)0x56000054) //Port F data (*(volatile unsigned *)0x56000058) //Pull-up control F
3
#define GPFUP (*(volatile unsigned *)0x56000058) //Pull-up control F extern int delay(int time); /*声明汇编函数*/ int Main() {
GPFCON=(GPFCON|0xFF00)&0xFFFF55FF;//GPF4--GPF7 设置为 output GPFUP|=0xFF00; //disable GPF pull up while(1) { int i=0; GPFDAT=(GPFDAT&0xFFFFFF0F)|0xE0; delay(0x1ffff); GPFDAT=(GPFDAT&0xFFFFFF0F)|0xD0; delay(0x1ffff); GPFDAT=(GPFDAT&0xFFFFFF0F)|0xB0; delay(0x1ffff); GPFDAT=(GPFDAT&0xFFFFFF0F)|0x70; delay(0x1ffff); } }
汇编程序和c语言相互调用实验、嵌入式系统实验
实验一一、汇编语言调用c语言主要内容为使用汇编语言调用C语言完成20!的计算。
将64位结果保存到寄存器R0、R1中,其中R1存放高32位结果1.建立汇编源文件start.s.global _start.extern Factorial.equ Ni,20.text_start:Mov R0,#NiBL FactorialStop:B Stop.end2.建立C语言源文件factorialLong long Factorial(char N){Char i;Long long Nx=1;For(i=1;i<=N;i++){Return Nx;}}二、C语言调用汇编语言在GUN ARM 编译环境下设计程序,用C语言调用ARM汇编语言C语言实现20!操作,并将64位结果保存到0xFFFFFFF0开始的内存地址单元,按照小端格式低位数据存放在低位地址单元。
1、建立C语言源文件main.c/* main.c */extern void Factorial(char Nx);Main(){Char N =20;Factoral(N);While(1);}2、建立汇编语言源文件factorial/* factorial.s */.global FactorialFactoral:Mov R8,R0Mov R9,#0SUB R0,R8,#1Loop:Mov R1,R9UMULL R8,R9,R0,R8MLA R9,R1,R0,R9SUBS R0,R0,#1BNE LoopLDR R0,=0xFFFFFFF0STMIA R0,{R8,R9}MOV PC,LR三、实验一内容在汇编语言中定义符号常量A和B,调用C语言程序求这两个数的最大值,返回汇编程序后,将结果存入R3。
(1)编汇编源文件start.s文件/*Start.s */.global _start.extern Factoiral.equ N1,20.equ N2,30.text_start:Mov R0,#N1Mov R1,#N2BL FactoralMov R3,R0Stop:B stop.end(2)编写C语言文件/* factorial.c*/int Factorial(int num1,int num2){if(a>=b) return a;else return b}用C语言编程,现将10000000开始的100个单元赋初值,然后求平均值、最大值和最小值,并将结果存放1在000100开始(1)编写汇编源文件start.s文件/*start.s*/global _startextern Factorial.text_start:B FactorialStopB stop.end(2)编写C语言文件/*Factorial.c*/Void Factrial(){int i;int 32-t,*p1,*p2; int max =*p1;long sum=0;double ove=0;p1=(int 32-t)0x10000000;p2=(int 32-t)0x10001000;for(i=0;i<=100;i++) *(p1+i)=i;for(i=1;i<=100;i++){if(*(p1+i)>max){max =*(p1+i);if(*(p1+i)<min)max=*(p1+i); }}ove=sum/100.0;*p2=sum;*(p2+2)=max;*(p2+3)=min;}实验二、GPIO延时函数static void delay_ms(int ms){int i,j;While(ms--){for(i=0;i<5;i++)for(j=0;j<514;j++);}}主函数Int main(void){GPX2PUD=GPX2PUD&(~(0x3<<4));GPX2CON=GPX2CON&(~(0xf<<28))|(0x1<<28); while(1){GPX2DAT=GPX2DAT|(0x1<<7);delay_ms(1000);GPX2DAT=GPX2DAT&(~(0x1<<7));delay_ms(1000);}return 0;}实验三、PWM定时器1.PWM的初始化void PWM_init(void){GPDO.CON=(GPDO.CON &~(0xf)) | 0x2; PWM.TCFGO=(PWM.TCFG0&~(0xFF))|0x63; PWM.TCFG1=(PWM.TCFG1 &~(0xF)) 0x3; PWM.TCNTBO=200;PWM TCMTBO=100;PWM.TCON=(PWM.TCON &~(0xF)) | OxA; PWM.TCON=(PWM.TCON &~(0xF)) | Ox9;}2.代码实现int main(void) {GPX2.CON=0x1<<28;PWM_init();while(1){GPX2.DAT=GPX2.DAT|0x1<<7;mydelay_ms(500);GPX2.DAT=GPX2.DAT & ~(0x1<<7);mydelay_ms(500);}return 0;}PWM输出软件设计PWM0初始化函数Void init_pwm0(void){PWM.TCFGO=PWM.TCFG0&(~(0xff<<0))|249; PWM.TCFG1=PWM.TCFG1&(~(0xf<<0))|4;//TCNT_CLK=PCLK(100M)/(249+1)/(16)=25KHZ) PWM.TCNTB0=100;PWM.TCNTB0=50;PWM.TCON=PWM.TCON|(0x1<<1);PWM.TCON=PWM.TCON&(~(0xf<<0))|(Ox9<<0))} 主函数int main(void){GPD0.PUD=0x0;GPD0.CON=GPD0.CON&(~(0xf<<0))|(0x2<<0); init_pwm0();while(1);return 0;}。
c语言程序设计实验指导答案
太原理工大学现代科技学院C语言程序设计课程实验报告专业班级学号姓名指导教师焦雄5.#include <stdio.h> void main(){int a=10,n=5;a+=a;printf("%d\n",a);a=10,a-=2;printf("%d\n",a);a=10,a*=2+3;printf("%d\n",a);a=10,a/=a+a;printf("%d\n",a);a=10,a%=(n%=2);printf("%d\n",a);a=10,a+=a-=a*=a;printf("%d\n",a); }遇到的问题和解决方法心得体会实验三简单程序、分支程序和循环程序设计实验名称实验目的和要求1.理解C语言程序的基本结构和实现基本结构的语句;2.熟练应用赋值、输入和输出语句;3.理解并掌握关系运算符、逻辑运算符及其表达式的使用;4.熟练掌握if语句、switch语句、while语句、do—while语句和for语句的用法;实验内容1.输入并运行第3章例3-3、例3-6中的程序,通过输出结果理解对应的格式说明。
2.输入并运行第3章例3-8、例3-10中的程序,注意输入数据的格式。
3.已知圆柱半径r=1.5,圆柱高h=3,编程求圆周长,圆面积和圆柱体积。
4.输入一百分制成绩,输出成绩等级A、B、C、D、E。
90分以上为A,80~89为B,70~79分为C,60~69分为D,60分以下为E。
要求程序能处理错误的输入数据。
5.利用公式:π/4=1-1/3+1/5-1/7+……,求π的近似值,直到最后一项的绝对值小于10-6为止。
(fabs(t)表示t的绝对值,1e-6=1*10-6)。
6.求100-200间所有素数。
7.输出三角形的九九乘法口诀表。
8.打印水仙花数。
水仙花数是指一个3位数,其各位数字立方和等于该数本身。
C语言程序设计实验报告(二)
输入:40,50,60↙
5.运行下述程序,分析输出结果。 main(int b=10; float x=10.0; double y=10.0; printf("a=%d, b=%ld,x=%f, y= %lf\n",a,b,x,y); printf("a=%ld,b=%d, x=%lf,y=%f\n",a,b,x,y); printf("x=%f, x=%e, x=%g\n",x,x,x); } 从此题的输出结果认识各种数据类型在内存的存储方式。
4.了解数据类型在程序设计语言中的意义。
三、实验内容及要求:
内容: 1.编程序,输出如下图形: ** ** ** *** *** **** ****
原程序图
运行结果图
2.编写程序,实现下面的输出格式和结果( 表示空格):
a= 5,b= 7,a-b=-2,a/b= 71%
x=31.19,y= -31.2,z=31.1900
3.编写程序,输入变量 x 值,输出变量 y 的值,并分析输出结果。 (1) y =2.4 * x-1/2 (2) y=x%2/5-x (3) y=x>10&&x<100 (4) y=x>=10||x<=1 (5) y=(x-=x*10,x/=10)
要求变量 x、y 是 float 型。 原程序图
运行结果图
C 语言程序设计实验报告
姓名
学号
系别
班级
09 信息
主讲教师
指导教师
实验日期
专业 信息与计算科学
课程名称
C 语言程序设计
一、实验名称:
同组实验者
实验二、 数据类型及顺序结构
C语言实验报告-实验2 顺序结构程序设计
实验2 顺序结构程序设计一、实验目的1. 学会使用自然语言或伪代码描述算法2. 掌握变量、运算符、表达式的使用3. 熟悉顺序结构程序中语句的执行过程4. 掌握标准输入流对象cin及标准输出流对象二、实验内容编写程序在屏幕上显示如图2-1所示的菜单。
图2-1 学生选课管理系统主界面实验步骤:范例:1)在VS2008中新建项目,在项目中新建C++源文件,输入下面程序,并且编译、连接。
//***************************************************************//* 程序名:实训2_1.cp *//* 主要功能: *//* 显示主菜单,并获取用户输入的模块编号 *//***************************************************************#include <iostream> // 包含输入输出接口文件using namespace std; // 引用标准命名空间void mainMenu();int main() // 定义主函数{ // 主函数开始mainMenu();return 0;}void mainMenu(){system("cls");cout<<"\n\n\n\n\n";cout<<"\t\t|---------------学生选课系统(学生版)------------|\n";cout<<"\t\t|\t 0. 退出 |\n";cout<<"\t\t|\t 1. 学生信息管理 |\n";cout<<"\t\t|\t 2. 教师信息管理 |\n";cout<<"\t\t|\t 3. 课程信息管理 |\n";cout<<"\t\t|\t 4. 学生选课管理 |\n";cout<<"\t\t|\t 5. 学生成绩管理 |\n";cout<<"\t\t|\t 6. 信息统计模块 |\n";cout<<"\t\t|-----------------------------------------------|\n\n";cout<<"\t\t\t请输入模块编号(0-6):";}2)运行范例所示程序,观察输出结果实训1要求编写程序在屏幕上显示如图2-2所示的菜单。
函数调用机制 C与汇编相互调用
函数调用机制、C与汇编相互调用--2012年11月22日22:06:23为了提高代码执行效率,代码中有些地方直接使用汇编语言编制。
这就会涉及到两种语言的程序间相互调用的问题。
本文首先说明C语言函数的相互调用机制,然后使用示例来说明C与汇编之间的调用方法。
【C函数相互调用机制】函数调用操作包括从一块代码到另一块代码之间的双向数据传递和执行控制转移。
数据传递通过函数参数和返回值来进行。
另外,还需要在进入函数时为函数的局部变量分配存储空间,并且在退出函数时收回这部分空间。
Intel80x86CPU为控制传递提供了简单的指令,而数据的传递和局部变量存储空间的分配和回收则通过栈操作来实现。
1、栈帧结构和控制权转移方式大多数CPU上的程序实现使用栈来支持函数调用操作。
栈被用来传递函数参数、存储返回信息、临时保存寄存器原有值以备恢复以及用来存储局部数据。
单个函数调用操作所使用的栈部分被称为栈帧(Stack frame)结构,如下图所示。
栈帧结构的两端由两个指针来指定。
寄存器ebp通常用作帧指针(frame pointer),而esp则用作栈指针(stack pointer)。
在函数执行过程中,栈指针esp会随着数据的入栈和出栈而移动,因而函数中对大部分数据的访问都基于帧指针ebp进行。
对于函数A调用函数B的情况,传递给B的参数包含在A的栈帧中。
当A调用B时,函数A的返回地址(调用返回后继续执行的指令地址)被压入栈中,栈中该位置也明确指明了A栈帧的结束处。
而B的栈帧则从随后的栈部分开始。
再随后则用于存放任何保存的寄存器值以及函数的临时值。
B函数同样也使用栈来保存不能存放在寄存器中的局部变量。
例如由于CPU寄存器数量有限而不能存放函数的所有局部数据,或者有些局部变量是数组或结构,因此必须使用数组或结构引用来访问。
还有就是C语言的地址操作符“&”被应用到一个局部变量上时,就需要为该变量生成一个地址,即为变量的地址指针分配一空间。
C语言与汇编语言编程实验
C语言与汇编语言编程实验实验目的1. 掌握在ADT IDE中编写汇编和C语言混合编程程序;2. 掌握C语言和汇编语言相互调用的过程;3. 掌握GNU C中内嵌汇编语言的编程方法。
实验内容1. 编写程序实现如下目的:从汇编语言切换到C语言代码,然后在C代码中分别使用内嵌汇编语言和汇编子函数的方法实现同一功能。
预备知识1. ARM汇编语言基础知识;2. C语言基础知识;3. 程序调试的基础知识和方法。
实验设备1. 硬件:JXARM9-2410教学实验箱、PC机;2. 软件:PC机操作系统 Windows 98(2000、XP) + ADT 1000开发环境。
基础知识在ARM编程中,一个程序往往采用汇编语言和C语言混合编程。
本实验的目的就是为了讲解ARM中C语言和汇编语言混合编程的方法。
1. 汇编语言切换到C语言的方法C语言中定义的函数名在汇编语言中可以作为标号使用,因此,在汇编语言中可以使用程序分支指令直接转移到C语言中定义的标号(函数)中。
如下代码实现从汇编语言跳转到C语言的Main函数中:汇编代码:_start:MOV sp, #0x0c700000 /*建立栈指针(r13)*/B Main /*跳转到C语言程序*/C代码:void Main() {}2. 汇编语言中函数的实现ARM编程中不同语言的程序只要遵守ATPCS规则就可以实现不同语言间的相互调用。
程序间的相互调用最主要的是解决参数传递问题。
应用程序之间使用中间寄存器及数据栈来传递参数,其中,第1~4个参数使用r0~r3传递,多于4个参数则使用数据栈进行传递。
输出参数由r0传递。
下面的代码就是用汇编语言写的一个简单函数。
asse_add:ADD r0, r0, r1 /*r0 = r0 + r1*/MOV pc, lr /*函数返回*/它相当于如下声明的C语言函数:int asse_add(int x, int y);在汇编语言中可以使用BL asse_add指令调用该函数。
C语言与汇编语言混合编程_32位嵌入式
实验二C语言与汇编语言混合编程一、实验目的1.掌握ARM嵌入式C语言编程基本方法。
2. 掌握嵌入式汇编(Inline Assembly)编程规则和方法。
3.掌握汇编语言程序和C语言程序之间相互调用规则和编程方法。
二、实验步骤1. 创建工作空间并且添加工程。
2.编写程序并且利用软件仿真查看结果。
三、实验内容1.利用汇编语言编写初始化程序,实现管理模式下堆栈指针初始化,并最终跳转到C语言程序开始Main函数处执行。
2.利用汇编语言编写子程序实现字符串拷贝功能,利用C语言在Main函数中定义字符串“Hello World!”定义并调用该子程序完成字符串拷贝。
3.利用汇编语言编写子程序完成冒泡法排序,利用C语言在Main函数中定义字符串“Hello World!”定义并调用该子程序将数组中字符按照ASCII码值由小到大重新排序。
思考:1.GNU编译环境下混合编程与ADS环境下有些什么区别?.global _start.global str_cpy.text_start:BIC R0,R0,#MODEMASK @将CPSR中的模式位ORR R1,R0,#FIQMODE @设置模式位为FIQ模式MSR CPSR_c, R1 @切换处理器到FIQ模式LDR SP,=FIQStack @设置该模式下的堆栈BIC R0,R0,#MODEMASK @将CPSR中的模式位ORR R1,R0,#IRQMODE @设置模式位为IRQMSR CPSR_c, R1 @切换处理器到IRQ模式LDR SP,=IRQStack @设置该模式下的堆栈BIC R0,R0,#MODEMASK @将CPSR中的模式位ORR R1,R0,#USRMODE @设置模式位为IRQMSR CPSR_c, R1 @切换处理器到IRQ模式LDR SP,=IRQStack @设置该模式下的堆栈BL MainB ..equ FIQMODE,0x11.equ IRQMODE,0x12.equ SVCMODE,0x13.equ USRMODE,0x10.equ SVCStack,0x03FE0100.equ FIQStack,0x03FE0200.equ IRQStack,0x03FE0300.equ MODEMASK,0x1Fstr_cpy:LDRB R2,[R0],#1STRB R2,[R1],#1CMP R2,#0BNE str_cpyMOV PC,R14.endextern void str_cpy(char *x,char *y); int Main(){char *a="Hello World!\n";char b[13];str_cpy(a,b);return 0;}.global _start.global str_cpy.global line.text_start:BIC R0,R0,#MODEMASK @将CPSR中的模式位ORR R1,R0,#FIQMODE @设置模式位为FIQ模式MSR CPSR_c, R1 @切换处理器到FIQ模式LDR SP,=FIQStack @设置该模式下的堆栈BIC R0,R0,#MODEMASK @将CPSR中的模式位ORR R1,R0,#IRQMODE @设置模式位为IRQMSR CPSR_c, R1 @切换处理器到IRQ模式LDR SP,=IRQStack @设置该模式下的堆栈BIC R0,R0,#MODEMASK @将CPSR中的模式位ORR R1,R0,#USRMODE @设置模式位为IRQMSR CPSR_c, R1 @切换处理器到IRQ模式LDR SP,=IRQStack @设置该模式下的堆栈文档供参考,可复制、编制,期待您的好评与关注!BL MainB ..equ FIQMODE,0x11.equ IRQMODE,0x12.equ SVCMODE,0x13.equ USRMODE,0x10.equ SVCStack,0x03FE0100.equ FIQStack,0x03FE0200.equ IRQStack,0x03FE0300.equ MODEMASK,0x1Fstr_cpy:ldrb r2,[r0],#1strb r2,[r1],#1cmp r2,#0bne str_cpymov pc,r14line: mov r4,r0add r5,r4,#1mov r6,#12 loop1: mov r0,r4mov r1,r5loop:ldrb r2,[r0]ldrb r3,[r1]cmp r3,#0x0abeq endscmp r2,r3strhib r3,[r0],#1strhib r2,[r1],#1addls r0,r0,#1addls r1,r1,#1b loop ends: subs r6,r6,#1bne loop1mov pc,r14.end。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 语言程序?。