指令系统及汇编语言程序设计_第1页
指令系统及汇编语言程序设计_第2页
指令系统及汇编语言程序设计_第3页
指令系统及汇编语言程序设计_第4页
指令系统及汇编语言程序设计_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第2章 指令系统及汇编语言程序设计2.3 80868088指令系统80868088的指令大致可分成以下六种:数据传送、算术运算、位操作、串操作、程序控制和处理器控制指令。 2.3.1 数据传送指令数据传送指令是将数据、地址或立即数传送到寄存器或存储单元中。这类指令不影响状态标志位,只有FLAGS的指令(SAHF和POPF)例外。1.通用数据传送指令 (1)数据传送指令指令格式: MOV DST,SRC功 能: DST SRC操作说明: MOV指令将源操作数SRC的内容传送到目的操作数DST。指令执行后目的操作数DST与源操作数SRC的内容相等,即DST=SRC,源操作数本身不变。操作数的类型和

2、传送方向如图2.1 所示。从上图可以看出,在MOV指令中:1) 源操作数可以为:存储器、通用寄存器、段寄存器和立即数。2) 目的操作数可以为:存储器、通用寄存器和段寄存器(CS除外)。3) 目的操作数和源操作数不能同时为存储器、段寄存器;立即数不能送段寄存器,其余可以任意搭配。4) 立即送存储器时难以确定长度,需要在存储器操作数的前面加类型说明BYTE PTR或WORD PTR,例如: MOV BYTE PTRSI+10H,30 ;8位立即数30送偏移地址为SI+10H的字节单元。 MOV WORD PTRBX+DI, 2 ;16位立即数2送偏移地址为BX+DI的字单元。【例2.7】 数据传送

3、指令举例。立即数送寄存器MOV AL,10HMOV BX,2100H寄存器之间传送MOV DX,CXMOV AH,DLMOV DS,AXMOV DX,ES通用寄存器与存储器之间传送 MOV AX,1000H MOV BP,DX段寄存器与存储器之间传送 MOV BXDI,ES MOV DS,10BP+DI 【例2.8】 指出下列数据传送指令中的错误。 MOV 10H,AX ;立即数不能作为目的操作数 MOV DS,2000H ;立即数不能送段寄存器 MOV CS,AX ;CS不能作为目的操作数 MOV DS,ES ;目的操作数和源操作数不能同时为段寄存器 MOV DI,SI ;目的操作数和源操作

4、数不能同时为存储器 MOV AL,BX ;类型不匹配,AL为8位、BX为16位寄存器 MOV DL,300 ;类型不匹配,DL为8位寄存器,300超过1B (2)堆栈操作指令 堆栈是内存中的一个特定的区域,其操作原则是“后进先出(Last In,First Out)”。由段寄存器SS确定堆栈段的起始地址,由堆栈初始化时寄存器SP的值设定堆栈底的地址。堆栈的形态如图2.2所示。堆栈操作有入栈和出栈两种。1)入栈指令 指令格式: PUSH SRC 功 能: SPSP-2,SP+1SPSRC 操作说明: PUSH指令先将SP的内容减2,然后再将操作数SRC的内容送入由SP指出的栈顶即偏移地址为SP和

5、SP+1的两个连续字节中。指令中的操作数SRC可以是存储器、通用寄存器和段寄存器,但不能是立即数。 【例2.9】 PUSH AX ;通用寄存器内容入栈 PUSH CS ;段寄存器内容入栈 PUSH SI ;字存储单元内容入栈2)出栈指令 指令格式: POP DST 功 能: DST SP+1SP,SP SP+2 操作说明: POP指令先将堆栈指针SP所指示的栈顶存储单元的值弹出到操作数DST中,然后再将SP的内容加2。指令中的操作数DST可以是存储器、通用寄存器或段寄存器(但不能是CS),同样,不能是立即数。【例2.10】 POP AX ;栈顶内容弹出至通用寄存器 POP ES ;栈顶内容弹出

6、段寄存器 POP MEMDI ;栈顶内容弹出至字存储单元入栈和出栈操作如图2.3所示。使用堆栈时还应注意:1)堆栈操作指令中的操作数必须是16位的字操作数。2)由SP指示现行堆栈顶的位置。堆栈顶是浮动的。3)编程中PUSH、POP指令应成对使用,以保持栈的平衡。 (3)数据交换指令 指令格式: XCHG OPR1,OPR2 功 能: OPR1 OPR2 操作说明: XCHG指令将两个操作数内容进行交换。交换的内容可以是一个字节(8位),也可以是一个字(16位),两个操作数的长度必须一致。参加交换的两个操作数各自均可以是寄存器或存储器,但不能二者同时为存储器。即可以在寄存器与寄存器之间,或寄存器

