分享

汇编(八)——数据传送类指令三

 shamo9966 2015-09-29
栈操作指令、标志寄存器传送指令和地址传送指令

 

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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多