欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    c语言课程设计2高级编程的硬件基础.pdf

    • 资源ID:70010280       资源大小:190.40KB        全文页数:9页
    • 资源格式: PDF        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    c语言课程设计2高级编程的硬件基础.pdf

    1高级编程的硬件基础高级编程的硬件基础 我们知道,C 语言是一种优秀的程序设计语言,虽简洁,但功能强大。它把高级语言的基本结构和语句与低级语言的实用性结合起来。在采用 C 语言开发大型程序的时候,除了掌握正确的开发流程和方法外,如果能够有较好的软硬件基础,定会扩展你应用 C 语言的能力,开发出更加优秀的程序。2.1 计算机硬件组成.2 2.2 80X86 微机系统.3 2.2.1 主存储器结构.3 2.2.2 寄存器与伪变量.5 2.2.3 实地址寻址方式.5 2.2.4 I/O接口的寻址方式.5 2.3 Turbo C编译方式简介.6 2.3.1 Turbo C的内存模式.6 2.3.2 指针的分类.6 2.4 BIOS与DOS调用.7 2.4.1 中断.7 2.4.2 BIOS调用.7 2.4.3 DOS调用.7 2.5 多文件的程序.7 2.6 Turbo C2.0 库函数介绍.9 2 2.1 计算机硬件组成 计算机系统由硬件和软件两部分组成。目前计算机的硬件组成仍以经典的冯诺依曼体系结构为主。该结构可以划分为三个子系统:处理器子系统、存储器子系统和输入/输出子系统。如图 2-1 所示,这三个子系统通过总线连接在一起。处理器子系统也就是 CPU(中央处理器或处理器)(如图 2-2 所示),是计算机中的核心部件。在 CPU 内部有三个组成部分:算术逻辑单元、控制单元和寄存器组。算术逻辑单元ALU 即运算器,负责进行算术和逻辑运算;控制单元即控制器,类似控制人身体各部分运动的大脑中枢,主要是控制程序的执行;寄存器组用来临时存放参与 ALU 运算的各种数据,主要有数据寄存器、指令寄存器和指令计数器等。存储器子系统是计算机的记忆部分,由主存储器和辅助存储器组成。主存储器简称内存,是计算机内部的存储器,与 CPU 直接进行电路连接。计算机执行程序时,程序和运行该程序的数据存储于此。无论 CPU 数据处理的长度是多少,在存储器系统中都是以字节为单位进行组织的,即每个存储器字节都有一个唯一的标识叫做存储器地址。CPU 对存储单元内的数据进行存取操作就是通过存储器地址进行的。主存储器有随机存取存储器(RAM)和只读存储器(ROM)两种类型。RAM 是计算机主存储器系统中的主要组成部分,对其单元的存取操作是随机发生的,但其中的数据会随系统断电而消失。ROM 是指其中的数据只能读出,而 输入/输出子系统 处理器子系统 存储器子系统 地址总线 数据总线 控制总线 图 2-1 计算机三个子系统和总线的连接图 2-1 计算机三个子系统和总线的连接控制单元寄存器组数据总线 控制总线图 2-2 CPU 示意图图 2-2 CPU 示意图 ALU 地址总线 3不能写入。这种存储器芯片是为了存放只需要读取的数据和程序而设计的,数据和程序在使用之前被写入。辅助存储器简称外存,具有外设的特性,以 I/O 总线的方式和主机连接。与存储器相比,其存储容量大,存储的信息不会因断电而消失,价格便宜,但存取速度慢。输入/输出子系统简称 I/O 系统,包括了许多种类型的输入输出设备(有时简称外设),以及连接这些设备和处理器、存储器进行数据通信的接口电路。输入输出设备的功能千差万别,工作速度要比 CPU 和存储器慢许多,因此需要接口在其间起到缓冲的作用,实现主机和外设交换数据速度的匹配。连接 CPU、存储器和外设(或者外设接口)的总线就是内部总线,内部总线为三总线结构,分别是地址总线、数据总线和控制总线。地址总线是单向的,总是传送 CPU 需要对存储器和外设进行数据读写的地址信息。CPU 通过存储器单元的地址来寻找需要进行存取操作的对应单元,而对外设(接口)也是通过统一编址的方法,按不同的地址对不同的外设进行操作的。地址总线的数目决定了机器的寻址空间大小。数据总线在 CPU、存储器和外设之间可以双向传输数据,其宽度是计算机处理能力的重要指标,一次存取的数据越多,说明 CPU处理能力越强。一般 16 位 CPU 是指数据总线有 16 位,32 位 CPU 是指数据总线有 32 位。控制总线不同于前两种总线,CPU 根据指令操作的类型,对其发出不同的控制信号,控制其它两种总线或其他 I/O 部件。控制总线是单个信号线的集合,在某个操作发生时只有一个或几个控制信号线起作用。对每一个信号而言是单一方向的。2.2 80X86微机系统 计算机的不同系列,主要是根据计算机所采用的 CPU 来做区分的。CPU 从最初发展至今已经有三十多年的历史了,这期间按照其处理信息的字长可以分为 4 位微处理器、8 位微处理器、16 微处理器、32 微处理器以及 64 位微处理器等等。在微机的微处理器市场中 Intel公司独占鳌头,IBM PC 机及其兼容机主要采用 Intel80X86 芯片。微机的第一代 CPU 正是Intel 在 1979 年推出的 8088 芯片。在早期,Intel 系列的微处理器名字都以 80 开头,所以 Intel公司生产的 CPU 芯片又称为 Intel80X86 系列,其中包括 8086、8088、80186、80286、80386和 80486 等。后来的 Intel80X86 芯片包括 Pentium、Pentium2、Pentium3 和 Pentium4 等。尽管芯片采用的技术越来越先进,但是 Intel 的 80X86 芯片对 8088 是兼容的。而且,考虑到PC 操作系统的延续性,以及与大量已存在软硬件的兼容性,同一系列的微机在其他很多方面也具有兼容性。更重要的是,我们的大型程序设计采用的是 DOS 下的 Turbo C2.0,已对内存和寄存器等做了限制。因此,下面将主要介绍 8088 微机系统的相关内容。2.2.1 主存储器结构主存储器结构 微机的 8080 处理器是 16 位微处理器,地址总线为 20 位,故直接寻址能力为220=1048576=1024K=lM。同属一个系列的 80286 和 80386 及 80486 寻址能力虽大大增加,如 80286 可达 16M,而 80386(80486)可达 4G,但对低 1M 的存储空间所采用的寻址方式是为了和 8088 处理器相兼容而设置的实地址方式,即 DOS 下的寻址方式。在 80X86 微机系列中,主存储器分为两个部分:低 1M 部分称为系统存储器,高于 1M 的部分称为扩展存储器和扩充存储器。1)系统存储器(System Memory)系统存储器(如图 2-3 所示)可分成两个部分:低地址部分(0640K)和高地址部分(641K1024K)。640K 的低地址部分又称为基本内存或常规内存,是 PC 机得以工作的最低内 4存,使用情况如图 2-4 所示,其中主要由 DOS 和用户的应用程序及驻留程序 TSR 占用,DOS所占用的内存量要视其版本而异。用户的应用程序所占地址取决于程序长短,这部分空间是自由空间,当回到系统时,该部分空间即被释放。基本存储器高端存储器00000A0000FFFFF0640K1024K中断向量表000000040000600A000001K1.5K640KBIOS数据区IO.SYS(IBMBIO.COM)MSDOS.SYS(IBMDOS.COM)TSR应用程序COMMAND.COM暂驻部分 图图 2-3 系统存储器系统存储器 图图 2-4 基本存储器基本存储器 384K 的高地址部分被称为高端内存,是留给视频显示和 BIOS 等使用的。它的地址使用情况如图2-5所示,其中A0000到BFFFF用作显示缓冲区,其中CGA显示缓冲区开始于B8000,单色显示缓冲区开始于 B0000,而 VGA、EGA 显示缓冲区开始于 A0000。这些空间也称作视频存储器,简称 VRAM。当 PC 机进行显示时,要显示的字符代码和图像信息均存储在VRAM 中。C0000 到 DFFFF 部分为 ROM 扩充区,它主要存放视频显示器适配器和磁盘的BIOS,一些网络控制板、I/O 接口板和扩充内存分页帧也要用到此部分地址,E0000 到 EFFFF为保留区。F0000 到 FFFFF 是系统 ROM,该部分装有系统引导程序,还有系统基本输入输出系统(BIOS)。单色/CGA/EGA/VGA显示RAM-VRAMA0000B0000C0000D0000E0000F0000FFFFF视频/磁盘BIOS,EMSROM扩充区保留区系统ROM640K704K768K832K896K960K1024K 图图 2-5 高端存储器高端存储器 2)扩展存储器(Extended Memory)和扩充存储器(Expanded Memory)扩展存储器指高于 FFFFFH 或 lM 的那部分存储器,它只能由 80286,80386,或 80486直接去访问。80286 有 24 位寻址能力,故可寻址到 16MB,而 80386 和 80486 有 32 位寻址能力,可直接寻址 4GB。这些处理器对系统存储器采用实地址方式访问,而对扩展存储器采用保护虚地址方式,因而在实地址方式下运行 DOS 时,无法对扩展存储器进行寻址,而必须进行方式切换,即由实方式换到保护方式,对扩展存储器操作完后,再切换到实地址方式下,恢复 DOS 的操作。扩展存储器同系统存储器一样,一般安装在系统板上,以内存条形式插在内存条插座上。扩充存储器是指 PC 处理器寻址范围之外的物理存储器,它也被称为 EMS 存储器。厂家通常以扩充内存板的形式提供,使用时可插在 PC 机的扩充插槽上。扩充存储器使用时,5用高端存储器中的一段地址分配成扩充存储器的分页帧(page frame),用页面映射到 EMS 某一区域,使得应用程序可以访问 EMS 存储器,不断改变分页帧对 EMS 的映射区域,即可访问 EMS 的所有存储区,所以对 EMS 的访问是通过占用系统存储器中的高端部分地址来换取对大量 EMS 存储区的访问,即以小换大。最后再强调一下,不管扩充内存或扩展内存有多大,DOS 的应用程序只能在常规内存下运行。所以在 Turbo C2.0 下我们只需要了解系统存储器的结构和实地址寻址方式即可。2.2.2 寄存器与伪变量寄存器与伪变量 略,详见C 程序设计基础课程设计第 2 章。2.2.3 实地址寻址方式实地址寻址方式 略,详见C 程序设计基础课程设计第 2 章。2.2.4 I/O 接口的寻址方式接口的寻址方式 I/O 接口的寻址方式一般有两种:一种是将接口地址和存储器地址统一编址;一种是 I/O接口地址和存储器地址分别独立编址。微机中的 80 x86CPU 采用 I/O 独立编址方式,采用专门的 I/O 指令来对接口地址进行操作。这样,存储器地址和 I/O 接口地址可以重叠。由于两者需采用不同的指令进行读写操作,所以不会由于地址相同而混淆。这种编址方式的优点是不占用存储器地址,因而不会减少存储器容量。而且由于有专门的 IN 和 OUT 指令,因此比用存储器读写指令执行速度快。但这种方式的缺点是在硬件电路上要对这两种存取进行区别。另外,专门的 I/O 指令功能简单,要完成某些操作还须和某些指令配合。Turbo C 提供了专门对 I/O 接口进行输入输出操作的几个函数,它们是:int inp(int portid);int inport(int portid);int inportb(int portid);void outp(int portid,int value);void outport(int portid,int value);void outportb(int portid,int value);这些函数的原型在 dos.h 中。其中,inp 是等价于 inport 的一个宏,outp 是等价于 outport的一个宏。inport 函数从指定的接口地址 portid 中读入一个字(即 l6 位二进制数),而 inportb则从指定的接口地址 pontid 中读入一个字节(8 位二进制数)。当执行这两个函数后,它们均返回各自从接口地址所对应的输入设备中得到的 16 位或 8 位二进制数。outport 函数把一个16 位二进制数 value 发送到口地址为 portid 的接口中去。对于 PC 机,实际上是将低字节数送到口地址为 portid 接口中去,将高字节送到口地址为 portid+1 的接口中去。outportb 函数是将一个字节的数 value 送到口地址为 portid 的接口中去。62.3 Turbo C编译方式简介 2.3.1 Turbo C 的的内存模式内存模式 略,详见C 程序设计基础课程设计第 2 章 2.3.2 指针的分类指针的分类 在处理实际问题时,常常会遇到混合模式编程问题。例如,所编写的程序要处理的数据超过一个段的容量,但又希望用小模式来编译程序,以使程序代码短小并且高效。为解决这类问题,C 语言中提供了段跨越修饰符 near、far 和 huge。当它们作用于指针时,将影响数据的访问方式,其中 near 和 far 可以修饰数据指针和函数指针,而 huge 只能用来修饰数据指针。由于我们编程序时,只关心数据的存取,代码的分配和执行由编译程序根据内存模式进行了管理,用户一般不需干预,因而我们下面介绍三类指针时,只介绍指向数据的指针。1)近程指针(near 型)near 指针是 16 位的指针,它只表示段内的偏移地址,因而用近指针只能对 64K 字节的数据段内地址进行存取,这时段地址是固定存放在 DS 段寄存器内。近指针可用 near 进行说明,如定义一个指向字符型数据的 near 指针 p,可写作:char near*p;near 型指针最大值不能超过 64K(即 65535),例如:p=(char near*)0 x10000;由于 p 的最大值只能到 0 xffff,即 65535,当加 1 变成 65536,即 0 x10000 时,编译便出错,因它只能是 16 位指针,地址位不能大于 16。用下面方式:char near*p;p=(char near*)0 xffff;p+;printf(“%u”,p);虽然 p 赋值为 0 xffff 编译不会出错,但 p+后结果为 0,这种现象叫做折回,即超过 64K 的地址,重新又从 0 开始算起。用近指针进行存取操作时,因无需进行段地址的计算,因而运算速度快。在小数据内存模式下,由于数据仅在一个数据段内存取,采用 near 型指针,因而定义指针时,可不加说明。2)远程指针(far 型)程序有时要作用于数据段以外的内存区,但是如果将整个程序都按照紧凑或大模式编译,那么对所有数据的存取,包括段内数据的存取都会变慢。使用 far 可以解决这个问题。即将指向当前数据段之外的指针说明成 far 类型。far 指针是 32 位的指针,它表示段地址:偏移地址。例如,定义 far 指针 p 指向 B500 段的 2 号地址,即 B500:0002,则可写作:char far*p=(char far*)0 xB5000002;因而用远程数据指针可以指向任何的数据段内地址。但是,由于段不同,偏移会不同。不同的 far 指针可能代表同一物理地址,例如 23B0:0004、23A1:00F4、2300:0B04,但是当对这些指针进行关系运算时,会得出不相等的结论。另外,far 指针的值在进行增减时,只有偏移地址部分进行运算,段地址部分并不参加运算,因此会出现折回现象。3)巨指针(huge)7huge 指针如同 far 指针一样为 32 位,表示段地址:偏移地址,可寻址内存内的任何地址,但与 far 指针不同的是,当 huge 指针的偏移地址超过 64K 时,并不会折回,而是重新改变段地址。huge 指针又称为规格化的指针。所谓规格化实际上就是将指针统统转化为 20位(二进制)的物理地址(即真正的内存绝对地址),例如 2F84:0532 的规格化指针地址可表示为 2FD7:0002,其中左边的 16 位作为段地址,右边的低 4 位作为偏移地址。它是由下式计算而来:段地址左移 4 位 0010 1111 1000 0100 0000=2f840H 偏移地址+0000 0101 0011 0010=0532H 物理地址 0010 1111 1101 0111 0010=2fd72H 因此当用 huge 指针进行=、!=、=、和=等关系运算,就不会像 far 指针一样发生差错。例如前面提到的 far 指针 23B0:0004、23A1:00F4 和 2300:0B04,若是 huge 指针的话,它们都将自动规格化为 23B0:0004,因此是相等的。下面定义了一个 huge 指针并赋了值:char huge*p;p=(char huge*)0 x235b0012;由于 huge 指针要进行规格化,即要调用库中的专用程序,因而其运算速度也比 far 指针慢,更比 near 指针慢。2.4 BIOS与DOS调用 2.4.1 中断中断 略,详见C 程序设计基础课程设计第 2 章。2.4.2 BIOS 调用调用 略,详见C 程序设计基础课程设计第 2 章。2.4.3 DOS 调用调用 略,详见C 程序设计基础课程设计第 2 章。2.5多文件的程序 当一个程序较大时,可将一个程序分成几个部分,每个部分可单独成为一个源文件,这些文件通过全局变量或函数相联系。它们可进行单独编译,形成.OBJ 文件。通常采用下面两种方法将这些文件组合成一个完整的实用程序。1)include 方法 假设一个程序分成了 A1.c 和 A2.c 两个源文件,其中 A1.C 中调用的函数 A2()在 A2.C中定义,这时可将 A1.c 写成:#include 8#include“A2.c”/*include 预处理命令*/main().strcpy(s1,s2);A2();而 A2.c 可以写成#include void A2().这样,编译器会根据 include 预处理命令,将 A1.c 文件中该预处理命令出现的行用 A2.c 文件的内容进行改写,得到一个合并的源文件再进行编译,最终产生可执行的程序。2)project 文件法 假设将大程序分成了 A1.c 和 A2.c 两个源文件,project 文件法生成可执行程序的具体步骤如下:首先,制作一个内容为:A1.c A2.c project 文件(工程文件),假设命名为 AA.prj,其中各文件的后缀.c 可省略,先后顺序也无关。这可在 Turbo C 的编辑状态下写成,并用 F2 或 write to 写成一个名为 AA.prj 的文件而存盘。然后,用 ALT_P 选择 Project 菜单中的 Project_name 项,填入生成的文件名 AA.prj 后,按 F9 键(Make),即可生成名为 AA.exe 的可执行文件。若程序还需一些 C 语言标准库不能提供的其它的被编译的程序或库文件,则也可将它们的名字放在 project 文件中,如:mymain myfunc special.obj other.lib 另外,当多个源文件之间用头文件来进行接口时,在 project 文件中应该用圆括号将这些头文件括起来(多个头文件之间可用逗号、空格或分号分隔)。这样一旦头文件改变时,这些源文件将被重新编译。例如,有一主程序名为 mymain.c,它包含头文件 myfuncs.h,而另一文件是 myfuncs.c,它也包含头文件 myfuncs.h,此时 project 文件的内容应写成如下形式:mymain.c (myfuncs.h)myfuncs.c (myfuncs.h)这样,一旦 myfuncs.h 被修改,则对该 project 文件进行编译时,mymain.c 及 myfuncs.c 将被重新编译。这里需要指出的是,在多文件中一定要注意全局变量、静态全局变量以及函数的使用,以免产生错误。92.6 Turbo C2.0库函数介绍 Turbo C 是美国 Borland 公司的产品。Borland 公司是一家专门从事软件开发和研制的大公司。该公司相继推出了一套 Turbo 系列软件,如 Turbo BASIC、Turbo Pascal、Turbo Prolog 等,这些软件很受用户欢迎。该公司在 1987 年首次推出 Turbo C 1.0 产品,其中使用了全然一新的集成开发环境,即使用了一系列下拉式菜单,将文本编辑、程序编译、连接以及程序运行一体化,大大方便了程序的开发。1988 年,Borland 公司又推出 Turbo C1.5版本,增加了图形库和文本窗口函数库等,而 Turbo C2.0 则是该公司 1989 年出版的,可运行于 IBM-PC 系列微机,包括 XT,AT 及 IBM 兼容机。Turbo C2.0 在原来集成开发环境的基础上增加了查错功能,并可以在 Tiny 模式下直接生成.COM(数据、代码、堆栈处在同一 64K 内存中)文件。还可对数学协处理器(支持 8087/80287/80387 等)进行仿真。Borland 公司后来推出的 Turbo C+版本包含了面向对象的基本思想和设计方法。1991 年为了适用Microsoft 公司的Windows 3.0 版本,Borland 公司又将Turbo C+作了更新,即Turbo C 的新一代产品 Borlandc C+问世了。Turbo C2.0 非常适合于结构化程序设计,普遍采用于 C 语言的教学和开发中,全国计算机等级考试 C 语言上机也使用它。Turbo C2.0 提供了丰富的库函数,包括了由 ANSI 标准定义的标准库,加上已有的 UNIX 标准函数和 Turbo C 所补充的函数。所有的库函数及其专用数据和类型都在相应的头文件中声明或定义。通过表 2-4,大家可以了解 Turbo C 头文件以及其中库函数的用途。为了便于使用,本书所附的光盘中提供了 Turbo C2.0 的库函数清单和 Turbo C2.0 的使用手册。表表 2-4 标准头文件标准头文件 头文件 用途 头文件 用途 alloc.h 动态地址分配函数 math.h 数学库使用的各种定义 assert.h 定义 assert()宏 mem.h 内存操作函数 bios.h ROM 基本输入输出函数 process.h spawn()和 exec()函数 conio.h 屏幕操作函数 setjmp.h 非局部跳转 ctype.h 字符操作函数 share.h 文件共享 dir.h 目录操作函数 signal.h 定义信号值 dos.h DOS 接口函数 stdarg.h 变量长度参数表 errno.h 定义出错代码 stddef.h 定义一些常用常数 fcntl.h 定义 open()使用的函数 stdio.h 以流为基础的 I/O 函数 float.h 定义从属于环境工具的浮点值 stdlib.h 其他说明 graphics.h 图形函数 string.h 字符串函数 io.h UNIX 型 I/O 函数 time.h 系统时间函数 limits.h 定义从属于环境工具的各种限定 values.h 从属于机器的常数

    注意事项

    本文(c语言课程设计2高级编程的硬件基础.pdf)为本站会员(qwe****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开