7、与存储器之间进行交换。段寄存器不能参加交换。 【例2.11】 XCHG AL,CL ;8位寄存器间内容交换 XCHG AX,DX ;16位寄存器间内容交换 XCHG BX,DATASI ;寄存器与存储单元间内容交换 (4)字节转换指令 指令格式: XLAT SRC-table 功 能: AL BX+AL 操作说明: XLAT指令完成一字节的查表转换。具体操作为:将BX和AL的内容相加后作为偏移地址,取出该存储单元的内容送AL。使用这条指令之前应预先把表头地址存入BX寄存器,AL中存放表元素的序号。表中元素的序号依次是0,1,2,3,表的最大长度为256个字节。利用XLAT指令实现不同数制或编码

8、系统之间的转换,十分方便。 【例2.12】 内存数据段中存放有一张16进制数(0-9,A-F)的ASCII码表,其首地址为HTABLE,为了将运算结果转换成ASC码输出,可用下列程序实现一位十六进制数(4位二进制数)向ASCII码的转换: MOV BX,OFFSET HTABLE ;BX 表首址 MOV AL,N ; AL 欲转换的数N(00000000B00001111B) XLAT HTABLE ;查表转换,转换结果的ASCII码在AL中 HLT 上面XLAT指令中,操作数HTABLE可以省略不写。 设N=00001011B,上面程序执行后,AL=01000010B(字母B的ASCII代码

9、)。2.输入输出指令 输入输出指令完成外设与CPU之间的数据传送。输入指令IN用于从外设端口接收数据,输出指令OUT则向端口发送数据。输入输出指令对IO端口的寻址方式可以分为两大类: ·直接寻址 端口地址直接在指令中给出,可寻址256个端口(0255); ·DX寄存器间接寻址 将DX的内容作为端口地址,可寻址64K个端口(065535)。 输入输出指令可进行8位数据传送,所传送数据在AL中,也可进行16位数据传送,所传送数据在AX中,不能使用其他的寄存器。 (1)输入指令 指令格式: IN ACC,PORT 功 能: ALAXPORT 操作说明: 从指定端口PORT将8位或

10、16位数据送入AL或AX中,端口PORT的寻址可用上述的直接寻址或DX间接寻址两种方式。 【例2.13】IN AL,10H ;将10H端口的内容送AL,1OH是8位端口 IN AX,20H ;将20H端口的内容送AX,20H是16位端口 IN AL,DX ;以DX的内容作为8位端口地址,端口内容送AL IN AX,DX ;以DX的内容作为16位端口地址,端口内容送AX (2)输出指令 指令格式: OUT PORT,ACC 功 能: PORTALAX 操作说明: 将累加器AL(8位)或AX(16位)的内容输出到指令指定的I/O端口中,端口PORT的寻址可用上述的直接寻址或DX间接寻址两种方式。

11、【例2.14】 OUT 40H,AL ;将AL内容送到地址为40H的8位端口中 OUT 20H,AX ;将AX内容送到地址为40H的16位端口中 OUT DX,AL ;将AL内容送到地址由DX所指定的8位端口中 OUT DX,AX ;将AX内容送到地址由DX所指定的16位端口中注意:使用DX寄存器间接寻址时,在执行输入输出指令前要将端口地址送入DX。3.地址传送指令 80868088CPU提供了三条把地址写入寄存器的指令: (1)有效地址送寄存器指令指令格式: LEA REG,SRC功 能: REGSRC的有效地址 操作说明: 将源操作数SRC(必须是一个存储器类型操作数)的有效地址即16位偏

12、移地址装入到16位目标寄存器REG中。 【例2.15】设DS=3000H,BX=2000H,SI=1000H,34000H=56H,34001H=12H,执行指令LEA AX,BX+SI+1000H执行的结果是:AX=BX+SI+1000H=4000H。而MOV AX,BX+SI+1000H指令是将偏移地址为BX+SI+1000H的内存单元的内容送到AX中,结果是AX=1256H。 LEA指令的功能也可用MOV指令来实现,下面两条指令是等效的: LEA BX,BUFFER MOV BX,OFFSET BUFFER指令中的OFFSET称为取偏移地址操作符。上述两条指令均可完成将变量(或标号)BU

