• 包含多个段的程序


    对于使用多个段的问题,我们先简单说到这里,下面我们将以这样的顺序来深入地讨论多个段的问题:

    (1)在一个段中存放数据、代码、栈,我们先来体会一下不使用多个段时的情况;

    (2)将数据、代码、栈放入不同的段中。

      解释一下,程序第一行中的 “dw”的含义是定义字型数据。dw即define word。

      在这里,我们使用dw定义了8个字型数据(数据之间以逗号分隔),它们所占的内存空间的大小为16个字节。

      探讨end的作用:
    end 除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方

    比如对于:
    dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
    我们可以说,定义了8个字型数据。

    也可以说,开辟了8个字的内存空间,这段空间中每个字单元中的数据依次是:
    0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H。
    因为它们最终的效果是一样的。

    6.3 将数据、代码、栈放入不同的段
    但如果数据、栈和代码需要的空间超过64KB,就不能放在一个段中(一个段的容量不能大于64 KB,是我们在学习中所用的8086模式的限制,并不是所有的处理器都这样)。

    所以,我们应该考虑用多个段来存放数据、代码和栈。

    怎样做呢?
    我们用和定义代码段一样的方法来定义多个段(dw xxx),然后在这些段里面定义需要的数据,或通过定义数据(dw 0,0,0,0,0,0,0,0)来取得栈空间。

    一、我们在源程序中为这三个段起了具有含义的名称,用来存放数据的段我们将其命名为“data”,用来放代码的段我们将其命名为“code”,用来作栈空间的命名为“stack”。

    但CPU看的懂这些名称吗?

    二、我们在源程序中用伪指令
    “assume cs:code,ds:data,ss:stack”将cs、ds和ss分别和code、data、stack段相连。

    这样做了之后,CPU是否就会将 cs指向 code,ds 指向 data,ss 指向stack,从而按照我们的意图来处理这些段呢?

    三、若要CPU按照我们的安排行事,就要用机器指令控制它,源程序中的汇编指令是CPU要执行的内容。

    那么,CPU如何知道去执行它们?

    我们在源程序的最后用“end start”说明了程序的入口,这个入口将被写入可执行文件的描述信息,可执行文件中的程序被加载入内存后,CPU的CS:IP被设置指向这个入口,从而开始执行程序中的第一条指令。

    标号“start”在“code”段中,这样CPU就将code段中的内容当作指令来执行了。

    我们在code段中,使用指令: mov ax,stack
    mov ss,ax
    mov sp,16
    设置ss指向stack,设置ss:sp指向stack:16, CPU 执行这些指令后,将把stack段当做栈空间来用。

    CPU若要访问data段中的数据,则可用 ds 指向 data 段,用其他的寄存器(如:bx)来存放 data段中数据的偏移地址。
    总之,CPU到底如何处理我们定义的段中的内容,是当作指令执行,当作数据访问,还是当作栈空间,完全是靠程序中具体的汇编指令,和汇编指令对CS:IP、SS:SP、DS等寄存器的设置来决定的。

  • 相关阅读:
    POJ-2096-Collecting Bugs(概率DP)
    2019ICPC南京网络赛总结
    LOJ-6285-数列分块入门9
    LOJ-6284-数列分块入门8
    LOJ-6283-数列分块7
    bzoj2049: [Sdoi2008]Cave 洞穴勘测
    bzoj1010: [HNOI2008]玩具装箱toy
    bzoj1597: [Usaco2008 Mar]土地购买
    bzoj1233: [Usaco2009Open]干草堆tower 单调队列优化dp
    bzoj2442&&codevs4654 单调队列优化dp
  • 原文地址:https://www.cnblogs.com/poli/p/4644050.html
Copyright © 2020-2023  润新知