代码段,数据段,栈
段
- 误区:很多人容易将“段地址”理解为内存被分为一个一个的段,每一个段都有一个段地址
- 正解:内存并没有分段,段的划分来自于CPU,因为8086CPU用“基础地址(段地址*16)+偏移地址=物理地址”的方式给出内存单元的物理地址,所以我们可以用分段的方式来管理内存。比如地址10000H~100FFH的内存单元组成一个段,改段的初始地址为10000H(基础地址),则段地址为1000H,大小为100H。我们也可以将这一内存单元分成两个段,它们的初始地址分别为10000H和10080H,段地址为1000H和1008H,大小都为80H
- 而用来存储每个段的段地址的寄存器,就称之为段寄存器,段寄存器有CS,DS,SS,ES
栈
- 栈在汇编语言中,我们仅限于这个角度去理解使用:栈是一种具有特殊的访问方式的存储空间,也就是说,栈,就是内存中的一段空间,那么栈特殊在什么地方,即先进入这个空间(栈)的数据,最后出去,最后进入这个空间的数据,最先出去,比方说,有一个盒子,用来装书本,那么最先放进去的书本就位于这个盒子的最低端,最后放进去的盒子就位于最上方,我们在取书的时候,自然就是先拿出最上方的书籍,才能够拿到最下方的书籍。而栈,就相当于用来存放书籍的盒子,书籍,就是栈中的数据。
- 操作栈:
CPU提供的操作栈的指令有push(入栈指令)和pop(出栈指令)
代码段,栈段,数据段
根据段的含义,代码段,数据段,栈段的理解很简单,即:
- 用一个段来存放数据,则称之为数据段
- 用一个段来存放代码,则称之为代码段
- 用一个段当做栈,则称之为栈段
让我们总结一下
名称 | 通俗理解 |
---|---|
段 | 内存上的一段连续的内存单元,段地址用段寄存器存放 |
栈 | 一种具有特殊的访问方式的存储空间 |
数据段 | 用来存放数据的段,就是用一段连续的内存单元存放数据 |
代码段 | 用来存放代码的段,不多说了,同上 |
栈段 | 同上理解 |
这里强调一下,段,栈,数据段,代码段,栈段使我们根据需要定义的一段连续的内存单元,注意,是连续的内存单元,抽象一点,就是1~5可以视作一个段,但是1,2,3,5不能视作一个段,因为中间断开了4,这一段数字不连续