堆栈操作指令、标志寄存器传送指令和地址传送指令

堆栈操作指令、标志寄存器传送指令和地址传送指令 1、堆栈操作指令 堆栈是一个“先进后出”的主存区域,位于堆栈段中,使用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指令都不影响标志。 堆栈操作程序实例:LI8-1.asm 在键盘上输入50个字符,然后用与输入字符的先后相反的顺序在屏幕上显示出来。 NAME LI8-1.ASM STACK SEGMENT PARA STACK 'STACK' DW 50 DUP(?) STACK_TOP LABEL WORD STACK ENDS CODE SEGMENT ASSUME CS:CODE,SS:STACK START: MOV AX,STACK MOV SS,AX MOV SO,OFFSET STACK_TOP MOV CX,50 L1: AH,01H INT 21H PUSH AX LOOP L1 MOV DL,0AH MOV AH,02H INT 21H MOV DL,0DH INT 21H MOV CX,50 L2: POP DX MOV AH,02H MOV 21H LOOP L2 MOV AH,4CH INT 21H CODE ENDS END START 其中,最初的栈顶也可以不用指令送堆栈指针SP,即将上面的程序中的STACK_TOP LABEL WORD伪指令和MOV SP ,OFFSET STACK_TOP指令去掉,程序照样正确运行。因为只要在堆栈段的SEGMENT伪指令中带有组合类型参数和组名参数:STACL 'STACK',汇编程序就会自动把栈底(也是最初的栈顶)的位移量赋给堆栈指针SP。 2、标志寄存器传送指令 标志寄存器传送指令用来传送标志寄存器的内容。 (1)标志送AH指令LAHF LAHF ;AH←FLAGS的低字节 LAHF指令将标志寄存器FLAGS的低字节送寄存器AH,即状态标志位SF/ZF/AF/PF/CF分别送AH的第7/6/4/2/0位,而AH的第5/3/1位任意。 (2)AH送标志指令SAHF SAHF ;FLAGS的低字节←AH SAHF将AH寄存器内容送FLAGS的低字节,即根据AH的第7/6/4/2/0位相应设置SF/ZF/AF/PF/CF标志。 (3)标志进栈指令PUSHF PUSHF ;SP←SP-2,SS:[SP]←FLAGS PUSHF指令将标志寄存器的内容压入堆栈,同时栈顶指针SP减2。这条指令可用来保存全部标志位。 (4)标志出栈指令POPF POPF ;FLAGS←SS:[SP],SP←SP+2 POPF指令将栈顶字单元内容送标志寄存器,同时栈顶指针SP加2 3、地址传送指令 地址传送指令将存储器的逻辑地址送至指定的寄存器 (1)有效地址传送指令LEA LEA r16,mem ;r16←mem的有效地址EA LEA指令将存储器操作数的有效地址传送至指定寄存器中。 (2)指针传送指令LDS LDS r16,mem ;r16←mem,DS←mem+2 LDS指令将主存中mem指定的字送至r16,并将mem的下一字送DS寄存器。实际上,mem指定了主存的连续4个字节作为逻辑地址,即32位的地址指针。 mov word ptr [3060h],0100h mov word ptr [3062h],1450h lds si,[3060h] ;ds=1450h,si=0100h (3)指针传送指令LES LES 6,mem ;r16←mem,ES←mem+2 LES指令和LDS指令相比,除了把mem的下一字送ES外,其他均与LDS一样。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值