push/pop堆栈指令

堆栈是存储器中专用的缓冲区,用于暂存寄存器数据或地址指针,push/pop就用于堆栈的操作,这两个指令一般用在:
1、子程序调用,为了保护现场,把所要用的寄存器中的内容先暂时保存起来,在子程序调用结束之前,按照先进后出的原则,把数据恢复。
2、有时候,需要临时用一下某些寄存器,也可用一下,凭个人喜好;
这两个指令必须成对使用(特殊用途除外),你只要压入了那些东西,并且知道他们的顺序就行了,所操作的是字符还是数据,就不用知道了。
堆栈操作指令
堆栈是一个先进后出的主存区域,位于堆栈段中,使用SS段寄存器记录器段地址。栈只有一个出口,即当前栈顶。栈顶是地址较小的一端(低端),它用堆栈指针寄存器SP指定。堆栈的两种基本操作,对应两条基本指令:

(1)、进栈指令push

push reg/mem/seg;sp<-sp-2,ss<-reg/mem/seg

进栈指令先使堆栈指令sp减2,然后把一个字操作数存入堆栈顶部。堆栈操作的对象只能是字操作数,进栈时底字节存放于低地址,高字节存放于高地址,sp相应向低地址移动两个字节单元。

push AX
PUSH [2000H]
PUSH CS
(2)、出栈指令pop
pop reg/seg/mem;reg/seg/mem<-ss:[sp],sp<-sp+2
出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针sp加2。目的操作数应为字操作数,字从栈顶弹出时,低地址字节送低字节,高地址字节送高字节。
pop AX
POP [2000H]
POP SS堆栈可以用来临时存放数据,以便随时恢复它们。也常用于子程序见传递参数。
注意几点:
(1)、因为堆栈指针sp总是指向已经存入数据的栈顶(不是空单元),所以PUSH指令是将(SP)减2,后将内容压栈(即先修改SP是指指向空单元,后压入数据),而POP是先从栈顶弹出一个字,后将堆栈指针SP加2.
(2)、PUSH CS是合法的,但是POP CS是不合法的。
(3)、因为SP总是指向栈顶,而用PUSH和POP指令存取数时都是在栈顶进行的,所以堆栈是先进后出或叫后进先出的。栈底在高地址,堆栈是从高地址向低地址延伸的,所有栈底就是最初的栈顶。
(4)、用PUSH指令和POP指令时只能按字访问堆栈,不能按字节访问堆栈。
(5)、PUSH和POP指令都不影响标志。

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PUSH/PUSHA/PUSHAD指令用于将数据或寄存器的值压入堆栈PUSH指令将一个值压入堆栈PUSHA指令将AX、CX、DX、BX、SP、BP、SI、DI的值按从高到低的顺序压入堆栈,而PUSHAD指令将EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI的值按从高到低的顺序压入堆栈POP/POPA/POPAD指令用于从堆栈中弹出数据或寄存器的值。POP指令将一个值从堆栈弹出,POPA指令堆栈中的值按从低到高的顺序弹出,分别存入AX、CX、DX、BX、SP、BP、SI、DI中,而POPAD指令堆栈中的值按从低到高的顺序弹出,分别存入EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI中。 XCHG指令用于交换两个操作数的值。XLAT指令用于通过使用BX和AL寻址的方式,将AL中值与内存中的字节进行替换。BSWAP指令用于对寄存器中的32位数据进行字节顺序交换操作。 LEA指令用于将一个有效地址传送给目的操作数。LDS、LES、LFS、LGS、LSS指令用于将段描述符选择子传送给目的操作数的段寄存器。 总结来说,堆栈操作指令用于在堆栈中压入和弹出数据或寄存器的值,交换指令用于交换两个操作数的值,地址或段描述符选择子传送指令用于传送有效地址或段寄存器的值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [微机原理==常用汇编指令(9)](https://blog.csdn.net/weixin_29081101/article/details/118284476)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值