当前位置:首页 » 编程软件 » 编译器实验报告

编译器实验报告

发布时间: 2023-06-04 05:07:23

c语言实验报告心得

c语言实验心得:
1、只有频繁用到或对运算速度要求很高的变量才放到data区内,如for循环中的计数值。
2、其他不频繁调用到和对运算速度要求不高的变量都放到xdata区。
3、常量放到code区,如字库、修正系数。
4、逻辑标志变量可以定义到bdata中。
在51系列芯片中有16个字节位寻址区bdata,其中可以定义8*16=128个逻辑变量。这样可以大大降低内存占用空间。定义方法是: bdata bit LedState;但位类型不能用在数组和结构体中。
5、data区内最好放局部变量。
因为局部变量的空间是可以覆盖的(某个函数的局部变量空间在退出该函数是就释放,由别的函数的局部变量覆盖),可以提高内存利用率。当然静态局部变量除外,其内存使用方式与全局变量相同;
6、确保程序中没有未调用的函数。
在Keil C里遇到未调用函数,编译器就将其认为可能是中断函数。函数里用的局部变量的空间是不释放,也就是同全局变量一样处理。这一点Keil做得很愚蠢,但也没办法。
7、如果想节省data空间就必须用large模式。
将未定义内存位置的变量全放到xdata区。当然最好对所有变量都要指定内存类型。
8、使用指针时,要指定指针指向的内存类型。
在C51中未定义指向内存类型的通用指针占用3个字节;而指定指向data区的指针只占1个字节;指定指向xdata区的指针占2个字节。如指针p是指向data区,则应定义为: char data *p;。还可指定指针本身的存放内存类型,如:char data * xdata p;。其含义是指针p指向data区变量,而其本身存放在xdata区。

以前没搞过C51,大学时代跟单片机老师的时候也是捣鼓下汇编,现在重新搞单片机,因为手头资料不多,找到一些C51的程序,发现里面有这些关键字,不甚明了,没办法只好找了下,发现如下描述:

从数据存储类型来说,8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列特点而设定的pdata类型,使用不同的存储器,将使程序执行效率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率(此问题将在后面专门讲述)。与ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各种不同的模式对应不同的实际硬件系统,也将有不同的编译结果。

在51系列中data,idata,xdata,pdata的区别

data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。

idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。汇编中的语句为:mox ACC,@Rx.(不重要的补充:c中idata做指针式的访问效果很好)

xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。

pdata:外部扩展RAM的低256个字节,地址出现在A0-A7的上时读写,用movx ACC,@Rx读写。这个比较特殊,而且C51好象有对此BUG,建议少用。但也有他的优点,具体用法属于中级问题,这里不提。

三、有关单片机ALE引脚的问题

"单片机不访问外部锁存器时ALE端有正脉冲信号输出,此频率约为时钟振荡频率的1/6.每当访问

外部数据存储器是,在两个机器周期中ALE只出现一次,即丢失一个ALE脉冲."这句话是不是有毛

病.我觉得按这种说法,应该丢失3个ALE脉冲才对,我一直想不通是怎么回事,希望大虾们帮帮我.

小弟感激涕零.

答:

其他所有指令每6个机器周期发出一个ALE,而MOVX指令占用12个机器周期只发出一个ALE

四、如何将一个INT型数据转换成2个CHAR型数据?

经keil优化后,char1=int1/256,char2=int1%256或char1=int1>>8,char2=int1&0x00ff效率是一样的。

五、在KEIL C51上仿真完了,怎样生成HEX文件去烧写??

右键点项目中Target 1,选第二个,在OUTPUT中选中CREAT HEX

六、typedef 和 #define 有何不同??

typedef 和 #define 有何不同》》》 如

typedef unsigned char UCHAR ;

#define unsigned char UCHAR ;

typedef命名一个新的数据类型,但实际上这个新的数据类型是已经存在的,只不过是定义了

一个新的名字.

#define只是一个标号的定义.

你举的例子两者没有区别,但是#define还可以这样用

