C系列编程语言内部数据传递机制研究本科毕业论文.docx

上传人:b****6 文档编号:8623666 上传时间:2023-02-01 格式:DOCX 页数:33 大小:142.11KB
下载 相关 举报
C系列编程语言内部数据传递机制研究本科毕业论文.docx_第1页
第1页 / 共33页
C系列编程语言内部数据传递机制研究本科毕业论文.docx_第2页
第2页 / 共33页
C系列编程语言内部数据传递机制研究本科毕业论文.docx_第3页
第3页 / 共33页
C系列编程语言内部数据传递机制研究本科毕业论文.docx_第4页
第4页 / 共33页
C系列编程语言内部数据传递机制研究本科毕业论文.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

C系列编程语言内部数据传递机制研究本科毕业论文.docx

《C系列编程语言内部数据传递机制研究本科毕业论文.docx》由会员分享,可在线阅读,更多相关《C系列编程语言内部数据传递机制研究本科毕业论文.docx(33页珍藏版)》请在冰豆网上搜索。

C系列编程语言内部数据传递机制研究本科毕业论文.docx

C系列编程语言内部数据传递机制研究本科毕业论文

毕业论文(设计)

 

【摘要】数据传递是计算机通信中一个十分重要的问题。

计算机与外部硬件设备的数据传递一般是通过C语言或汇编语言实现的。

因此C系列编程语言内部数据传递机制研究就显得尤为重要。

本文主要研究了计算机硬件系统以及单片机之间的数据传递问题。

C语言是采用了模块化结构,其本身是一种结构化程序设计语言,模块化结构就是把一个大问题逐步分解成若干独立的小问题,然后再把这些小问题在分解成若干个简单的子问题直到这些子问题或小问题能直接用程序的三种基本结构表达出来。

然后,对应每一个小问题或子问题编写出一个功能相对独立的程序块来,这些小程序块就称作模块,而每个模块由功能不一样的函数组成。

可以说C语言是由函数组成的。

一个C源程序至少包含一个主函数(main函数)也可以包含一个MAIN函数和其他若干个函数,由主函数调用其他函数。

其他函数也可以相互调用。

每个函数在程序中都用来执行一个特定的功能。

对于同一个程序中的函数并不是完全独立的。

它们需要通过相互之间调用组成一个有机的整体来实现程序所要完成的任务。

其中数据传递是一个极为重要而又特殊的问题,它直接影响程序的功能。

显然不同函数间的数据传递就成了一个不可忽视的问题。

【关键词】C语言数据传递机制研究

 

StudyonthemechanismoftheCseriesprogramminglanguageinternaldatatransfer

【Abstract】Datatransmissionisaveryimportantproblemincomputercommunication.DatatransferisthroughtheClanguageandassemblylanguagetoachieve.ThereforeitisimportanttoCseriesprogramminglanguageinternaldatatransfermechanismresearch.ThispapermainlystudiesbetweencomputerhardwareandtheMCUdatatransfer.TheClanguageisadoptedmodularstructure,whichitselfisastructuredprogramminglanguage,themodularstructureisthesmallproblemisabigproblemgraduallydecomposedintoseveralindependent,thenputtheselittleproblemsexpressedinthreekindsofbasicstructureisdividedintoseveralsimpleproblemsuntiltheproblemorsmallproblemscanbedirectlywiththeprogram.Then,eachcorrespondingtoasmallproblemsorsubproblemswriteblockafunctionrelativelyindependent,thesesmallblockiscalledamodule,andthefunctionofeachmoduleiscomposedoffunctionisnotthesameasthecomposition.ItcanbesaidthattheClanguageisafunctionofthecomposition.ACsourcecodethatcontainsatleastonemainfunction(mainfunction)canalsocontainaMAINfunctionandanumberofotherfunctions,fromthemainfunctioncallotherfunctions.Theotherfunctioncancalleachother.Eachfunctionisusedtoperformaspecificfunctionintheprogram.Fortheandfunctionthesameprogramarenotcompletelyindependent.Theyneedthroughtheinteractionbetweencallstoformanorganicwholetoimplementprocedurestocompletethetask.Thedatatransferisaveryimportantandspecialproblems,whichdirectlyaffectthefunctionoftheprocedure.Obviously,thedatatransferbetweendifferentfunctionhasbecomeaproblemthatcannotbeignored.ResearchontransmissionmechanismofinternaldataofCseriesprogramminglanguagehasbecomeanecessityinClanguageprogramdesign.