13、FFER的偏移地址送BX寄存器的功能。 (2)地址指针装入DS指令指令格式: LDS REG,SRC功 能: REGSRC单元中的有效地址;DSSRC单元中的段地址 操作说明: 传送一个32位的远地址指针,其中包括一个偏移地址和一个段基址。该地址指针存放在由源操作数SRC指定的四个连续存储单元中。LDS指令将其中前两个单元的内容传送到指定寄存器,后两个单元内容传送到数据段寄存器DS。 【例2.16】 LDS SI,0100H 设原来DS=3000H,而有关存储单元的内容为30100H=60H,30101H=05H,30102H=18H,30103H=20H,上述指令执行后,SI=0560H,D

14、S=2018H。 (3)地址指针装入ES指令指令格式: LES REG,SRC功 能: REGSRC单元中的有效地址;ESSRC单元中的段地址 操作说明: 与LDS类似,传送一个32位的远地址指针,其中偏移地址送指定寄存器,但是段基址送附加段寄存器ES。4.标志寄存器传送指令标志传送指令共有四条。 (1)标志传送指令 指令格式及功能:LAHF ;AHFLAGS的低8位 SAHF ;FLAGS的低8位AH操作说明:LAHF和SAHF指令隐含的操作数为AH寄存器和标志寄存器FLAGS的低字节。涉及标志寄存器FLAGS中的5个状态标志位为SF、ZF、AF、PF以及CF,如下图所示。158765432

15、10 SFZF AF PF CF(2)标志入、出栈指令指令格式及功能: PUSHF ;SP SP-2,SP+1SP FLAGS POPF ;FLAGSSP+ISP,SPSP+2操作说明:PUSHF和POPF指令使标志寄存器与堆栈之间进行数据交换。常用于在调用子程序之前把标志寄存器压入堆栈,保护调用以前标志寄存器的值,从子程序返回以后再弹出,恢复这些标志状态。这两条指令也可以用来修改标志寄存器中标志位的值。2.3.2 算术运算指令算术运算指令包括加、减、乘、除指令。算术运算指令除符号扩展指令(CBW,CWD)外,其余指令都影响标志位。1. 加法指令(1)加

16、法指令指令格式: ADD DST,SRC功 能: DSTDST+SRC操作说明: ADD指令将目的操作数与源操作数相加,并将结果存回目的操作数。加法算术指令影响标志寄存器6个状态标志:SF、ZF、AF、PF、CF和OF。【例2.17 】 已知AL=49H,DL=6AH,执行ADD AL,DL后,AL=0B3H。 各标志位为:SF=1,ZF=0,AF=1,PF=0,CF=0,OF=1上例中,如果AL、DL中的内容是无符号数,由于CF=0,所得结果正确。如果AL、DL中的内容是补码表示的带符号数,由于OF=1,所得结果B3H是错误的(两个正数49H和6AH相加,结果是补码B3H表示的一个负数)。指

17、令中目的操作数类型 可以是寄存器或存储器,源操作数可以是寄存器、存储器或立即数。但是源操作数和目的操作数不能同时为存储器。另外,不能对段寄存器进行加法运算(段寄存器也不能参加减法、乘法和除法运算)。其加减法运算的操作数类型要求如下图2.4所示。【例2.18】ADD AL,20 ;累加器内容与立即数相加 ADD DX,SI ;寄存器内容相加 ADD AX,BX ;寄存器与存储器内容相加 ADD DATADI,AL ;存储器内容与寄存器相加 ADD BYTEPTRBPSI,50H ;存储器内容与立即数相加(2)带进位加法指令指令格式: ADC DST,SRC 功 能: DSTDST+SRC+CF

18、操作说明: ADC指令与ADD指令有些相似,但是它将目的操作数与源操作数相加时,同时还要加上进位标志CF的内容,然后将结果送回目的操作数。ADC指令也将根据运算结果修改状态标志位。 用 途:带进位加法指令主要用于数据位数较长、需要分段运算的加法运算。如果数据的低位相加时产生进位,在下一次高位相加时必须将这个进位加进去,否则结果是错误的。 【例2.19】 编写计算两个四字节长整数之和的程序,已知数NA=7A546C08H,NB=12F0497DH,求:NA+NB。运算程序如下: MOV BX,6C08H ;取加数的低字 ADD BX,497DH ;和另一个加数的相应字相加 MOV AX,7A54

