3.6 栈
栈的这种操作规则被称为:LIFO(Last In First Out,后进先出)。
3.7 CPU提供的栈机制
8086CPU提供入栈和出栈指令,最基本的两个是 PUSH(入栈)和 POP(出栈)。
任意时刻,SS:SP 指向栈顶元素。
PUSH AX (SP=SP-2)
POP AX (SP=SP=2)
3.8 栈顶超界的问题
在执行push、pop指令时,要注意当栈满的时候再使用push指令入栈,或栈空时再使用pop指令出栈,都将发生栈顶超界问题。
3.9 push、pop指令
push 寄存器 将一个寄存器中的数据入栈
pop 寄存器 出栈,用一个寄存器接收出栈的数据
push 段寄存器 将一个段寄存器中的数据入栈
pop 段寄存器 出栈,用一个段寄存器接收出栈的数据
push 内存单元 将一个内存字单元处的字入栈(注意:栈操作都是以字为单位)
pop 内存单元 出栈,用一个内存字单元接收出栈的数据
指令执行时,CPU要知道内存单元的地址,可以在push、pop指令中给出内存单元的偏移地址,段地址在指令执行时,CPU从ds中取得。
在SS、SP中存放栈顶的段地址和偏移地址;
提供入栈和出栈指令,它们根据SS:SP指示的地址,按照栈的方式访问内存单元。
push 指令的执行步骤:1,SP=SP-2;2,向SS:SP指向的字单元中送入数据。
pop 指令的执行步骤:1,从SS:SP指向的字单元中读取数据;2,SP=SP+2。
在任意时刻,SS:SP指向栈顶元素。
8086CPU只记录栈顶,栈空间的大小我们要自己管理。
用栈来暂存以后需要恢复的寄存器的内容时,寄存器出栈的顺序要和入栈顺序相反。
push、pop实质上是一种内存传送指令,注意它们的灵活应用。
段的综述
数据段 DS
代码段 CS
栈段 SS
不管我们如何安排,CPU将内存中的某段内容当作代码,是因为CS:IP指向了那里;CPU将某段内存当作栈,是因为SS:SP指向了那里。
一段内存,可以既是代码的存储空间,又是数据的存储空间,还可以是栈空间,也可以什么也不是。关键在于CPU中的寄存器的设置,即CS、IP,SS、SP,DS的指向。
- [aben126] 4 发现屏幕上会出现彩色图标。 07/17 13:53
- [aben126] 3 ,由于我用的是WIN 7 系统,所以用DEBUG做实验是装了VMware 在VMware上没找到 07/17 13:47
- [aben126] 2 求2的8次方 mov ax,1 add ax,ax jmp 2000:0003 共运 07/17 13:31
- [aben126] 谢谢,说实在的,我不做笔记不行,我学这个东西都快两个星期了,看过之后前面的就忘了差不多,没办法只好从 07/11 09:49
- [jkuncle] 要向你学习了,我都只做了点课后作业,从来没有做过学习笔记,难怪学到后面感觉越来越难 07/10 16:16
- [aben126] 再次感谢 capitelation 的讲解 注册日期:2013-06-25 18:18 06/28 08:29
- [aben126] 再次感谢 capitelation 的解答 坛里 有前辈帖子写的很详细的。最简单的例子就是比如只 06/27 18:36