【Keywords】CDatatransmissionmechanismconsider

 

目录

引言1

1.通信的基本概念

1.1并行与串行的概念2

1.1.1并行通信3

1.1.2串行通信5

1.2几种数据传送(控制)方式的利与弊6

2.单片机的C语言参数传递机制研究6

2.11个或2个参数传递的寄存器数据传递6

2.2通过堆栈操作实现参数的传递8

3.MOV指令实现数据传递18

4.数据结构(C语言)概述19

4.1C语言背景和数据类型19

5.C语言函数返回值实现数据传递的利弊20

5.1Return的使用20

6.C语言函数参数实现数据传递方法机制22

6.1无参函数的数据传递机制22

6.2有参函数的数据传递23

6.2.1参数为简单变量数据传递研究及其特点23

6.2.2参数为非简单变量数据传递研究及其特点24

6.3指针参数实现“双向传递”研究25

7.全局变量实现数据传递机制研究26

总结以及展望28

参考文献29

附录30

致谢.30

引言

  

数据传递是计算机通信中一个十分重要的问题。

PC与外围设备数据传递一般是通过C语言或汇编语言实现的。

因此C系列编程语言内部数据传递机制研究就显得尤为重要。

本文主要研究了计算机硬件系统以及PC与单片机之间的数据传递问题。

C语言是采用了模块化结构,其本身是一种结构化程序设计语言,模块化结构就是把一个大问题逐步分解成若干独立的小问题,然后再把这些小问题在分解成若干个简单的子问题直到这些子问题或小问题能直接用程序的三种基本结构表达出来。

然后,对应每一个小问题或子问题编写出一个功能相对独立的程序块来,这些小程序块就称作模块,而每个模块由功能不一样的函数组成。

可以说C语言是由函数组成的。

一个C源程序至少包含一个主函数(main函数)也可以包含一个MAIN函数和其他若干个函数,由主函数调用其他函数。

其他函数也可以相互调用。

每个函数在程序中都用来执行一个特定的功能。

对于同一个程序中的函数并不是完全独立的。

它们需要通过相互之间调用组成一个有机的整体来实现程序所要完成的任务。

其中数据传递是一个极为重要而又特殊的问题,它直接影响程序的功能。

显然不同函数间的数据传递就成了一个不可忽视的问题。

1通信的概念

通信,指人与人或人与自然之间通过某种行为或媒介进行的信息交流与传递,从广义上指需要信息的双方或多方在不违背各自意愿的情况下无论采用何种方法,使用何种媒质,将信息从某方准确安全传送到另方。

通信在不同的环境下有不同的解释,在出现电波传递通信后通信(Communication)被单一解释为信息的传递,是指由一地向另一地进行信息的传输与交换,其目的是传输消息。

然而,通信是在人类实践过程中随着社会生产力的发展对传递消息的要求不断提升使得人类文明不断进步。

1.1并行与串行的概念

¢在微型计算机中,通信(数据交换)有两种方式:

并行通信和串行通信。

¢并行通信——是指计算机与I/O设备之间通过多条传输

线交换数据,数据的各位同时进行传送。

¢串行通信——是指计算机与I/O设备之间仅通过一条传

输线交换数据,数据的各位是按顺序依次一位接

一位进行传送。

¢应该理解所谓的并行和串行,仅是指I/O接口与I/O设备之间数据交换(通信)是并行或串行。

无论怎样CPU与I/O接口之间数据交换总是并行。

 

并行通信

串行通信

传输速率高

传输速率相对较低

传输距离短(<30m)

通信距离长(几米至几公里)

成本高(要采用多条数据线)

成本较低

应用:

如电脑输出数据到打印机;51单片机的P口

应用:

电脑上的9针座(人称串口);51单片

机的全双工异步串行口RXD、TXD

1.1.1并行通信

定义:

在计算机和终端之间的数据传输通常是靠电缆或信道上的电流或电压变化实现的。

如果一组数据的各数据位在多条线上同时被传输,这种传输方式称为并行通信。

编辑本段分类终端与其他设备(例如其他终端、计算机和外部设备)通过数据传输进行通信。

在数据通信中,按每次传送的数据位数,通信方式可分为:

并行通信和串行通信。

并行通信时数据的各个位同时传送,可以字或字节为单位并行进行。

并行通信速度快,但用的通信线多、成本高,故不宜进行远距离通信。