19、H ;取加数的高字 ADC AX,12FOH ;和另一个加数的相应字相加 上述程序段的运行结果:AX中为和的高字,BX中为和的低字。 (3)加1指令 指令格式: INC DST 功 能: DSTDST+1 操作说明: INC指令将目的操作数内容加1后送回目的操作数。该指令将影响状态标志位,如SF、ZF、AF、PF和OF,但对进位标志CF没有影响。 INC指令中目的操作数可以是寄存器或存储器,但不能是段寄存器和立即数。INC指令常常用于循环程序中修改地址或者进行加法计数。 【例2.20】INC SI ;将SI寄存器内容加1 INC BYTE PTRBX ;将存储器字节单元BX内容加1 INC W

20、ORD PTRSI :将存储器字单元SI内容加1指令中的BYTE PTR或WORD PTR分别指定随后的存储器操作数的类型。2. 减法指令 减法指令包括不带借位减法指令、带借位减法指令减1指令、求补指令和比较指令。 (1)减法指令 指令格式: SUB DST,SRC 功 能: DST DST-SRC 操作说明: SUB指令用目的操作数减去源操作数,结果送回目的操作数。SUB指令对状态标志位均有影响。对操作数类型的要求与加法指令相同。【例2.21】SUB AL,52H SUB DX,BX SUB DI,AX SUB WORD PTRBX,30H(2)带借位减法指令 指令格式:SBB DST,SR

21、C 功 能:DST DST-SRC-CF 操作说明:SBB指令将目的操作数减去源操作数,同时减去进位标志CF,并将结果送回目的操作数。该指令主要用于多字节数的分段减法。SBB指令对标志位的影响与SUB指令相同。SBB指令中目的操作数与源操作数的类型也与SUB指令相同。【例2.22】 SBB BX,2000H SBB AX,DX SBB BP,AX【例2.23】 试编写一程序段,将数据段中偏移地址为1000H与1001H的存储单元内容之差存放在1002H单元中。程序如下:MOV BX,1000H ;偏移地址1000H送BX,以便用BX间接寻址MOV AL,BXINC BX SUB AL,BXIN

22、C BXMOV BX,ALHLT(3)减1指令指令格式: DEC DST功 能: DSTDST-1操作说明: DEC指令使目的操作数内容减1后送回目的操作数中。指令对状态标志位SF、ZF、AF、PF和OF有影响,但不影响进位标志CF。 指令中的操作数与INC一样,可以是寄存器(不可以是段寄存器)或存储器,在循环程序中常常利用DEC指令来修改循环次数寄存器或地址。 【例2.24】 DEC CX ;寄存器内容减1 DEC BYTE PTRDI ;存储单元内容减1注意:与INC指令类似,若DEC指令的目标操作数为存储器时,必须用BYTE PTR或WORD PTR等说明其类型 (4)求补指令指令格式:

23、 NEG DST功 能: DST 0 - DST 操作说明: NEG指令使操作数求补,即用“0”减去目的操作数(或包括符号一起全部求反加1),结果送回目的操作数。求补指令对状态标志位有影响。其操作数可以是寄存器或存储器。 【例2.25】 NEG AX NEG WORD PTRDI+20利用NEG指令可以由一个数的补码得到它相反数的补码,如果这个数是负数,那么,就得到它的绝对值。例如:假设AL=1,执行指令NEG AL后,AL=0FFH,为-1的补码;假设AL=0FFH(0FFH是-1的补码),执行指令NEG AL后,AL=1,为-1的绝对值。(5)比较指令指令格式: CMP DST,SRC功

24、能: DST-SRC 操作说明: CMP指令将目的操作数减去源操作数,但结果不送回目的操作数。即只做减法运算,不保留差的值,运算结果的性质反映在状态标志位上。这是比较指令CMP与减法指令SUB的区别所在。CMP指令常常与条件转移指令结合起来使用,完成各种条件判断和相应的程序转移。 CMP指令中目的操作数和源操作数的类型与SUB指令相同。可以进行字节比较,也可以进行字比较。 【例2.26】CMP AL,0AH CMP AX,AREAl CMP BX+5,SI比较指令的执行结果将影响状态标志位。根据标志寄存器内容可判断两数大小。例如:执行CMP DST,SRC后: 若ZF=1,则DST=SRC 两

