C 语言及应用 中专 教学课件 ppt 作者 孙振业 第8-9章 第9章

上传人:E**** 文档编号:89344222 上传时间:2019-05-23 格式:PPT 页数:215 大小:5.40MB
返回 下载 相关 举报
C 语言及应用 中专 教学课件 ppt 作者 孙振业 第8-9章 第9章_第1页
第1页 / 共215页
C 语言及应用 中专 教学课件 ppt 作者 孙振业 第8-9章 第9章_第2页
第2页 / 共215页
C 语言及应用 中专 教学课件 ppt 作者 孙振业 第8-9章 第9章_第3页
第3页 / 共215页
C 语言及应用 中专 教学课件 ppt 作者 孙振业 第8-9章 第9章_第4页
第4页 / 共215页
C 语言及应用 中专 教学课件 ppt 作者 孙振业 第8-9章 第9章_第5页
第5页 / 共215页
点击查看更多>>
资源描述

《C 语言及应用 中专 教学课件 ppt 作者 孙振业 第8-9章 第9章》由会员分享,可在线阅读,更多相关《C 语言及应用 中专 教学课件 ppt 作者 孙振业 第8-9章 第9章(215页珍藏版)》请在金锄头文库上搜索。

1、第9章 C 语 言 应 用,9.1 C语言的命令行编译 9.2 C语言的指针及编译模式 9.3 文本屏幕输出和文本窗口 9.4 菜单技术 9.5 Turbo C的图形处理 9.6 C语言与BIOS和DOS的接口 9.7 C语言与汇编语言的混合编程,9.1 C语言的命令行编译,9.1.1 命令行编译程序TCC.EXE的功能 命令行编译是在DOS状态下调用Turbo C的TCC.EXE程序来完成的。TCC.EXE的功能是编译、连接C语言源程序,当C语言程序中含有汇编语言程序段时,TCC.EXE将调用宏汇编程序TASM.EXE对汇编程序段进行编译。命令行的编译参数用户可以根据需要自己选择。,9.1.

2、2 命令行编译程序TCC.EXE的一般调用形式 tcc 编译参数表 文件名1 文件名2 文件名n,其中,编译参数的选项功能见表 9-1所示,在对文件进行编译或连接时,可以根据需要设置编译参数;编译参数多于一个时, 应用空格分隔;编译参数的选项中,字母的大小写是有区别的。,表 9-1 命令行的编译参数选项(常用部分),文件名是要编译连接的源文件(.c)、目标文件(.obj)、 库文件(.lib)或汇编语言文件(.asm),TCC.EXE可以同时编译连接多个源文件。 一般情况下,TCC同时完成编译和连接工作, 除非用户指定选项。例如,只编译不连接: tcc-Ic:include-Lc: lib-e

3、 text strart.c body.obj my.c该命令行表示将源程序start.c、目标程序body.obj和源程序my.c,用中模式编译连接生成可执行文件text.exe(-e选项)。 其中,include子目录包含了全部头文件,lib子目录包含了全部标准库函数。,9.2 C语言的指针及编译模式,9.2.1 指针的分类 前面几章所讨论的指针并不存在分类的问题,指针就是指针。但是,在PC计算机的存储器中, 物理地址不是线性连续的,而是分段的。一个物理地址由段地址和偏移地址组合而成, 每个数据段含有64 K字节单元。 查找64 K字节单元, 使用16位的指针就可以完成,这种指针称为近指针

4、(near);当程序中需要跨段存取数据(即数据存储区已超过64 K字节)时, 16位指针就不够用了,此时必须使用32位指针(即段地址: 偏移量),这类指针称为远指针(far)。还有一种指针称为巨指针(huge),当偏移量超过64 K字节时,段地址将自动增量, 指向下一个数据段。,1. 近指针(near型) 近指针用于处理不超过64 K字节的数据或代码。 用近指针处理数据或代码时,数据段地址在DS寄存器中, 代码段地址在CS寄存器中。近指针值与DS寄存器组合形成32位数据地址; 与CS寄存器组合形成32位代码地址。 在微、小、中模式下所使用的数据指针默认为是近指针, 因为此时只有一个不超过64