计算机或PLC各种内部总线就是以并行方式传送数据的。

工作原理特点

1、各数据位同时传输,传输速度快、效率高,多用在实时、快速的场合。

2、微机系统中最基本的信息交换方式。

3、并行传递的信息不要求固定的格式。

4、并行接口的数据传输率比串行接口快8倍,标准并口的数据传输率理论值为1Mbps(兆比特/秒). 

5、并行传输的数据宽度可以是1~128位,甚至更宽,但是有多少数据位就需要多少根数据线,因此传输的成本较高。

6、并行通信抗干扰能力差。

7、在集成电路芯片的内部、同一插件板上各部件之间、同一机箱内个插件板之间的数据传输都是并行的。

8、以计算机的字长,通常是8位、16位或32位为传输单位,一次传送一个字长的数据。

9、适合于外部设备与微机之间进行近距离、大量和快速的信息交换。

10、并行数据传输只适用于近距离的通信,通常传输距离小于30米。

并行接口

一般地并行接口有3个方面的功能:

⑴实现与系统总线的连接:

提供数据的输入输出功能。

⑵实现与外设连接:

确保与外设间有效进行数据的接收和发送。

⑶具有中断请求处理功能:

外设输入输出采用中断的方法来实现。

接口连接

典型的双向并行接口与外设连接

 

1行接口与CPU的连接

⑴数据总线:

是CPU与并行接口进行数据交换的通道。

⑵读出写入信号线:

控制数据流向,确定操作是读还是写。

⑶复位线,准备好状态线:

并行接口数据准备就绪。

⑷中断请求线:

并行接口向CPU进行中断请求。

⑸地址译码电路:

进行选择不同的接口电路,选择接口电路内部不同的寄存器。

⒉并行接口与外设的连接

⑴输入设备:

数据输入线,设备数据准备就绪状态线和接口接收数据回答线。

⑵输出设备:

数据输出线,接口数据准备就绪状态线和外设接收数据回答线。

⒊并行接口

⑴控制寄存器:

接收CPU发来的控制命令。

⑵数据输入缓冲器、数据输出缓冲器:

进行数据的输入、输出。

⑶状态寄存器:

提供接口电路工作状态供CPU查询。

传输原理

⒈并行接口输入数据的过程 

外设将数据送到“数据输入线”,通过“输入数据准备好”状态线通知并行接口取走,接口将数据锁存到“输入缓冲器”,通过“数据输入回答”线通知外设,接口数据缓冲器已满,不要再送数据,接口在其内“状态寄存器”的相应位置1,便于CPU查询和接口向CPU发中断请求之用。

CPU从接口将数据取走后,接口将“数据输入准备好”、“数据输入回答”信号清除,以便外设输入下一个数据。

 

⒉并行接口输出数据的过程

接口“数据输出缓冲器”空,“数据输出准备好”状态线送1,收到CPU发的数据,将之复位清0,数据通过“数据输出”线送外设,由“数据输出准备好”线通知外设取数据。

实例

微机系统中最基本的信息交换方法

例如:

微机与并行接口打印机、磁盘驱动器

例如:

系统板上各部件之间,接口电路板上各部件之间

1.1.2串行通信

串行通信可以分为:

同步通信(SynchronousCommunication)和异步通信(AsynchronousCommunication)两类。

在单片机中,主要使用异步通信方式。

(1)异步通信

¢特点:

数据是以字符为信息单位传送的。

每个字符由起始位、数据位、奇偶校验位和停止位四部分组成,称为一帧。

每帧数据只包括一个字符。

字符与字符之间的传送是异步的,而每个字符内部的位传送是同步的。

¢其典型格式为:

1.2几种数据传送(控制)方式的利与弊

CPU与I/O设备之间的几种数据传送方式

1、程序查询方式2、程序中断3、直接内存访问4、通道方式5、外围处理机方式

数据传送控制方式有程序直接控制方式、中断控制方式、DMA方式和通道方式4种。

程序直接控制方式就是由用户进程来直接控制内存或CPU和外围设备之间的数据传送。

它的优点是控制简单,也不需要多少硬件支持。

它的缺点是CPU和外围设备只能串行工作;设备之间只能串行工作,无法发现和处理由于设备或其他硬件所产生的错误。

中断控制方式是利用向CPU发送中断的方式控制外围设备和CPU之间的数据传送。