25、个无符号数比较:若CF=1,则DST < SRCCF=0,则DSTSRC 两个带符号数比较:若OF与SF同号,则DSTSRCOF与SF异号,则DST < SRC【例2.27】判断寄存器AX与BX的内容是否相等,若相等,使DX=1,否则,使DX=0。解:程序如下CMP AX,BXJZ EQUALMOV DX,0JMP NEXTEQUAL: MOV DX,1NEXT: HLT 【例2.28】在DATA开始的内存单元存有100个无符号字节数,找出其中最大数送MAX单元中。程序如下:MOV SI,OFFSET DATAMOV AL,SIINC SIMOV CL,99AGAIN: CMP A

26、L,SI JNC NEXT ;无借位转移到NEXT MOV AL,SINEXT: INC SI DEC CL JNZ AGAIN ;CL不等于0转移到AGAIN MOV MAX,AL HLT3. 乘法指令 乘法指令有两条,分别用于无符号数和带符号数的乘法。指令格式:MUL SRC ;无符号数乘法 IMUL SRC ;带符号数乘法功 能:SRC为字节操作数时,做字节乘法:AXAL*SRCSRC为字操作数时,做字乘法: (DX,AX)AX*SRC操作说明:乘法指令中只列出源操作数,目的操作数是隐含的。源操作数可以是寄存器或存储器,但不能是立即数。两条指令都可以实现字节或字的乘法运算。如果两个8位数

27、据相乘,其16位乘积存放在AX中。如果两个16位数据相乘,其32位乘积存放在DX和AX中,其中高16位存于DX中,低16位存于AX中。乘法操作指令示意如图2.5所示。 注意:两条指令的功能是一样的,但是对同样的机器数其运算结果是不同的。例如:计算(11111111B)*(11111111B)时,若将11111111B看成是无符号数时使用MUL指令时,则表示为255*255=65025,而看成带符号数时使用IMUL指令时,则表示为(-1)*(-1)=1。 乘法指令影响CF和OF两个标志位,且它们的状态相同。 对MUL指令,如果乘积的高半部分(在AH或DX中)不为零,则状态标志位CF=OF=1,否

28、则CF=OF=0。因此,状态标志位CF=OF=1表示AH或DX中包含着乘积的有效数字。 IMUL指令将两个操作数均按带符号数处理。如果乘积的高半部分仅仅是低半部分符号位的扩展(没有有效数字),则状态标志位CF=OF=0;反之,高半部分包含乘积的有效数字而不只是符号的扩展部分,则CF=OF=1。4.除法指令指令格式: DIV SRC ;无符号数除法 IDIV SRC ;带符号数除法功 能:SRC为字节操作数时,做字节除法:ALAXSRC的商 AHAXSRC的余数SRC为字操作数时,做字除法:AX(DX,AX)SRC的商 DX(DX,AX)SRC的余数 操作说明: 80868088执行除法时规定:

29、除数只能是被除数的一半字长。当被除数为16位时,除数应为8位;被除数为32位时,除数应为16位。并规定:被除数为16位时,应存放在AX中。除数为8位,可存放在寄存器或存储器中(不能为立即数)。得到的8位商放在AL中,8位余数放在AH中;被除数为32位时,应存放在DX(高位)和AX(低位)中,除数为16位,可存放在寄存器或存储器中(不能为立即数)。得到的16位商放在AX中,16位余数放在DX中。 除法指令操作如图2.6所示。 使用除法指令,出现以下三种情形之一时,CPU立即产生一个类型号为0的内部中断(有关中断的概念将在本书的第5章叙述)。 除数为零。 字节除法时,被除数高8位的绝对值大于除数的

30、绝对值(此时的商超过了8位)。 字除法时,被除数高16位的绝对值大于除数的绝对值(此时的商超过了16位)。 前一种属于操作数异常(除数为零),后两种属于运算结果溢出。此外,如果被除数和除数字长相等,则在用IDIV指令进行带符号数除法之前,必须先用符号扩展指令CBW或CWD将AL或AX中的被除数的符号位扩展,使之成为16位数或32位数。对于无符号数来说,应该用8位或16位零把被除数扩展成16位数或32位数。5.符号扩展指令 (1)字节扩展指令 指令格式: CBW 功 能: 如果AL<80H,则AH00H,否则AH0FFH。 (2)字扩展指令 指令格式: CWD 功 能: 如果AX<8

