在前一章我们提到0:200~0:2FF地址空间是相对安全的,但是这段空间的容量只有256个字节。
在操作系统中只要是通过操作系统申请的空间就都是安全的,操作系统负责给程序分配安全的空间。在操作系统允许的情况下,程序可以取得任意数量的空间。
按程序获取所需空间的时间,获取空间方法可分为两种:
- 在加载程序的时候为程序分配
- 在程序执行的过程中向系统申请
本书中不论描述第二种
对于汇编程序,如果需要他在被加载的时候取得所需的空间,就必须要在源程序中做出说明,对于汇编源程序来讲就是在汇编源程序中做出相应段的声明。
在代码段中使用数据
这样的想法是,在代码段中声明了数据。那么操作系统将其加载进入内存的时候就不可避免的需要为这些声明在代码段中的数据分配空间。虽然这样子看起来不是十分的优雅。
并且对于这个来说,还需要自己来计算数据的存储位置。
同时如果汇编程序的开头不是指令的话,那么就需要end声明来说明汇编程序的开始。给操作系统一个提示,告诉操作系统,程序的入口,在某某标号处。
在单任务操作系统中,可执行文件中的程序执行过程如下:
- 由其他程序将可执行文件中的程序加载入内存
- 设置CS:IP,即设置程序的入口(第一条要执行的指令)
- 运行结束,返回
伪指令end就是描述一个程序的入口,比如end start
那么在编译连接以后,end指令指定的程序入口为start(一个标号地址),被转换称为一个入口地址,存储在可执行文件的描述信息中。操作系统就根据次信息,设置CS:IP。
将数据、代码、栈放入不同的段
为什么要这么做。事实上,不管怎么做,实际在内存中并没有很大的区别,那么为什么需要这个各个不同的段呢。
这实际上是为了适应我们人类的思维,让源代码看起来更加的优雅易读。
我们在汇编源程序中声明了不同的段,分别用来存储数据和代码。事实上这个全部都放在一个段里面之后被加载进内存并没有多大的区别。
我们不需要计算数据程序的地址,而直接可以时候段名来代替。
在说一遍,段寄存器是不能够直接使用直接量的,段名也不行,所以必须使用通用寄存器来做中转。
编写、调试具有多个段的程序
cx中的程序长度为整个汇编源文件翻译称为机器指令的长度,包括数据段
一个段至少会占用16个字节,
数据段是定义在程序段之前还是之后都无所谓