它的优点是大大提高了CPU的利用率且能支持多道程序和设备的并行操作。

它的缺点是由于数据缓冲寄存器比较小,如果中断次数较多,仍然占用了大量CPU时间;在外围设备较多时,由于中断次数的急剧增加,可能造成CPU无法响应中断而出现中断丢失的现象;如果外围设备速度比较快,可能会出现CPU来不及从数据缓冲寄存器中取走数据而丢失数据的情况。

DMA方式是在外围设备和内存之间开辟直接的数据交换通路进行数据传送。

它的优点是除了在数据块传送开始时需要CPU的启动指令,在整个数据块传送结束时需要发中断通知CPU进行中断处理之外,不需要CPU的频繁干涉。

它的缺点是在外围设备越来越多的情况下,多个DMA控制器的同时使用,会引起内存地址的冲突并使得控制过程进一步复杂化。

通道方式是使用通道来控制内存或CPU和外围设备之间的数据传送。

通道是一个独立与CPU的专管输入/输出控制的机构,它控制设备与内存直接进行数据交换。

它有自己的通道指令,这些指令受CPU启动,并在操作结束时向CPU发中断信号。

该方式的优点是进一步减轻了CPU的工作负担,增加了计算机系统的并行工作程度。

缺点是增加了额外的硬件,造价昂贵.

2.单片机的C语言参数传递机制研究

2.11个或2个参数传递的寄存器数据传递

寄存器数据传递

参数传递到哪里取决于参数的大小和数量。

如果只传递很少的字节数,寄存器是用来向过程传递参数的极好位置。

如果只向过程传递一个参数,应该使用下列与相应数据类型对应的寄存器:

这并不是一个严格的规则。

如果发现使用寄存器SI或BX传递16位数值更方便,完全可以这样做。

然而,多数程序员习惯于使用上面的寄存器传递参数。

如果使用80x86的寄存器向过程传递多个参数,应该按照下面的顺序来使用寄存器:

后eax,edx,ecx,esi,edi,ebx通常情况下,应该避免使用寄存器EBP。

如果需要传递的数值超过6个双字,应该使用其他的位置传递数值。

这种优先选择顺序不是完全任意的。

许多高级语言会试图使用寄存器EAX、EDX和ECX传递参数(通常按这个顺序)。

而且,Intel的ABI(applicationbinaryinterface,应用程序二进制接口)允许高级语言的过程在使用寄存器EAX、EDX和ECX时不必保存它们的值。

因此,这3个寄存器是传递参数的主要位置,因为许多代码都假定它们的数值在过程调用的时候被修改。

例如,考虑下面的过程strfill(s,c);,它将字符c(通过值传递到寄存器AL中)在字符串s(引用方式传递到寄存器EDI中)中的每一个字符位置进行一次复制,直到出现0结束字节:

//strfill-Overwritesthedatainastringwithacharacter.////EDI-Pointertozero-terminatedstring(e.g.,anHLAstring)//AL-Charactertostoreintothestringprocedurestrfill;@nodisplay;beginstrfill;push(edi);//Preservethisbecauseitwillbemodified.while((typechar[edi])<>#0)domov(al,[edi]);inc(edi);endwhile;pop(edi);endstrfill;在调用过程strfill之前,应首先将字符串数据的地址写入寄存器EDI,同时把字符数据保存在AL中。

下面的代码段是对过程strfill的调用示例:

mov(s,edi);//Getptrtostringdataintoedi(assumess:

string).mov('',al);strfill();不要忘记,HLA的字符串变量是指针。

这个示例假定s是HLA的字符串变量,因此包含一个指向0结束字符串的指针。

因此,指令mov(s,edi);将0结束字符串的地址写入寄存器EDI(因此,这句代码将字符串数据的地址传递给strfill,也就是使用引用方式传递字符串)。

通过寄存器进行参数传递的一种方法是在调用前写入参数的相应值,而后在过程内部对这些寄存器进行引用。

在汇编语言编程中,这是一种使用寄存器传递参数的传统机制。

HLA与传统的汇编语言相比相对高级,它提供了一种形参声明语法以告知HLA正在使用通用寄存器传递某个特定参数。

这种声明语法为:

parmName:

parmTypeinreg其中parmName是参数名称,parmType是参数类型,reg是一个80x86的8位、16位或32位的通用寄存器。

参数类型的数据宽度必须与寄存器的容量相同,否则HLA会报出错误。