31、000H,则DX0000H,否则DX0FFFFH。 注 意: 上述两条指令仅限于在AL或AX中进行。 【例2.29】 若AL=100,BL=15,试编写程序段,求出AL除以BL的商和余数分别存放在DL和DH中。 解:程序如下:CBW ;字节转换DIV BL ;除法MOV DL,AL ;存商MOV DH,AH ;存余数HLT6. 十进制数(BCD码)运算调整指令以上介绍的是二进制数的算术运算。有的场合需要使用十进制数,计算机中十进制数用BCD码来表示。BCD码有两类:一类叫压缩型BCD码(1个字节存放2位BCD码),一类叫非压缩型BCD码(1个字节中只存放1位BCD码)。在用BCD码进行十进制数

32、加、减、乘运算时,应分两步进行: 先按二进制数运算规则进行运算,得到中间结果。 用十进制调整指令对中间结果进行修正,得到运算结果的BCD码。 注 意:BCD码的运算只能在8位累加器AL中进行。十进制数的乘、除运算只能用非压缩的BCD格式。除法运算时,应先调整,后运算。 (1)压缩型BCD码调整指令 指令格式: DAA ;加法调整 DAS ;减法调整操作说明: 将加法(ADD或ADC)或减法(SUB或SBC)运算的结果(在AL寄存器中)调整为压缩BCD码。注意,参与运算的应是压缩BCD码。【例2.30】 48+29=77运算结果得不到77的压缩BCD码,是因为在进行二进制加法运算时,低四位向高四

33、位有个进位,这个进位是按十六进制进行的,即低4位逢16才向高四位进1,而十进制数应是逢十进一。因此,比正确结果少6,这时,调整指令应在相加结果的低4位上加6。即:上述运算过程用指令实现如下: MOV AL,48H ADD AL,29H DAA(2)非压缩型BCD码调整指令1) 加减法调整指令格式: AAA ;加法调整 AAS ;减法调整操作说明: 将加法(ADD或ADC)或减法(SUB或SBC)运算的结果(在AL寄存器中)调整为非压缩BCD码。调整后的AL寄存器中高4位被清0,如有进位或借位,则在AH中。 2)乘法调整 指令格式: AAM 操作说明: 把AL中的数值调整为非压缩BCD码,并存入

34、AX中。 在用此指令进行调整之前应先执行无符号数的乘法指令,相乘的两个数必须是非压缩BCD码,即BCD码在低4位中,相乘的结果在AL中(两个乘数均小于10,它们的乘积小于100)。执行调整指令AAM时,将AL内容除以10,将商放在AH中作为结果的十位数(BCD码),余数放在AL中,作为结果的个位数(BCD码)。 3)除法调整 指令格式: AAD 功 能: ALAH*l0+AL,AH0 操作说明: AAD指令是一个隐含了寄存器操作数AL和AH的指令。其具体操作为:将AH寄存器的内容乘以10并加上AL寄存器的内容,结果送回AL,同时将AH清0。其操作实质是将AX寄存器中的非压缩BCD码转换成二进制

35、数,存放在AL中。 注 意:该指令与其他调整指令在使用方法上是不同的。加、减、乘法调整在运算后进行再进行指令调整,而除法调整应在除法运算之前先使用指令调整。除法所得的商还需用AAM指令进行调整方可得到正确的非压缩BCD码的结果。 【例2.31】 用非压缩BCD码做58/4=142这一运算时,可用下列指令实现MOV AX,0508H ;AX58的非压缩BCD码AAD ;非压缩BCD码除法调整,AX=003AH=58MOV BL,04H ;BL除数4DIV BL ;AH=2(余数),AL=0EH(商的二进制码)MOV BL,AH ;余数存入BL中AAM ;AX=0104H(商的非压缩BCD码)HL