#define MAX 100

#define FUN(x) 100-(x)

#define LABEL

等等,这些情况下是不能用typedef定义的

七、请问如何设定KELC51的仿真工作频(时钟)

用右键点击左边的的target 1,然后在xtal一栏输入

八、不同模块怎样共享sbit变量,extern不行?

把SBIT定义单独放到一个.H中,每个模块都包含这个.h文件

九、C51中对于Px.x的访问必须自己定义吗?

是的。

如sbit P17 = 0x97;即可定义对P1.7的访问

十、SWITCH( )语句中表达式不可以是位变量对吗?

可以用位变量:

#include

#include

void main()

{

bit flag;

flag=0;

switch(flag)

{

case '0':{printf("0\n");break;}

case '1':{printf("1\n");break;}

default:break;

}

}

bit 变量只有两种状态,if 语句足够啦,!!!

十一、const常数声明占不占内存???

const 只是用来定义“常量”,所占用空间与你的定义有关,如:

const code cstStr[] = {"abc"};

占用代码空间;而如:

const char data cstStr[] = {"abc"};

当然占用内存空间。

另外,#define 之定义似乎不占用空间。

十二、philips的单片机P89C51RD+的扩展RAM在C51中如何使用?

试一试将auxr.1清0,然后在c语言中直接声明xdata类型的变量

十三、BUG of Keil C51

程序中用如下语句:

const unsigned char strArr[] = {"数学"};

结果发现strArr[] 内容为 {0xCA,0xD1,0xA7},真奇怪!

凡是有0xfd,则会通通不见了,所以只能手工输入内码了,例如 uchar strArr[]=

{0xCA,0xfd,0xd1,0xa7}(用Ultraedit会很方便)。

十四、Keil C51中如何实现代码优化?

菜单Project下Option for target "Simulator"的C51.

看到Code optimization了吗?

十五、请教c的!和 ~ 符号有甚区别??

!是逻辑取反,~是按位取反。

十六、c51编程,读端口,还要不要先输出1?

我怎么看到有的要,有的不要,请高手给讲讲,到底咋回事?谢了

要输出1的,除非你能保证之前已经是1,而中间没有输出过其他值。

十七、当定时器1(T1)用于产生波特率时,P3^5还是否可以用作正常的I/O口呢?

p3.5完全可以当普通的io使用

十八、C51中 INT 转换为 2个CHAR?

各位高手:

C51中 INT 转换为 CHAR 如何转换诸如:

X = LOW(Z);

Y = HIGH(Z);

答:

x=(char)z;

y=(char)(z>>8);

十九、如果我想使2EH的第7位置1的话,用位操作可以吗?

现在对位操作指令我一些不太明白请各位多多指教:

如 SETB 07H 表示的是20H.7置1,对吗?(我在一本书上是这么看到的)

那么如果我想使2EH的第7位置1的话,象我举的这个例子怎么表示呢?谢谢!

SETB 77H

setb (2eh-20h)*8+7

20h-2fh每字节有8个可位操作(00h-7fh),其它RAM不可位直接操作

二十、char *addr=0xc000 和char xdata *addr=0xc000有何区别?

char *addr=0xc000;

char xdata *addr=0xc000;

除了在内存中占用的字节不同外,还有别的区别吗?

char *addr=0xc000; 是通用定义,指针变量 addr 可指向任何内存空间的值;

char xdata *addr=0xc000; 指定该指针变量只能指向 xdata 中的值;

后一种定义中该指针变量(addr)将少占用一个存储字节。

uchar xdata *addr=0xc000;指针指向外ram;

如果:data uchar xdata *addr=0xc000;指针指向外ram但指针本身存在于内ram(data)



以此类推可以idata uchar xdata *addr=0xc000;pdata uchar xdata *addr=0xc000;

data uchar idata *addr=0xa0;.........

二十一、while(p1_0)的执行时间?

假设,P1_0为单片机P1口的第一脚,请问,

while(P1_0)

