汇编的压栈(PSHM)和出栈(POPM)
2016-12-10 21:57
169 查看
汇编里把一段内存空间定义为一个栈,栈总是先进后出,栈的最大空间为64K
比如把内存中的 10000H 到 1000FH 这段内存空间定义为一个栈,那么就需要执行如下汇编
mov ax,1000H
mov ss,ax
mov sp,0010H
这样设置了SS为1000H ,SP为0010,栈的指针执行1000:0010 也就是 10010H,这个地址是段地址的最大地址加1的位置,此时栈为空,
1: 执行压栈操作
mov ax,ff11h
push ax
执行push ax时先把sp=sp-2 ,也就是sp变为000E,再把ax放入到1000eH,1000FH位置(高高低低原则,1000EH放11H,1000FH放的是FFH)
此时压栈完成,继续push与此类似,push总是先压入高地址,再压低地址,而且必须是以字为单位,也就是必须2个字节 2个字节压入。
2: 然后执行pop bx出栈执行
出栈操作与压栈相反 ,先把 SS:SP处的字数据送入到bx中去,再将SP=SP+2
注意:pop后对应SS:SP的内存中还是之前的数据,但这个内存不在栈中了,下次的push会把该内存中的数据给覆盖掉。
比如把内存中的 10000H 到 1000FH 这段内存空间定义为一个栈,那么就需要执行如下汇编
mov ax,1000H
mov ss,ax
mov sp,0010H
这样设置了SS为1000H ,SP为0010,栈的指针执行1000:0010 也就是 10010H,这个地址是段地址的最大地址加1的位置,此时栈为空,
1: 执行压栈操作
mov ax,ff11h
push ax
执行push ax时先把sp=sp-2 ,也就是sp变为000E,再把ax放入到1000eH,1000FH位置(高高低低原则,1000EH放11H,1000FH放的是FFH)
此时压栈完成,继续push与此类似,push总是先压入高地址,再压低地址,而且必须是以字为单位,也就是必须2个字节 2个字节压入。
2: 然后执行pop bx出栈执行
出栈操作与压栈相反 ,先把 SS:SP处的字数据送入到bx中去,再将SP=SP+2
注意:pop后对应SS:SP的内存中还是之前的数据,但这个内存不在栈中了,下次的push会把该内存中的数据给覆盖掉。
相关文章推荐
- 学 Win32 汇编[17]: 关于压栈(PUSH)与出栈(POP) 之一
- 学 Win32 汇编[18]: 关于压栈(PUSH)与出栈(POP) 之二
- 函数在实现过程内存中的压栈和出栈
- arm汇编进入C函数分析,C函数压栈,出栈,传参,返回值
- 函数调用的原理4点:函数产生名不同,压栈顺序不同,不应由客户清理,客户清理则可执行文件大小更大(许多参考文章,有汇编解释)
- 递归方法的压栈和出栈(个人理解)
- 04栈的压栈、出栈、遍历
- 实验C—1 顺序栈基本操作压栈与出栈
- 顺序栈的压栈和出栈
- 堆栈用链表实现压栈和出栈
- 链栈的压栈和出栈
- OpenGL中矩阵堆栈为什么要进行多次的压栈和出栈操作?
- 函数在实现过程内存中的压栈和出栈
- 带有取最小元素的栈,要求压栈、出栈、取最小元素时间复杂度O(1)
- 链栈的基本操作(初始化,压栈,出栈)
- 关于arm汇编入栈和出栈的总结
- 数据结构学习笔记(5)——栈的创建,遍历,压栈,出栈,清空
- 数据结构必须掌握 栈---压栈和出栈
- 线性存储----链式栈的创建、压栈、出栈、清空、空栈判断
- arm汇编进入C函数分析,C函数压栈,出栈,传参,返回值