36、T2.3.3位操作指令这类指令包括逻辑运算指令、移位指令和循环指令。1逻辑运算指令80868088指令系统的逻辑运算指令有“与”(AND)、“测试”(TEST)、“或”(OR)、“异或”(XOR)和“非”(NOT)五条。除了“非”指令对状态标志位不产生影响外,其余四条指令对状态标志位均有影响。这些指令将根据各自逻辑运算的结果影响SF、ZF和PF状态标志位,同时将CF和OF置“0”,但AF的值不确定。 (1)逻辑“与”指令 指令格式: AND DST,SRC 功 能: DSTDSTSRC操作说明: AND指令将目的操作数和源操作数按位进行逻辑“与”运算(即相“与”的两位均为1时结果为1,否则为0

37、),将结果送回目的操作数。指令中目的操作数可以是寄存器或存储器,源操作数可以是立即数、寄存器或存储器。但是指令的两个操作数不能同时是存储器。作 用: AND指令可以有选择地屏蔽某些位(有选择地清0),而保留另一些位不变。【例2.32】 AND AL,3CH ;8位二进制分别进行与运算AND AX,BX ;16位二进制分别进行与运算AND DX,BUFFERSIAND DI,CX【例2.33】 MOV AL,1011010lB ;AL=1OllOl01BAND AL,0FH ;AL=00000101B,保留低四位,高四位清0 (2)测试指令 指令格式: TEST DST,SRC 功 能: DST

38、 SRC 操作说明: TEST指令将目的操作数和源操作数按位进行逻辑“与”运算,但逻辑运算的结果不送回目的操作数,即仅做DSTSRC运算,两个操作数的内容均保持不变,但运算结果影响状态标志位。 作 用:TEST指令常常用于位测试,它与条件转移指令一起,共同完成对特定位状态的判断,并实现相应的程序转移。 【例2.34】 测试AL的最高位是否为零,若不为零,则转移到NEXT。TEST AL,10000000BJNZ NEXT NEXT: (3)逻辑“或”指令 指令格式: OR DST,SRC 功 能: DSTDSTSRC 操作说明: 将目的操作数和源操作数按位进行逻辑“或”运算(即相“或”的两位中

39、任一位为1时结果为1,只有两位都为0时结果才为0),并将结果送回目的操作数。 作 用: OR指令操作数的类型与AND指令相同。OR指令可将寄存器或存储器中的某些特定的位设置成“1”,同时使其余位保持原来的状态不变。 【例2.35】 若将AL寄存器的最高位置“1” ,而保持其余位不变时,可用如下指令: OR AL,10000000B ;ALAL(10000000B) (4)逻辑“异或”指令 指令格式: XOR DST,SRC 功 能: DSTDSTSRC 操作说明: XOR指令将目的操作数和源操作数按位进行逻辑“异或”运算(即相“异或”的两位数不相同时结果为“1”,相同时则为“0”),并将结果送

40、回目的操作数。XOR指令操作数的类型与AND、OR指令均相同。作 用: XOR指令可将寄存器或存储器中的某些特定的位“求反”,而使其余位保持不变。XOR指令的另一个用途是将寄存器的内容清0。XOR指令和AND、OR等指令一样,也会将进位标志CF清0。 【例2.36】 使AL寄存器中的第1、3、5、7位求反,第0、2、4、6位保持不变,可将AL和10101010B(即OAAH)“异或”。 MOV AL,0FH ;AL=0FH XOR AL,10101010B ;AL=1O1OOl01B(0A5H)【例2.37】 XOR AX,AX ;将AX清0,同时将CF清0 (5)逻辑“非”运算指令格式: N

41、OT DST功 能: DST 操作说明: NOT指令使目的操作数按位取反,即其中所有“0”的位变为“1”,所有“1”的位变为“0”。其操作数可以是8位或16位的寄存器或存储器,但不能对立即数执行逻辑“非”操作。 【例2.38】 NOT AHNOT WORD PTRBXDI2.移位指令80868088指令系统的移位指令可以向左或向右移位,移位次数由COUNT决定,COUNT为1时移动一位,可直接写于指令中。要求移多位时,移动位数必须事先放在CL寄存器中。移位指令影响除AF外的其他状态标志位。 (1)逻辑左移指令指令格式: SHL DST,COUNT 功 能:如图2.7所示。 操作说明:SHL指令

42、将目的操作数顺序向左移1位或移CL寄存器中指定的位数。左移1位时,操作数的最高位MSB移入进位标志CF,最低位LSB补0,相当于无符号数乘上2。 【例2.39】 MOV AH,8BHMOV CL,3SHL AH,CL ;SI内容左移3位 (2)逻辑右移指令 指令格式: SHR DST,COUNT功 能: 如图2.8所示。操作说明: SHR将目的操作数顺序向右移1位或移CL寄存器中指定的位数。低位移入CF,高位补0。无符号数右移1位相当于除以2。【例2.40】 MOV BL,20H ;BL=20HSHR BL,1 ;BL=10H(3)算术左移指令指令格式:SAL DST,COUNT 功 能:如图

