push和pop的重要性不言而喻,他存贮并恢复来自LIFO堆栈存储器的数据。80X86cpu有6种形式的push/pop指令:
寄存器,存储区,段寄存器,标志,标志寄存器,立即数
其中,立即数形式的push/pop以及pusha/popa不能用于80386以下的处理器。
push和pop指令存储16位存贮单元的内容到栈或者从栈返回到存贮单元。立即数可以被压入栈但是不能从栈弹出,因为cpu不知道目标地址。
任意段寄存器的内容可以压入堆栈或者弹出,但是弹出的数据绝对不能进入CS寄存器, 因为如果执行pop cs后,它改变了下一条指令的部分地址,这使得pop cs指令不可预知,所以, 算是‘非法|无效’指令。
标志寄存器可以入栈或者出栈,pushf/popf
所有的寄存器内容可以入栈或出栈,pusha/popa
16位cpu的push指令总是允许传送两字节的数据入栈。 而386以上的cpu的push传送两个或四个字节的数据入栈。这取决于寄存器的宽度或存储单元的大小。数据源可以是任意的内部16/32魏寄存器,立即数,段寄存器或者任何两字节的内存数据。
pusha复制除了段寄存器以外的内部寄存器的内容入栈。pusha(push all 压入全部)指令按照下面顺序将寄存器内容入栈:ax,cx,dx,bx,sp,bp,si,di。无论如何,在执行pusha之前总是将sp先行入栈。
pushf(push flags)指令将标志寄存器的内容入栈。
pushad/popad指令压入或弹出32位寄存器内容。
每当数据入栈时,数据的高位数据字节送到由sp-1寻址的SS段存储单元。低位数据字节送至sp-2寻址的SS段存贮单元。push完成后,sp内容减2.双字节也如此,esp内容减4.
pusha指令将全部的内部寄存器内容入栈。全部寄存器入栈后sp-16。
pop指令实现与push相反的操作。
pop从栈段中移除数据,并将其移至指定的16位寄存器,段寄存器或者16位存储单元。在80386以上的cpu中,pop从栈中移出32位数据,并使用32位地址。
popf(pop flags)从栈中弹出16位数据至标志寄存器(flags)。
popfd从栈中32位数据至扩展标志寄存器(eflags)。
popa弹出栈中16字节数据并按顺序放入:di,si,bp,sp,bx,dx,cx,ax。这是pusha把她们入栈的倒序。 popad从栈中重装32位数据。
堆栈初始化时SS段和SP两者都要加载。通常把ss段的栈底装入SS。为栈段分配存储空间。
有两种形式初始化栈段
完整定义方式
stack segment stack
dw 100h dup (0)
stack ends
和模块化方式
.model small
.stack 100h ;效果同上
如果不用任何方法初始化栈段, 程序连接的时候将出现错误。 如果栈段在128以内, 错误将被忽略,系统自动分配给程序128字节的栈段空间。这是由PSP定位的。
- [somniumchase] 我一运行就说没有数字 01/01 11:44
- [游客] 为什么啊 08/07 15:36
- [游客] 如果想快一些 就改下面这里 dx值改成1H delay: push ax 04/19 02:53
- [lshhjx] 注释在程序中很重要,楼主不知道吗? 12/08 13:40
- [biaggi] 看不明白,在下還須學習 11/06 08:11
- [游客] 我运行的时候直接显示Unkown filename跳出了- -请问怎么改 06/16 21:44
- [游客] 勿庸置疑,注释是好习惯。与人方便自己方便。 04/12 10:33
- [游客] 老实说,看着真心累呀! 04/07 18:37
- [游客] 很无语,初学者就多看书,不要动不动要别人注释,基础打好了,再自己注释,这样比别人帮你注释好得多 12/17 19:43
- [dgkepu] 初学者:不懂,希望有多点注释带着学习学习! 12/07 20:52
- [游客] windows 7是一个64Bit操作系统,它不兼容DOS,无法识别16Bit系统。重装系统wind 02/28 21:05
- [游客] windows 7是一个64Bit操作系统,它不兼容DOS,无法识别16Bit系统。重装系统wind 02/28 21:05
- [466987333] 你好,高手,我想请教一个问题。 我用的是win7操作系统,32位的,里面没有找masm目录,是不是 12/12 17:30
- [lanfioncc] 那个太高级了。。。我还有点看不懂。。不过谢谢!!! 11/27 11:23
- [yc2010] 实验16中的 table: dw sub1,sub2,sub3,sub4 可不可以改成呢? 09/11 09:08
- [yc2010] mov bl,ah mov bh,0 add bx,bx ----------->这里为 09/07 21:03
- [yc2010] 为什么要add bx,bx呢? 09/07 20:55
- [yc2010] 那是不是像table[bx],ds[bx]....等(内存单元)都是表示一个字节呢? 09/06 21:10
- [masmaster] 杨季文的《80X86汇编语言程序设计教程》 09/01 12:52
- [游客] to masmaster shl左移4位,那al传进来的4,5,6位背景色不就没了. 为什 09/01 11:00