汇编网首页登录博客注册
masmaster的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
文章收藏

[2010-07-16 11:01] 栈操作指令:push/pop

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定位的。
评论次数(0)  |  浏览次数(613)  |  类型(汇编语言笔记) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码