{

P1_0=0;

}

while(!P1_0)

{

P1_0=1;

}

以上代码,在KEIL C中,需要多长时间,执行完。能具体说明while(P1_0)的执行时间吗?

仿真运行看看就知道了,

我仿真了试了一下,约14个周期

二十二、怎样编写C51的watchdog程序?

各位大虾,我用KEIL C51 编写了一个带外部开门狗的程序,可程序无法运行起来,经过查

找,发现程序在经过C51编译后,在MAIN()函数的前部增加了一端初始化程序,等到进入

主程序设置开门狗时,开门狗已经时间到,将我的程序复位了,请问我怎样才能修改这一端

初始花程序,使他一运行,就设置开门狗?

可以在startup.a51中加入看门狗刷新指令,当然用汇编,然后重新编译startup.a51

,将他和你的程序连接即可。新的startup.a51会自动代替系统默认的启动模块。

二十三、keil C51 怎样把修改的startup.a51 加到工程文件中

直接加入即可

注意不要改动?STACK,?C_START,?C_STARTUP等符号。startup.a51直接加入项目,不用修改也可。可在内面自己修改汇编的一些限制或堆栈指针。

二十四、关于波特率的设置

我在设定串口波特率时发现一个问题:在晶体震荡器为11.0592MHz时,若设9600BPS的话,

TH1=0XFD,TL1=0XFD,而要设19200BPS的话,TH1、TL1有否变化,如果没变,为什么?

如果变了,又为什么?(因为我看书上俩个是一样的),希望大家点拨。

答:

当电源控制寄存器(PCON)第BIT7(SMOD)为1时波特率加倍。

TH1和TL1的值不变.

二十五、如何在C中声明保留这部分RAM区不被C使用?

我不知道在C源程序中怎么控制这个,但在汇编程序中加入下面一段就行:

DSEG AT 20H

AA: DS 10

这样C51就不会占用20H--29H了

或者在c51里这样定义:

uchar data asm_buff[10] _at_ 0x20;

二十六、问浮点运算问题

我在用C51时发现它对传递浮点参数的个数有限制,请问:

1)参数是以全局变量的形式传递的,请问以全局变量的形式传递的参数也有限制吗?

2)这种传递浮点参数的限制有多少呢?

3)float*float的结果是float类型还是double类型?能否直接赋值给float类型的变量?

答:

由于KEIL C51的参数传递是通过R0-R7来传递的,所以会有限制。

不过KEIL提供了一个编译参数,可以支持更多参数的传递。具体

的内容见KEIL的PDF文档。

我建议你把多个要传递的参数定义到指针或结构体中去,传递参

数通过指针或结构进行,这样好一些。

第3个问题回答是YES,你自己试试不就知道了。

二十七、如何在某一个地址定义ram

用_at_ 命令,这样可以定位灵活一点的地址

uchar xdata dis_buff[16] _at_ 0x6020 ;//定位RAM

将dis_buff[16]定位在0x6020开始的16个字节

二十八、keil c中,用什么函数可以得到奇偶校验位?

例如32位数据,将四个字节相互异或后检查P即可,若耽心P被改变,可用内嵌汇编。

#include

unsigned char parity(unsigned char x){

x^=x;

if(P)return(1);

else return(0);

}

unsigned char parity2(unsigned int x){

#pragma asm

mov a,r7

xrl ar6,a

#pragma endasm

if(P)return(1);

else return(0);

}

Ⅱ c语言编辑器怎么用手机版

如何在手机上编写c程序?
ZZ8524次浏览2020.10.24
如何在手机上编写c程序?今天小编为大家讲解一下。
开启分步阅读模式
操作方法
01
打开手机,找到应用商店,点击并进入,如图所示。

02
进入之后,搜索“C语言编译器”,将其下载安装到手机上面,如图所示。

03
下载好之后,打开“C语言编译器”,如图所示。

04
进入之后,即可对C语言进行编译,如图所示。

特别提示
以上纯属个人编写,请勿转载抄袭。

