ImageVerifierCode 换一换
格式:DOCX , 页数:33 ,大小:142.11KB ,
资源ID:8623666      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8623666.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(C系列编程语言内部数据传递机制研究本科毕业论文.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、C系列编程语言内部数据传递机制研究本科毕业论文毕业论文(设计)【摘 要】数据传递是计算机通信中一个十分重要的问题。计算机与外部硬件设备的数据传递一般是通过C语言或汇编语言实现的。因此C系列编程语言内部数据传递机制研究就显得尤为重要。本文主要研究了计算机硬件系统以及单片机之间的数据传递问题。C语言是采用了模块化结构,其本身是一种结构化程序设计语言,模块化结构就是把一个大问题逐步分解成若干独立的小问题,然后再把这些小问题在分解成若干个简单的子问题直到这些子问题或小问题能直接用程序的三种基本结构表达出来。然后,对应每一个小问题或子问题编写出一个功能相对独立的程序块来,这些小程序块就称作模块,而每个模

2、块由功能不一样的函数组成。可以说C语言是由函数组成的。一个C源程序至少包含一个主函数(main函数)也可以包含一个MAIN函数和其他若干个函数,由主函数调用其他函数。其他函数也可以相互调用。每个函数在程序中都用来执行一个特定的功能。对于同一个程序中的函数并不是完全独立的。它们需要通过相互之间调用组成一个有机的整体来实现程序所要完成的任务。其中数据传递是一个极为重要而又特殊的问题,它直接影响程序的功能。显然不同函数间的数据传递就成了一个不可忽视的问题。【关键词】 C语言 数据传递机制 研究 Study on the mechanism of the C series programming la

3、nguage internal data transfer【Abstract】Data transmission is a very important problem in computer communication. Data transfer is through the C language and assembly language to achieve. Therefore it is important to C series programming language internal data transfer mechanism research. This paper m

4、ainly studies between computer hardware and the MCU data transfer.The C language is adopted modular structure, which itself is a structured programming language, the modular structure is the small problem is a big problem gradually decomposed into several independent, then put these little problems

5、expressed in three kinds of basic structure is divided into several simple problems until the problem or small problems can be directly with the program. Then, each corresponding to a small problems or subproblems write block a function relatively independent, these small block is called a module, a

6、nd the function of each module is composed of function is not the same as the composition. It can be said that the C language is a function of the composition. A C source code that contains at least one main function (main function) can also contain a MAIN function and a number of other functions, f

7、rom the main function call other functions. The other function can call each other. Each function is used to perform a specific function in the program. For the and function the same program are not completely independent. They need through the interaction between calls to form an organic whole to i

8、mplement procedures to complete the task. The data transfer is a very important and special problems, which directly affect the function of the procedure. Obviously, the data transfer between different function has become a problem that can not be ignored. Research on transmission mechanism of inter

9、nal data of C series programming language has become a necessity in C language program design. 【Key words】 C Data transmission mechanism consider目 录引 言 11. 通信的基本概念1.1并行与串行的概念 21.1.1并行通信 31.1.2串行通信 51.2几种数据传送(控制)方式的利与弊 62.单片机的C语言参数传递机制研究 62.1 1个或2个参数传递的寄存器数据传递 62.2 通过堆栈操作实现参数的传递 83.MOV指令实现数据传递 184. 数

10、据结构(C语言)概述 194.1C语言背景和数据类型 195. C语言函数返回值实现数据传递的利弊 205.1Return的使用 206. C语言函数参数实现数据传递方法机制 226.1无参函数的数据传递机制 226.2有参函数的数据传递 236.2.1参数为简单变量数据传递研究及其特点 236.2.2参数为非简单变量数据传递研究及其特点 24 6.3指针参数实现“双向传递”研究 257.全局变量实现数据传递机制研究 26总结以及展望 28参考文献 29附录 30致谢. 30引言 数据传递是计算机通信中一个十分重要的问题。PC与外围设备数据传递一般是通过C语言或汇编语言实现的。因此C系列编程语

11、言内部数据传递机制研究就显得尤为重要。本文主要研究了计算机硬件系统以及PC与单片机之间的数据传递问题。C语言是采用了模块化结构,其本身是一种结构化程序设计语言,模块化结构就是把一个大问题逐步分解成若干独立的小问题,然后再把这些小问题在分解成若干个简单的子问题直到这些子问题或小问题能直接用程序的三种基本结构表达出来。然后,对应每一个小问题或子问题编写出一个功能相对独立的程序块来,这些小程序块就称作模块,而每个模块由功能不一样的函数组成。可以说C语言是由函数组成的。一个C源程序至少包含一个主函数(main函数)也可以包含一个MAIN函数和其他若干个函数,由主函数调用其他函数。其他函数也可以相互调用

12、。每个函数在程序中都用来执行一个特定的功能。对于同一个程序中的函数并不是完全独立的。它们需要通过相互之间调用组成一个有机的整体来实现程序所要完成的任务。其中数据传递是一个极为重要而又特殊的问题,它直接影响程序的功能。显然不同函数间的数据传递就成了一个不可忽视的问题。1通信的概念通信,指人与人或人与自然之间通过某种行为或媒介进行的信息交流与传递,从广义上指需要信息的双方或多方在不违背各自意愿的情况下无论采用何种方法,使用何种媒质,将信息从某方准确安全传送到另方。通信在不同的环境下有不同的解释,在出现电波传递通信后通信(Communication)被单一解释为信息的传递, 是指由一地向另一地进行信

13、息的传输与交换,其目的是传输消息。然而,通信是在人类实践过程中随着社会生产力的发展对传递消息的要求不断提升使得人类文明不断进步。1.1并行与串行的概念 在微型计算机中,通信(数据交换)有两种方式:并行通信和串行通信。 并行通信是指计算机与I/O设备之间通过多条传输 线交换数据,数据的各位同时进行传送。 串行通信是指计算机与I/O设备之间仅通过一条传 输线交换数据,数据的各位是按顺序依次一位接 一位进行传送。 应该理解所谓的并行和串行,仅是指I/O接口与I/O设备之间数据交换(通信)是并行或串行。无论怎样CPU与I/O接口之间数据交换总是并行。 并行通信串行通信传输速率高传输速率相对较低传输距离

14、短(30m)通信距离长(几米至几公里)成本高(要采用多条数据线)成本较低应用:如电脑输出数据到打印机;51单片机的P口应用:电脑上的9针座(人称串口);51单片机的全双工异步串行口RXD、TXD 1.1.1并行通信定义:在计算机和终端之间的数据传输通常是靠电缆或信道上的电流或电压变化实现的。如果一组数据的各数据位在多条线上同时被传输,这种传输方式称为并行通信。编辑本段分类终端与其他设备(例如其他终端、计算机和外部设备)通过数据传输进行通信。在数据通信中,按每次传送的数据位数,通信方式可分为:并行通信和串行通信。并行通信时数据的各个位同时传送,可以字或字节为单位并行进行。并行通信速度快,但用的通

15、信线多、成本高,故不宜进行远距离通信。计算机或PLC各种内部总线就是以并行方式传送数据的。工作原理特点1、各数据位同时传输,传输速度快、效率高,多用在实时、快速的场合。2、微机系统中最基本的信息交换方式。3、并行传递的信息不要求固定的格式。4、并行接口的数据传输率比串行接口快8倍,标准并口的数据传输率理论值为1Mbps(兆比特/秒). 5、并行传输的数据宽度可以是1128位,甚至更宽,但是有多少数据位就需要多少根数据线,因此传输的成本较高。6、并行通信抗干扰能力差。7、在集成电路芯片的内部、同一插件板上各部件之间、同一机箱内个插件板之间的数据传输都是并行的。8、以计算机的字长,通常是8位、16

16、位或32位为传输单位,一次传送一个字长的数据。9、适合于外部设备与微机之间进行近距离、大量和快速的信息交换。10、并行数据传输只适用于近距离的通信,通常传输距离小于30米。并行接口一般地并行接口有 3 个方面的功能:实现与系统总线的连接:提供数据的输入输出功能。实现与外设连接:确保与外设间有效进行数据的接收和发送。具有中断请求处理功能:外设输入输出采用中断的方法来实现。接口连接典型的双向并行接口与外设连接1 行接口与CPU的连接数据总线:是CPU与并行接口进行数据交换的通道。读出写入信号线:控制数据流向,确定操作是读还是写。复位线,准备好状态线:并行接口数据准备就绪。中断请求线:并行接口向CP

17、U进行中断请求。地址译码电路:进行选择不同的接口电路,选择接口电路内部不同的寄存器。并行接口与外设的连接输入设备:数据输入线,设备数据准备就绪状态线和接口接收数据回答线。 输出设备:数据输出线,接口数据准备就绪状态线和外设接收数据回答线。并行接口控制寄存器:接收CPU发来的控制命令。数据输入缓冲器、数据输出缓冲器:进行数据的输入、输出。状态寄存器:提供接口电路工作状态供CPU查询。传输原理 并行接口输入数据的过程 外设将数据送到“数据输入线”,通过“输入数据准备好” 状态线通知并行接口取走,接口将数据锁存到“输入缓冲器”,通过“数据输入回答”线通知外设,接口数据缓冲器已满,不要再送数据,接口在

18、其内“状态寄存器” 的相应位置 1,便于CPU 查询和接口向CPU 发中断请求之用。 CPU 从接口将数据取走后,接口将“数据输入准备好”、“数据输入回答” 信号清除,以便外设输入下一个数据。 并行接口输出数据的过程 接口“数据输出缓冲器” 空,“数据输出准备好” 状态线送 1,收到CPU 发的数据,将之复位清0,数据通过“数据输出” 线送外设,由“数据输出准备好” 线通知外设取数据。实例微机系统中最基本的信息交换方法例如:微机与并行接口打印机、磁盘驱动器例如:系统板上各部件之间,接口电路板上各部件之间1.1.2串行通信串行通信可以分为:同步通信(Synchronous Communicati

19、on)和异步通信(Asynchronous Communication)两类。在单片机中,主要使用异步通信方式。 (1)异步通信 特点:数据是以字符为信息单位传送的。每个字符由起始位、数据位、奇偶校验位和停止位四部分组成,称为一帧。 每帧数据只包括一个字符。字符与字符之间的传送是异步的,而每个字符内部的位传送是同步的。 其典型格式为: 1.2几种数据传送(控制)方式的利与弊CPU与I/O设备之间的几种数据传送方式1、程序查询方式2、程序中断3、直接内存访问4、通道方式5、外围处理机方式 数据传送控制方式有程序直接控制方式、中断控制方式、DMA方式和通道方式4种。 程序直接控制方式就是由用户进程

20、来直接控制内存或CPU和外围设备之间的数据传送。它的优点是控制简单,也不需要多少硬件支持。它的缺点是CPU和外围设备只能串行工作;设备之间只能串行工作,无法发现和处理由于设备或其他硬件所产生的错误。 中断控制方式是利用向CPU发送中断的方式控制外围设备和CPU之间的数据传送。它的优点是大大提高了CPU的利用率且能支持多道程序和设备的并行操作。它的缺点是由于数据缓冲寄存器比较小,如果中断次数较多,仍然占用了大量CPU时间;在外围设备较多时,由于中断次数的急剧增加,可能造成CPU无法响应中断而出现中断丢失的现象;如果外围设备速度比较快,可能会出现 CPU来不及从数据缓冲寄存器中取走数据而丢失数据的

21、情况。 DMA方式是在外围设备和内存之间开辟直接的数据交换通路进行数据传送。它的优点是除了在数据块传送开始时需要CPU的启动指令,在整个数据块传送结束时需要发中断通知CPU进行中断 处理之外,不需要CPU的频繁干涉。它的缺点是在外围设备越来越多的情况下,多个DMA控制 器的同时使用,会引起内存地址的冲突并使得控制过程进一步复杂化。 通道方式是使用通道来控制内存或CPU和外围设备之间的数据传送。通道是一个独立与CPU的专管 输入输出控制的机构,它控制设备与内存直接进行数据交换。它有自己的通道指令,这些指令受CPU启动,并在操作结束时向CPU发中断信号。该方式的优点是进一步减轻了CPU的工作负担,

22、增加了计算机系统的并行工作程度。缺点是增加了额外的硬件,造价昂贵 .2. 单片机的C语言参数传递机制研究2.1 1个或2个参数传递的寄存器数据传递寄存器数据传递参数传递到哪里取决于参数的大小和数量。如果只传递很少的字节数,寄存器是用来向过程传递参数的极好位置。如果只向过程传递一个参数,应该使用下列与相应数据类型对应的寄存器:这并不是一个严格的规则。如果发现使用寄存器SI或BX传递16位数值更方便,完全可以这样做。然而,多数程序员习惯于使用上面的寄存器传递参数。如果使用80x86的寄存器向过程传递多个参数,应该按照下面的顺序来使用寄存器:先 后 eax,edx,ecx,esi,edi,ebx 通

23、常情况下,应该避免使用寄存器EBP。如果需要传递的数值超过6个双字,应该使用其他的位置传递数值。这种优先选择顺序不是完全任意的。许多高级语言会试图使用寄存器EAX、EDX和ECX传递参数(通常按这个顺序)。而且,Intel的ABI(application binary interface,应用程序二进制接口)允许高级语言的过程在使用寄存器EAX、EDX和ECX时不必保存它们的值。因此,这3个寄存器是传递参数的主要位置,因为许多代码都假定它们的数值在过程调用的时候被修改。例如,考虑下面的过程strfill(s,c);,它将字符c(通过值传递到寄存器AL中)在字符串s(引用方式传递到寄存器EDI中

24、)中的每一个字符位置进行一次复制,直到出现0结束字节:/ strfill- Overwrites the data in a string with a character. / / EDI- Pointer to zero-terminated string (e.g., an HLA string) / AL- Character to store into the string procedure strfill; nodisplay; begin strfill; push( edi ); / Preserve this because it will be modified. whi

25、le( (type char edi ) #0 ) do mov( al, edi ); inc( edi ); endwhile; pop( edi ); end strfill; 在调用过程strfill之前,应首先将字符串数据的地址写入寄存器EDI,同时把字符数据保存在AL中。下面的代码段是对过程strfill的调用示例: mov( s, edi ); / Get ptr to string data into edi (assumes s:string). mov( , al ); strfill(); 不要忘记,HLA的字符串变量是指针。这个示例假定s是HLA的字符串变量,因此包含一

26、个指向0结束字符串的指针。因此,指令mov(s,edi);将0结束字符串的地址写入寄存器EDI(因此,这句代码将字符串数据的地址传递给strfill,也就是使用引用方式传递字符串)。通过寄存器进行参数传递的一种方法是在调用前写入参数的相应值,而后在过程内部对这些寄存器进行引用。在汇编语言编程中,这是一种使用寄存器传递参数的传统机制。HLA与传统的汇编语言相比相对高级,它提供了一种形参声明语法以告知HLA正在使用通用寄存器传递某个特定参数。这种声明语法为:parmName: parmType in reg 其中parmName是参数名称,parmType是参数类型,reg是一个80x86的8位、

27、16位或32位的通用寄存器。参数类型的数据宽度必须与寄存器的容量相同,否则HLA会报出错误。下面是一个具体示例:procedure HasRegParms( count: uns32 in ecx; charVal:char in al ); 这种语法有一个很好的特性,它使您可以像调用其他过程一样使用HLA的高级语法调用一个含有寄存器参数的过程,例如: HasRegParms( ecx, b1 );如果指定与所声明的形参相同的寄存器作为实参,HLA将不再发出其他任何额外代码,它假定参数的数值已经保存在相应的寄存器中。例如,上述调用中的第一个实参就是寄存器ECX中的值,因为过程声明指定了第一个参

28、数在ECX中,故HLA将不再发出任何代码。另一方面,第二个实参在寄存器BL中,但过程却希望这个参数在AL中。因此,HLA会在调用过程之前发出指令mov(bl,al);。这样,在过程的入口点,参数的数值就已经保存在相应的寄存器中了。同样可以通过寄存器使用引用方式传递参数。考虑下面的声明:procedure HasRefRegParm( var myPtr:uns32 in edi );对这个过程的调用需要存储器操作数作为实参。HLA将发出代码把存储器对象的地址写入参数的寄存器(本例中是指EDI)。需要注意的是,由于地址是32位数据宽度的,因此,传递引用参数时必须使用32位的通用寄存器。下面是一个

29、调用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将使用l

30、ea指令来计算匿名存储器操作数的有效地址。在过程代码内部,HLA会为寄存器参数创建等价的文字名称,并把它们映射到相应的寄存器。在HasRegParms的示例中,无论何时引用参数count,HLA都会用ecx取代count。同样地,在过程体内部,HLA使用al取代charVal。由于这些都是寄存器的别名,因此需要当心,不能再独立于这些名称使用ECX和AL。一个很好的编程习惯是在这些参数的每一次使用后都加上一条注释2.2通过堆栈操作实现参数的传递函数,相信许多人也知道其重要性;一个文件往往由一个或者多个函数构成的。函数调用还有一些深层问题, 一、基本概念:1.堆栈:所谓堆栈,其实也就是程序使用的一

31、种内存元素;它是内存中用来存放一些数据的区域。堆和栈的区别;平常经常说的堆栈,其实也是栈,而不是堆,所以这里也一样。注意这和数据结构说的栈其实还是有区别的,不要混在一起。2.堆栈的工作方式:平常我们所说的数据是怎么存放在内存的?是从低地址开始,然后按照数据占用字节大小往高地址逐个存放的。但堆栈就不一样了。堆栈的工作方式是数据插入堆栈区域然后从堆栈区域删除数据。这是概括的说法。具体是这样的:在UNIX/LINUX 中,堆栈是从高地址向低地址衍生的。这里得说一个重要的东西,那就是堆栈指针ESP。堆栈指针是什么?它永远指向堆栈中的顶部(但如果按照地址值来说却是底部),是不是对顶部这个词的理解感觉有点

32、模糊?就是说,比如说你压栈,就压进一个4字节的数据元素,那么ESP就向下移动了4个字节,注意这里是向下移动,所以ESP应该指向了更低的地址,所以说它是指向了底部。你可以把堆栈想象成一个杯子,倒进水了水平线是不是上升了(这里把杯子最底端假设成高地址,把顶端设为低地址),倒出水了水平线是不是下降了?就和压栈和进栈的道理一样的。3.压栈和进栈指令简介:压栈指令 : pushx source其中, x可以是 w(表示字), 或者是l(表示长字);source可以是数值或者寄存器值或者内存地址;出栈指令 : popx des同样,x可以是 w(表示字), 或者是l(表示长字);des可以是寄存器值或内存值

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

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