下面是一个具体示例:

procedureHasRegParms(count:

uns32inecx;charVal:

charinal);这种语法有一个很好的特性,它使您可以像调用其他过程一样使用HLA的高级语法调用一个含有寄存器参数的过程,例如:

HasRegParms(ecx,b1);如果指定与所声明的形参相同的寄存器作为实参,HLA将不再发出其他任何额外代码,它假定参数的数值已经保存在相应的寄存器中。

例如,上述调用中的第一个实参就是寄存器ECX中的值,因为过程声明指定了第一个参数在ECX中,故HLA将不再发出任何代码。

另一方面,第二个实参在寄存器BL中,但过程却希望这个参数在AL中。

因此,HLA会在调用过程之前发出指令mov(bl,al);。

这样,在过程的入口点,参数的数值就已经保存在相应的寄存器中了。

同样可以通过寄存器使用引用方式传递参数。

考虑下面的声明:

procedureHasRefRegParm(varmyPtr:

uns32inedi);对这个过程的调用需要存储器操作数作为实参。

HLA将发出代码把存储器对象的地址写入参数的寄存器(本例中是指EDI)。

需要注意的是,由于地址是32位数据宽度的,因此,传递引用参数时必须使用32位的通用寄存器。

下面是一个调用HasRefRegParm的示例:

HasRefRegParm(x);在调用指令call之前,HLA将发出mov(&x,edi);指令或lea(edi,x);指令,目的是把x的地址写入寄存器EDI中18。

如果把一个匿名存储器对象(如[edi]或[ecx])作为参数传递给过程HasRefRegParm,同时,存储器引用所使用的恰好是您为参数声明的那个寄存器(即[edi]),那么,HLA将不再生成任何代码。

如果不使用寄存器EDI,而指定另一个间接寻址方式的寄存器(如[ecx]),HLA将使用一条简单的mov指令把实际地址复制到寄存器EDI中。

如果使用更加复杂的寻址方式如[edi+ecx*4+2],HLA将使用lea指令来计算匿名存储器操作数的有效地址。

在过程代码内部,HLA会为寄存器参数创建等价的文字名称,并把它们映射到相应的寄存器。

在HasRegParms的示例中,无论何时引用参数count,HLA都会用ecx取代count。

同样地,在过程体内部,HLA使用al取代charVal。

由于这些都是寄存器的别名,因此需要当心,不能再独立于这些名称使用ECX和AL。

一个很好的编程习惯是在这些参数的每一次使用后都加上一条注释

2.2通过堆栈操作实现参数的传递

函数,相信许多人也知道其重要性;一个文件往往由一个或者多个函数构成的。

函数调用还有一些深层问题,

一、基本概念:

1.堆栈:

所谓堆栈,其实也就是程序使用的一种内存元素;它是内存中用来存放一些数据的区域。

堆和栈的区别;平常经常说的堆栈,其实也是栈,而不是堆,所以这里也一样。

注意这和数据结构说的栈其实还是有区别的,不要混在一起。

2.堆栈的工作方式:

平常我们所说的数据是怎么存放在内存的?

是从低地址开始,然后按照数据占用字节大小往高地址逐个存放的。

但堆栈就不一样了。

堆栈的工作方式是数据插入堆栈区域然后从堆栈区域删除数据。

这是概括的说法。

具体是这样的:

在UNIX/LINUX中,堆栈是从高地址向低地址衍生的。

这里得说一个重要的东西,那就是堆栈指针ESP。

堆栈指针是什么?

它永远指向堆栈中的顶部(但如果按照地址值来说却是底部),是不是对顶部这个词的理解感觉有点模糊?

就是说,比如说你压栈,就压进一个4字节的数据元素,那么ESP就向下移动了4个字节,注意这里是向下移动,所以ESP应该指向了更低的地址,所以说它是指向了底部。

你可以把堆栈想象成一个杯子,倒进水了水平线是不是上升了(这里把杯子最底端假设成高地址,把顶端设为低地址),倒出水了水平线是不是下降了?

就和压栈和进栈的道理一样的。

3.压栈和进栈指令简介:

压栈指令:

pushxsource

其中,'x'可以是'w'(表示字),或者是'l'(表示长字);source可以是数值或者寄存器值或者内存地址;

出栈指令:

popxdes

同样,'x'可以是'w'(表示字),或者是'l'(表示长字);des可以是寄存器值或内存值

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 交通运输

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1