本页搜狗指南内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。

0无帮助
查看全文
大家还在搜
plc编程必背50个程序
初学编程100个代码大全
手机编写电子文档
手机编写合同软件
编写c程序的软件
手机编写c语言的软件
c程序设计实验报告
c语言流程图生成器旁悔手机版
c语言编程器手机版
c程序设计知识点
c程序设计教材电子版
手机编写文档的软件
安卓c语言编译器
c程序设计电子书
手机编写电子表格
如何编写c语言程序
手机上怎么编程c语言
编写c语言的工具软件
如何在手机上编程并运行
c语言必背18个经典程序
手机如何编写c语言
手机怎么写c语言代码
编辑c程序是指
怎样编写c语言程序
创建c程序的步骤
c程序实例
c语言编译器手机版
c程序设计语言电子版
怎么在手机上编写c语言
编写程序新手教程
手机上怎么编程c语言
编写c语言的工具软件
如何在手机上编程并运行
c语言必背18个经典程序
手机如何编写c语言
手机怎么写c语言代码
编辑c程序是指
怎样编写c语言程序
创建c程序的步骤
c程序实信启耐例
c语言编译器手机版
c程序设计语言电子版

操作方法

01 / 04
操作方法
点击目录可快速跳转至页面对应位置
01打开手机,找到应用商店,点击并进入,滑春如图所示。
02进入之后,搜索“C语言编译器”,将其下载安装到手机上面,如图所示。
03下载好之后,打开“C语言编译器”,如图所示。
04进入之后,即可对C语言进行编译,如图所示。
指到就不难 · © SOGOU.COM 2023

Ⅲ c程序的运行环境和运行一个c程序的方法实验报告书

实验目的 (1)了解所用的计算机系统的基础操作方法,学会独立使用该系统。 (2)了解在该系统上如何编辑、编译、连接和运行一个C程序。 (3)通过运行简单的C程序,初步了解C源程序的特点。 二、实验内容 1.检查所用的计算机系统是否已安装了C编译系统并确定它所在的子目录。如果是在Windows操作系统下使用Turbo C编译器,可以按以下步骤进行操作: ①单击Windows桌面上的“开始”按钮,在菜单中单击“查找(F)”,在其右面的下拉菜单中单击“文件或文件夹(F)”。屏幕上出现“查找”窗口。 ②在“名称”框中输入文件名“tc.exe”,单击“开始查找”按钮,系统即自动在指定的范围内寻找所需要文件,如果找到,就会显示出文件路径(例如:C:\lib\tc或c:\tc)。 ③注意:在“搜索”框中应说明搜索范围,如使“搜索”栏中的内容为“C:\”,表示从根目录开始寻找,即搜索整个C盘。 2.建立用户自己的子目录 ①利用“Windows资源管理器”在磁盘(如D盘)上建立自已的文件夹。 ②利用DOS命令md在磁盘上建立自己的子目录。 3.进入TC工作环境 第一种方法; ①单击桌面上的“开始”按钮,从菜单中选择“程序”,单击它然后在其下拉菜单中选择“MS-DOS”,屏幕上出现MS-DOS窗口。 ②用DOS命令cd,使当前目录改变为tc.exe所在的子目录(例如:C:\lib\tc)。 ③在tc的子目录下输入tc,按回车键进入tc的工作环境。 第二种方法: 用鼠标双击“我的电脑”图标,进入C盘根目录,在C盘根目录下找到tc.exe文件所在的文件夹(如C盘下的lib文件夹下的tc文件夹),在文件夹中找到tc.exe文件,双击鼠标进入TC的工作环境。 4.熟悉Turbo C集成环境 ①了解和熟悉编辑(Edit)窗口和信息(Message)窗口的作用。试一下能否向信息窗口输入程序。按功能键F5,观察它有什么作用,再按一次F5,再观察它有什么作用。按F6,观察它有什么作用;再按一次F6,再观察它有什么作用。(参见第一部分的1.1节) ②按功能键F10,并按回车键,观察“File”菜单,了解它们的作用和方法。用键盘上的“→”键,分别选中Edit、Run、Compile、Project、Options、Debug、Break/watch,观察它们的菜单,大致上了解它们的作用,以后用到时再深入了解。 ③选择File菜单中的New并按回车键,在编辑窗口中随意输入几行字符,观察窗口顶部左端line和col后面数字的变化。 5.编辑并运行一个简单的程序 ①再选择File菜单中的New并按回车键,使编辑窗口变成空白。 ②输入下面的程序 main( ) { printf("* * * * *\n"); printf(" Hello.\n"); printf("* * * * *\n"); } ③按功能键F9进行编译和连接,观察屏幕上显示的编译信息。如果出现“出错信息”,则应找出原因并改正之,再进行编译。 ④如果编译无错误,按Ctrl和F9键使程序运行,按Alt和F5键,切换到用户屏,观察运行结果。 ⑤按任一键回到TC窗口,将程序命令为ex1.c保存在自已的子目录下。(参见第一部分1.2节的内容) 6.编辑并运行另一个C程序 ①再选择File→New,使编辑窗口变成空白。 ②输入以下程序 main( ) { int a,b,sum; a=150;b=200; sum=a+b; printf("sum is %d\n",sum); } ③按F9进行编译,仔细分析编译信息窗口和Message窗口,可能显示有多个错误,逐个修改,直到不出现错误。 ④运行程序,分析运行结果。 ⑤将程序命名为ex2.c,保存到自己所建的子目录下。 7.编辑并运行一个需要在运行时输入数据的程序 ①清空编辑窗口,输入下面的程序。 main( ) { int a,b, max; scanf("%d%d",&a,&b); if(a>b) max=a; else max=b; printf("%d",max); } ②编辑并运行,注意按Ctrl和F9运行后,先从键盘输入整数2和5,然后按回车键,再按Alt和F5键,观察运行结果。 ③将程序中的第3行改为: int a;b;max; 再进行编译,观察其结果。 ④将程序第5、6两行合并为一行,即 if(a>b) max=a ; else max=b ; 进行编译和运行,分析结果。 将程序命名为ex3.c保存在用户自己的子目录下。

