汇编语言 第六章 包含多个段的程序

在操作系统中,合法地通过操作系统取得的空间都是安全的,因为操作系统不会让一个程序所用的空间和其他程序以及系统自己的空间相冲突。在操作系统允许的情况下,程序可以取得任意容量的空间。

程序取得所需的空间的方法有两种:

  • 加载程序的时候为程序分配;
  • 程序在执行的过程中向系统申请。

我们若要一个程序在被加载的时候取得所需的空间,则必须要在源程序中做出说明。我们通过在源程序中定义段来进行内存空间的获取。 ### 6.1 在代码段中使用数据

我们不能随便决定哪段空间是能够使用的,来存储我们的数据,应该让系统来为我们分配。我们可以在程序中,定义我们希望处理的数据,这些数据就会被编译、连接程序作为程序的一部分写到可执行文件中。当可执行文件中的程序被加载入内存时,这些数据也同时被加载入内存中。与此同时,我们要处理的数据也就自然而然地获得了存储空间。

这 8 个数据就在代码段的偏移 0、2、4、6、8、A、C、E 处。他们的段地址就是 CS。

在 Debug 模式下,所占内存空间的前 16 个单元存放在源程序中用“ dw” 定义的数据,后面的单元存放源程序中汇编指令所对应的机器指令。

为了在系统中直接运行程序,我们可以在源程序中指明程序的入口所在。我们在程序的第一条指令前加上了一个标号 start,而这个标号在伪指令 end 后面出现。end 除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方。

6.2 在代码段中使用栈

我们将 cs:10~cs:2F 的内存空间当作栈来使用,初始状态栈为空,设置 ss:sp 指向 cs:30。

将 ds 中的数据存入 cs 中,填 mov cs:[bx],ax

两个 dw,一共占用了 36 个内存单元(字节),16 进制为 24H,所以栈顶为 24H。

答案为 cs;24H;pop cs:[bx]

6.3 将数据、代码、栈放入不同的段

前面的程序中,既有数据、还有栈,都在一个段中。显然有两个问题:

  • 使程序显得混乱;
  • 一个段的容量不能大于 64KB(8086 中)

解决方案:定义多个段:

  1. 定义多个段的方法

    与定义代码段没有区别,只是不同的段有不同的段名。

  2. 对段地址的引用

    段的名称就相当于一个标号,代表了段地址,偏移地址就要看它在段中的位置。程序中数据 0abch 的地址就是 data,6。将它送入 bx 中可以用如下代码:

    8086CPU 不允许将一个数值直接送入段寄存器中。

  3. “代码段”、“数据段”、“栈段” 完全是我们的安排

    完全可以i将程序 6.4 写成如下样子,实现同样功能:

第六章检测题链接

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×