关于8086汇编栈空栈满的问题
来源:互联网 发布:手机网络时钟不同步 编辑:程序博客网 时间:2024/05/24 01:36
刚开始学习汇编,学习了8086 CPU提供的栈机制后,就在这里写一点自己的心得吧,也许这不足以登上大雅之堂,就算是对自己学习的知识做一个总结吧。
栈是一种用特殊方式访问的存储空间,特殊之处在于它是符合后进先出的规则(Last in First out),,8086 CPU提供了入栈和出栈的指令,有push(入栈)和pop(出栈),正如我们知道的,我们用ss:sp来指向栈顶元素,所以当我们用push把数据压入堆栈时,先把sp-2,指向栈顶前面的元素,再把寄存器中的数据放进ss:sp指向的地址处,所以ss:sp重新指向栈顶元素。我们用pop把栈顶元素提取出来,先将ss:sp指向的栈顶元素送入指定的寄存器中,再把sp+2,重新指向下面的元素,并以下面的元素为新的栈顶。
我们已经了解了栈的工作原理,那么我们就研究一下关于栈空和栈满的问题。
定义一段地址为一个栈,这段地址是10000~1FFFF,当栈满时,问题很简单,ss=1000,sp=0,使ss:sp指向栈顶元素,但是当栈空时,没有一个元素,sp等于多少呢?
由此我们先来研究一个简单的问题,假设有一个只能放一个数据的栈,从10000到10001,只能放一个数据,当栈空时,要指向栈顶元素,为了符合前面提到的push的规则,就是送入数据时要把sp+2,所以就只好指向10001下面那个地址了,也就是1000:0002,这样也就符合了push的规则。
所以我们就可以来研究上面那个问题了,栈空时,sp应该指向1FFFE下面那个数据的地址这时偏移地址sp=FFFE+2=10000,因为一个寄存器只能存储4位的16进制数,所以发生了溢出,sp=0000,所以这时栈顶元素的地址是1000:0,从栈空时的sp=0,一直压栈直到栈满时sp=0;如果再次压栈,栈顶将形成循环,覆盖了原来栈中的内容,所以8086 CPU的栈机制是循环的,而且栈的最大空间是64KB。
可以在DOS下进行实验,进入DOS输入debug,用a命令写下如下代码
mov ax,1000
mov ss,ax
mov sp,0000 (定义了一个从10000到1FFFE的栈)
mov ax,0001
push ax
mov ax,0002
push ax
然后可以用r查看一下各个寄存器的情况,然后再用t命令一步一步进行验证,这样更有助于理解。
这就是我对栈空栈满的一点分析。
- 关于8086汇编栈空栈满的问题
- 关于内联汇编的问题
- 汇编 中关于补码的问题
- 汇编中关于EQU指令的问题
- 关于汇编的一个小问题!
- 关于x64汇编调用api的问题
- 汇编:关于cmos ram的问题
- 关于汇编栈问题
- linux的嵌入汇编的一个问题(关于earlyclobber)
- Delphi中使用汇编(关于POS函数的问题)
- GCC扩展内联汇编关于寄存器的一点问题
- 关于后期lldb反汇编显示问题的解决办法
- 关于汇编的使用
- 8086汇编6:数据处理的基本问题
- 汇编的有趣问题
- 汇编bne的问题
- 汇编菜鸟寻求帮助-----关于汇编中mov的最基本问题----问题很基础,望各位大神给予帮助!!
- 关于汇编的一些指令
- 开源VOIP软件大汇集
- 学会安静
- 哲理小故事
- 开发 SERVER 注意
- ListView 的用法.C/C++
- 关于8086汇编栈空栈满的问题
- 在Linux的控制台中使用GDB调试程序
- [英语阅读]Relish solitude
- sql中用什么替代in
- 强类型和弱类型
- gridview 中dropdownlist 默认值设定
- 名字改编(name mangling)、调用约定与对策
- C++中Name-mangling
- 一个 mysql 行 转 列 的存储过程