麻烦采纳,谢谢!

Ⅳ Linux进程通信实验报告

一、实验目的:
进一步认识并发(并行)执行的概念,区别顺序执行和并发(并行)执行。

分析进程争用临界资源的现象,学习解决进程排斥的方法。

二、实验环境:

一台至少具有256MB内存的计算机,并安装Red Hat Linux 9的Linux操作系统。

三、实验内容:

1. 预备知识
fork函数调用:创建一个新进程。

getpid函数调用:获得一个进程的pid。

lockf系统的调用:在进程同步控制中为进程加锁。

2. 编写一段程序(程序名为fork1.c),使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”,子进程分别显示字符“b”和字符“c”。试观察记录屏幕上的显示结果,并分析原因。

(1)进入Linux操作系统。

(2)打开终端。进入vi编译器。

(3)输入源程序代码。

(4)按Esc键,进入命令模式后,输入“: wq文件名”就可以运行该程序了。

热点内容
android代码搜索 发布:2025-02-12 15:45:36 浏览:778
矢量图算法 发布:2025-02-12 15:43:53 浏览:192
python量化投资入门 发布:2025-02-12 15:34:17 浏览:174
苹果的天气跟安卓的天气哪个准 发布:2025-02-12 15:33:37 浏览:313
西安分布式存储咨询 发布:2025-02-12 15:33:24 浏览:179
我的世界服务器怎么获得32k乱码棒 发布:2025-02-12 15:25:15 浏览:545
hadoopftp 发布:2025-02-12 15:22:23 浏览:753
ftp怎么增加 发布:2025-02-12 15:21:08 浏览:379
改装车载中控什么配置 发布:2025-02-12 15:10:00 浏览:861
数据库体系结构 发布:2025-02-12 15:09:48 浏览:692