C语言中的几个重要概念
六、C语言使用内存和寄存器的方法
1.段和段寄存器
CS用来存放代码段的段地址;DS用来存放全局变量和静态变量所在段(数据段)的段地址;SS用来存放局部变量,参数所在段(堆栈)的段地址。 此外,还有堆段,是动态分配的内存。
2.微模式编译时段的使用情况
只有一个段,从底往高依此装入代码,静态变量和全局变量,堆。从高往低装入堆栈。
3.小模式编译时段的使用情况
数据、堆栈和近堆共用一个段,代码用一个段,还有一个远堆(用far指针存取)。
4.中模式编译时段的使用情况
中模式有多个代码段,其余与小模式一样。函数指针用far指针。
5.紧凑模式编译时段的使用情况
代码,静态数据,堆栈,堆(只有远堆)各有自己的段。静态数据的总量不得超过64K。
6.大模式编译时段的使用情况
静态数据,堆,堆栈的分配与紧凑模式一样;代码段的分配与中模式一样。数据指针和函数指针都是远指针。静态数据的总量不得超过64K。
7.巨模式编译时段的使用情况
来自不同源文件的代码放在不同的段内,来自不同源文件的静态数据也放在不同的段内,只有堆栈是合在一起的。
8.运行库函数分配的内存:
常规内存区
远堆(数据段之外) 用_fmalloc()分配,得到32位指针
├─────────┤
64│堆(未使用的内存)│用malloc()分配,得到16位的位移地址
KB├─────────┤
数│ 栈(局部变量) │
据├─────────┤
段│ 全局和静态变量 │
├─────────┤
七、用C语言写中断服务程序(如果中断服务程序不牵涉到中断链以及 DOS和其本身的重入问题。) ---Turbo C
1.函数类型为interrupt 的中断服务程序定义如下:
#include
void interrupt 函数名(bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flags);
unsigned int bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flags;
2.得先保留原中断函数地址
void interrupt (*保留函数名)( );
保留函数名=getvect(0x中断号);
3.在main函数中用自定义的中断服务程序替换原来的程序
setvect(0x中断号,函数名);
4.在main函数中激活自定义的中断服务程序
(1)先设置要用到的寄存器的值(用伪变量),
(2)geninterrupt(0x中断号);
若替换的是计时中断程序,因PC机内的计时器每秒产生18.2次中断,则每秒自动执行18.2次新的中断程序。
5.事后得将原中断函数地址装回向量表中
setvect(0x中断号,保留函数名);
【C语言中的几个重要概念】相关文章:
C语言中指针的概念09-27
C语言中各种类型的指针的概念总结09-26
PHP语言中Session的概念11-12
C语言中的运算规则03-17
C语言中的字符(char)03-11
C语言中的链接编写10-07
C语言中的assert用法10-07
c语言中default的用法10-05
c语言中free的用法10-04
C语言中的指针解读10-04