43、2.9所示。操作说明:SAL指令将目的操作数顺序向左移1位或移CL寄存器中指定的位数。操作与SHL完全相同。【例2.41】SAL WORD PTRBX+50,1 (4)算术右移指令指令格式:SAR DST,COUNT功 能:如图2.10 操作说明:SAR指令将目的操作数向右移1位或由CL寄存器指定的位数。右移一位时,操作数的最低位LSB移入进位标志CF,最高位MSB保持不变。对带符号数算术右移一位相当于将该数除以2。【例2.42】SAR AL,1SAR DI,CLSAR WORD PTRTABLESI,1SAR BYTE PTRBX,CL 4循环移位指令80868088指令系统有四条循环移位指

44、令,包括不带进位和带进位循环移位。指令中指定的左移或右移的位数COUNT可以是1或由CL寄存器指定。所有循环移位指令都只影响进位标志CF和溢出标志OF。 (1)循环左移指令 指令格式: ROL DST,COUNT功 能: 如图2.11所示。 操作说明: ROL指令将目的操作数顺序向左移1位或移CL寄存器中指定的位数。左移1位时,操作数的最高位MSB移入进位标志CF的同时,还移到最低位LSB形成循环,进位标志位不在循环环内。 【例2.43】 ROL AH,1 ;8位二进制数循环左移1位ROL DX,CL ;16位二进制数循环左移CL位操作说明:ROR指令将目的操作数顺序向右移1位或右移CL寄存器

45、中指定的位数。右移1位时,操作数的最低位LSB移入进位标志CF的同时,还移到最高位MSB形成循环,进位标志位不在循环环内。 (2)循环右移指令 指令格式: ROR DST,COUNT功 能:如图2.12所示。 操作说明:ROR指令将目的操作数顺序向右移1位或移CL寄存器中指定的位数。右移1位时,操作数的最低位LSB移入进位标志CF的同时,还移到最高位MSB形成循环,进位标志位不在循环环内。【例2.44】ROR CX,1ROR DX,CL(3)带进位循环左移指令指令格式:RCL DST,COUNT功 能:如图2.13所示。 操作说明:RCL指令将目的操作数连同进位标志CF一起向左循环移动1位或C

46、L寄存器中指定的位数。移动一位时,最高位MSB移入CF,而原CF移入最低位LSB。【例2.45】ROR CX,1ROR DX,CL (4)带进位循环右移指令格式: RCR DST,COUNT功 能:如图2.14所示。操作说明:RCR指令将目的操作数连同进位标志CF一起向右循环移动1位或由CL寄存器中指定的位数。移动一位时,最低位LSB移入CF,而原CF则移入最高位MSB。【例2.46】 测试AL寄存器中第5位的状态,为“0”时转向ZERO,否则向下继续执行。方法1 用循环移位指令实现: MOV CL,6 ROR AL,CL ;将AL的bit5移入CF JNC ZERO ;若CF=0,则转向ZE

47、RO处 ;否则,继续执行 ZERO: 方法2:用测试指令实现:TEST AL,20H ;将AL与20H相“与”JZ ZERO ;若结果为0,则转向ZERO处 ;否则,继续执行ZERO: 2.3.4 串操作指令串操作指令共有以下5条:串传送指令(MOVS)、串装入指令(LODS)、串送存指令(STOS)、串比较指令(CMPS)和串扫描指令(SCAS)。 串操作指令具有以下几个共同特点: (1)操作数的寻址 1)用寄存器SI寻址源操作数(源串)DS:SI,但也允许段超越。 2)用寄存器DI寻址目的操作数(目的串)ES:DI,不允许段超越。 3)每一次操作后自动修改地址指针,由方向标志DF决定。当DF=0时(由CLD指令设置),按增量修改;若DF=1(由STD指令设置),按减量修改。增减的量值取决于所操作的数据的类型。字节操作时,量值为1,字操作时为2。 (2)重复前缀指令 1)重复前缀指令加在串操作指令前,使串操作重复进行,重复的次数由CX的内容决定。因此,使用重复前缀以前应首先给CX赋值。串操作指令每执行一次,CX的内容就减1,直到CX减为0时,结束串指令操作。2)重复前缀指令格式及重复条件REP ;CXCX-1;CX0重复执行串操作指令。主要与MOVS、STOS和LODS指令可配合工作。REPEREPZ ;CXCX-1;CX0且ZF=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论