5、K 的数据段。近指针可以用near显式定义, 如果近指针的值超过64 K字节时,指针值自动复位为0。用近指针对数据进行操作时,因为不需要进行地址计算,因而占用内存空间少、 执行速度快,但是只能存取64 K字节以内的数据。,2. 远指针(far型) 远指针是包括段地址和偏移量的32位指针, 它可以指向内存中的任一存储单元,可以选用任意编译模式。 因为远指针的段地址在指针内,每次调用远指针时都要重新为段寄存器赋值, 因此加长了程序的执行时间, 降低了程序的运行速度。 虽然远指针可以查找内存中的任一存储单元,但是一个指针变量的寻址范围也只有64 K字节, 因为远指针在进行增或减时,只有偏移量参加运算

6、,其段地址并不参加运算。因此当指针增(减)到64 K边界时,就会出现折回现象即指针中的偏移量又折回到0,而段地址值不变。,内存中的同一个物理地址可以用不同的段地址和偏移量组合而成,即对一个物理地址,其far指针并不是惟一的。 例如:a指针: 2345: 0005 b指针: 2300: 0455 c指针: 2000: 3455 以上几个far指针值所代表的物理地址都是23455(即同一个物理地址), 但是如果对其进行比较时, 其结果并不相等, 因此对远指针进行运算时, 会引起很多麻烦。,(1) 当far指针与空指针(NULL=0000: 0000)进行比较运算时,比较的是全部32位指针,而不是偏

7、移量。 当对指针进行相等(=)与不相等(!)比较时,是将远指针的32位值作为无符号长整型(unsigned long)数据进行处理的, 并没有将其转换为物理地址再比较。 因此, 上例中的a、 b、 c三个指针比较的结果均为假: a=b b=c c=a,(2) 当对非0的远指针进行比较运算时( = a 的结果均为真。,3. 巨指针(huge型) 巨指针和远指针一样也是32位的指针,与远指针的区别是: 当巨指针的偏移量超过64 K字节时, 并不折回而是自动修正段地址的值, 使其指向下一个数据段。 因此巨指针可以真正查寻内存中的任一存储单元。 在对指针进行操作时, 将32位指针转换为实地址, 这样每

8、一个存储单元的地址都是惟一的。 可以对巨指针进行=、 ! =、 =、 、 =、 等的关系运算。,例 9.1三种指针在处理数据时,遇到边界时的情况。,main() char *p; char far *fp; char huge *hp; p=(char near *)0xffff; printf(“近指针原来的值: P=%xn“, p); p+; printf(“加1后的近指针值: P=%xn“, p); fp=(char far *)0xB800ffff; printf(“接近边界的远指针: FP=%FpHn“, fp);,fp+; printf(“增量后的远指针发生了折回现象: FP=%F

9、pHn“, fp); hp=(char huge *)0xb800ffff; printf(“接近边界的巨指针: HP=%FpHn“, hp); hp+; printf(“增量后的巨指针自动增加段地址: HP=%FpHn“,hp); ,程序的运行结果如下: 近指针原来的值: P=ffff 加1后的近指针值: P=0 接近边界的远指针: FP=B800: FFFFH 增量后的远指针发生了折回现象: FP=B800: 0000H 接近边界的巨指针: HP=B800: FFFFH 增量后的巨指针自动增加段地址: HP=C800: 0000H,例 9.1程序中, 格式控制符“%Fp”表示输出的数据为一

10、个远指针值。 从例 9.1程序可以看到三种指针不同的处理方法。 由于巨指针要进行物理地址的转换,因而其运行速度比far指针慢, 比near指针更慢。,9.2.2 各类指针之间的转换 far指针可强制转换为near指针,舍掉段地址只保留偏移量即可;near指针也可以转换为far指针,只要从相应的段寄存器中取出段地址即可。,9.2.3 C语言的编译模式 Turbo C编译系统在对源程序进行编译时, 要对程序中的代码和数据进行处理,将不同的数据存放在不同的段内。 例如, 程序代码放在代码段内; 静态数据放在数据段内; 动态数据链表等放在堆栈中。 对于不同的存储模式,段的命令、 段的组合以及栈和堆的分

11、配情况也不同。,Turbo C提供了 6 种编译模式(又称编译寻址模式), 它们是: 微模式(Tiny)、 小模式(Small)、 中模式(Medium)、 紧凑模式(Compact)、 大模式(Large)和巨模式(Huge)。 用户可以根据需要在Turbo C集成环境下的option选项的model子菜单中进行选择。 所谓内存模式是指如何在内存中放置程序代码及数据, 如何分配堆栈, 确定所占内存的大小以及如何存取数据。 当指定好编译模式后, 编译程序将按事先选好的编译模式对源程序进行编译。,1. 微模式(Tiny) 微模式中, 程序的代码和数据放在同一个64 K字节段内, 所有段寄存器的值

12、相同(即CS=DS=ES=SS)。 程序中使用指针的缺省模式为近指针(near型)。 只有在程序很短且所使用的数据很少时才使用微模式进行编译。,2. 小模式(Small) 小模式中, 程序代码放在代码段的一个64 K字节段内; 数据放在另一个64 K字节的数据段内,且数据段、 附加段、 堆栈段的数据共用一个段(即DS=ES=SS)。 程序中所使用的指针都是近指针(near型)。 一般的程序使用小模式编译即可, Turbo C集成环境系统的缺省模式为小编译模式。,3. 中模式(Medium) 如果程序的代码很长、数据很少时, 可以使用中模式进行编译。 中模式中,所有的数据放在同一个64 K数据段

13、内(DS=ES=SS), 数据段内使用近指针; 程序代码可以超过64 K字节,占用不同的代码段。 代码段内的指针使用远指针(far型)。 此种编译模式适用于长代码小数据的程序。,4. 紧凑模式(Compact) 在紧凑模式中, 数据量可以超过64 K字节的长度, 占用多个数据段, 数据段内的指针用远指针(far型); 代码段只占用一个64 K字节, 所用指针是近指针(near型)。 在紧凑模式中, 静态数据不能超过64 K字节。 这种编译模式适用于小代码大数据的程序。,5. 大模式(Large) 在大编译模式下代码和数据均可以超过64 K字节达到1 M字节,数据段和代码段均使用远指针;静态数据

14、同样不能超过64 K字节。这种编译模式适用于长代码和大数据,但静态数据不太大的程序。,6. 巨模式(Huge) 巨模式和大模式一样,数据段和代码段均可以超过64 K字节, 用huge指针存取,允许静态数据超过64 K字节, 但是堆栈只有一个。 数据的来源可以是不同的源程序(即每一个源程序都可以有自己的数据段), 适合于制作工程文件。 无论采用哪种编译模式进行编译,单个C语言源程序编译生成的代码和数据量均不能超过64 K字节。 对于超过64 K字节的源程序,可以视数据或代码的多少分解成几个源文件, 分别进行编译, 然后连接生成.exe文件。,大代码量的程序应选用大代码编译模式(Medium、 L

15、arge、 Huge),大数据量的程序应选用大数据编译模式(Compact、 Large、 Huge)。 这样编译后所生成的.obj文件将会带给连接程序信息,将程序代码和数据安排在不同的段内, 生成的.exe文件在运行时将通知DOS该程序应如何装入代码段和数据段, 寄存器如何初始化。即实现不同编译模式下开辟不同大小的数据区和代码区。,9.3文本屏幕输出和文本窗口,9.3.1 文本的屏幕输出 1. 文本输出 Turbo C提供了 3 个常用的输出文本的控制台函数。 (1) 格式输出函数cprintf()。 一般形式: cprintf(“格式说明符“, 输出项表); (2) 输出字符串到控制台的函

16、数cputs()。 一般形式: cputs(*str); 其中*str为字符指针。,(3) 输出字符到控制台的函数putch()。 一般形式: putch(c); 其中c为整型数据。 以上 3 个函数的使用与printf()、 puts()及putc()函数是一样的, 只是它们仅用于控制台级。 输出文本时, 是从当前光标位置开始, 从左到右、 从上到下进行的。,表 9-2 文本输出函数的控制码,2. 对屏幕内容及光标的操作 Turbo C提供了对屏幕窗口及光标位置进行操作的函数。 (1) 清屏函数clrscr()。 将当前屏幕窗口的内容清除, 并将光标移到屏幕左上角。 (2) 清除一行内容的函数clreol()。 清除光标所在位置开始的后半行字符。,(3) 清除一整行的函数delline()。清除光标所在行的全部内容, 并将以下各行顺序上移。 以

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号