1、任务3 8086指令系统,2.条件转移指令 8086指令系统的条件转移指令以某些标志位的状态或有关标志位的逻辑运算结果作为依据,以此决定是否转移。 这些标志位通常由条件转移指令的上一条指令所设置。条件转移指令将根据这些标志位的状态,判断是否满足对应的测试条件。若满足条件,则转移到指令指定的地方,否则继续执行条件转移指令之后的指令。 此外还有无符号数比较转移指令和带符号数比较转移指令两类,这两类指令一般在CMP指令后使用。 条件转移指令的助记符、指令名称、转移条件如表3-4所示。,下一页,返回,上一页,表3-4条件转移指令转移条件,返回,任务3 8086指令系统,例3-7已知在内存中有两个无符号
2、字节数据X1和X2,比较两个数是否相等,若相等,则将RESULT单元置1,否则置0。其程序段如下。 MOV AL,X1 ;将第1个数取出送至AL中 CMP AL,X2 ;和第2个数进行比较 JZ NEXT ;相等则转到NEXT位置执行 MOV RESULT,0 ;否则,将RESULT单元置。 JMP EXIT ;然后转到EXIT位置 NEXT:MOV RESULT,1 ;将RESULT单元置1 EXIT:HLT,下一页,返回,上一页,任务3 8086指令系统,例3-8已知在内存中有两个无符号字节数据NUM1和NUM2,找出其中的最大数送到MAX单元。其程序段如下。 MOV AL,NUM1 ;将
3、第1个数取出送到AL中 CMP AL,NUM2 ;和第2个数进行比较 JA NEXT ;第1个数大于第2个数则转到NEXT位置 MOV AL,NUM2 ;否则将第2个数取出送到AL中 NEXT:MOV MAX,AL ;AL中为最大数送到MAX单元 本题若改为带符号数,则程序段如下。 MOV AL,NUM1;将第1个数取出送到AL中,下一页,返回,上一页,任务3 8086指令系统,CMP AL,NUM2 ;和第2个数进行比较 JG NEXT ;第1个数大于第2个数则转到NEXT位置 MOV AL,NUM2 ;否则将第2个数取出送到AL中 NEXT:MOV MAX,AL ;AL中为最大数,送到MA
4、X单元 3.循环控制指令 循环程序是一种常用的程序结构,为了加快对循环程序的控制,8086系统专门设置了一组循环控制指令,如表3-5所示,循环计数值在CX中。,下一页,返回,上一页,表3-5循环控制指令,返回,任务3 8086指令系统,循环控制指令只是根据结果的标志位状态进行控制操作,指令本身不影响标志位。循环控制指令用于控制程序的循环,其控制转向的目的地址是在以当前指令指针IP内容为中心的-128+127的范围内,指令采用CX作为计数器,每执行一次循环,CX内容减1,直到为0,循环结束。 LOOP指令是以寄存器CX的内容作为计数控制,做(CX) (CX)-1的操作,并判断CX;当(CX) 0
5、时,转移到由操作数指示的目的地址,即(IP) (IP)+位移量,进行循环;当(CX)=0时,结束循环。 LOOPZ/LOOPE指令可完成当ZF=1且(CX)0条件下的循环操作。在LOOPZ或LOOPE所做的控制循环操作过程中,除了进行(CX)(CX)-1的操作,还要判断(CX)是否为零。此外,还将判断标志位ZF的值。,下一页,返回,上一页,任务3 8086指令系统,LOOPNZ或LOOPNE指令可完成当ZF=0且(CX)0的条件下的循环控制操作。其操作过程类似于LOOPZ或LOOPE指令。 例3-9在内存中有一个具有CN个字节的数据串,首单元地址为DATA-BUF,找出第1个不为0的数据的地址
6、并送到ADDR单元中。其程序如下。 MOV SI,OFFSET DATA-BUF ;取首单元地址 MOV CX,CN;计数器初值 MOV AL,O;AL清零 DEC SI;循环初始化 LP:INC SI;指针增1 CMP AL,SI ;内存中的数据和AL中的内容比较 LOOPZ LP;为0且未比较到末尾转LP位置继续 JZ EXIT;否则判断ZF,若为1,转EXIT MOV ADDR,SI;ZF为O,SI中的内容送ADDR,下一页,返回,上一页,任务3 8086指令系统,EXIT:HLT 该程序段中循环结束的情况有两种:一种是找到了不为0的数据,一种是CN个数据比较结束后未找到。所以,退出循环
7、后要判断ZF是否为1,ZF -1说明所有数据都为0,否则就是找到了不为0的数据,并且由SI指示其存储地址。 4.子程序调用和返回指令 在程序设计过程中,通常把功能分解为若干个小的模块。每一个小功能模块对应一个过程。在汇编语言中,过程又称为子程序。程序中可由调用程序(称为主程序)调用这些子程序,子程序执行完毕后返回主程序继续执行。 子程序调用分为段内和段间调用。指令格式如下。,下一页,返回,上一页,任务3 8086指令系统,CALL NEAR PTR opr ;表示段内调用 CALL FAR PTR opr ;表示段间调用 RET;表示子程序返回 其中,opr为子程序名(即子程序第1条指令的符号
8、地址)。 例3-10在主程序中执行一条段内调用语句。程序段如下。 MAINPROC FAR;定义主程序 MOV AX , DATA ; DS初始化MOV DS,AX CALL DISPLAY;调用子程序DISPLAY DISPLAYPROC NEAR;定义子程序 PUSH AX;保护现场,下一页,返回,上一页,任务3 8086指令系统,PUSH BX RET;子程序返回 3.3.5处理器控制类指令 这类指令主要用于修改状态标志位、控制CPU的功能,如使CPU暂停、等待、空操作等,如表3-6所示。 在CPU控制指令中,H LT指令使程序暂停执行,这时CPU不进行任何操作,当CPU发生复位或发生外
9、部中断时,CPU脱离暂停状态,H LT指令可用于程序中等待中断;WAIT指令在CPU测试引脚为高电平(无效)时,使CPU进入等待状态。,下一页,返回,上一页,表3-6处理器控制类指令,返回,下一页,表3-6处理器控制类指令(续表),返回,上一页,任务3 8086指令系统,这时,CPU不做任何操作。当CPU测试引脚为低电平(有效)时,CPU脱离等待状态,继续执行WAIT指令后面的指令;NOP指令只做空操作,不执行其他任何操作,占用1B存储单元,空耗一个指令执行周期,该指令常用于程序调试,还可以实现软件延时;LOCK指令是一个前缀,可以加在任何指令之前,CPU执行该指令时封锁总线;ESC指令将处理
10、器的控制权交给协处理器,如在8086系统中可加入浮点运算协处理器8087,若8086微处理器发现是一条浮点指令时,就利用ESC指令将浮点指令交给8087执行。,下一页,返回,上一页,任务3 8086指令系统,3.3.6逻辑运算与移位类指令 逻辑运算与移位指令共有13条,分为3种类型,即逻辑运算指令、移位指令和循环移位指令,可对8位/16位寄存器或存储器中的数据进行操作。 1.逻辑运算指令 逻辑运算指令有5条,其中源/目的操作数地址同算术运算指令、单操作数指令不允许使用立即数,双操作数指令中至少有一个操作数在寄存器中,另一个操作数可以使用任意寻址方式,而立即数不能作为目的操作数。,下一页,返回,
11、上一页,任务3 8086指令系统,1)逻辑“与”指令AND 格式:AND DST, SRC 功能:DST (DST) (SRC)。 说明:使状态标志CF和OF清。,AF无定义,SF,ZF和PF由运算结果设置;源操作数中某些位为0时,可使目的操作数的相应位清0。举例如下。 AND AX ,1110 1111 0111 1111 B;使AX中第7 ,12位清0,其余位不变 2)逻辑“或”指令OR 格式:OR DST,SRC 功能:DST (DST) (SRC)。 说明:对状态标志位的影响同AND指令;若源操作数中某些位为1,可使目的操作数的相应位置1。举例如下。 OR BX , 0001 0000
12、 1000 0000 B;使BX中第7位、12位置1,其余位不变,下一页,返回,上一页,任务3 8086指令系统,3)逻辑“异或”指令XOR 格式:XOR DST, SRC 功能:DST (DST) (SRC)。 说明:对状态标志位的影响同AND指令;若操作数与自身“异或”,结果清。;某位与“异或”,该位“取反”。举例如下。 XOR AL,1010 0000B;使AL的第5 ,7位取反,其余位不变 例3-11将AX和CF清零。 解:实现方法有多种。 方法1;AND AX,0 方法2 ; XOR AX , AX 4)逻辑“非”指令NO下 格式:NOT DST 功能:DST (DST)。,下一页,
13、返回,上一页,任务3 8086指令系统,说明:不影响标志位。 5)TEST测试指令 格式:TEST DST,SRC 功能:(DST) (SRC)置状态标志,不送结果。 说明:用来测试目的操作数中某位是否为1;执行过程与AND指令相同,设置状态标志,但是不送结果;对状态标志位的影响同AND指令。举例如下。 TEST AX,0040H;测试AX中第6位是否为1 2.移位指令 移位指令有4条,包括算术/逻辑左移与右移,其作用如图3-20所示。,下一页,返回,上一页,图3-20移位指令示意图,(a)算术左移;(b)算术右移;(C)逻辑左移;(d)逻辑右移,返回,任务3 8086指令系统,1)算术左移指
14、令SAL 格式:SAL DST,CNT 功能:左移,如图3-20(a)所示,相当于操作数乘以20 说明: 其中DST可以是除立即数之外的任一种寻址方式,移位次数由CNT决定,可以是1或寄存器CL。若移位次数大于1,应事先存入CL中;DST可以是字节,也可以是字。 影响状态标志CF,SF,PF和ZF,AF无定义,OF只在CNT=1时有效。 2)算术右移指令SAR 格式:SAR DST,CNT 功能:右移,如图3-20(b)所示,相当于操作数除以20,下一页,返回,上一页,任务3 8086指令系统,说明:操作数同指令SAL,对状态标志位的影响同指令SAL. 3)逻辑左移指令SHL 格式:SHL D
15、ST,CNT 功能:左移,如图3-20(c)所示,相当于无符号数乘以20 说明:操作数同指令SAL,对状态标志位的影响同指令SAL 4)逻辑右移指令SHR 格式:SHR DST,CNT 功能:右移,如图3-20(d)所示,相当于无符号数除以20 说明:操作数同SAL指令,对状态标志位的影响同指令SAL 3.循环移位指令 循环移位指令有4条,包括带进位/不带进位的循环左移与右移,其作用如图3-21所示。 1)循环左移指令ROL,下一页,返回,上一页,图3-21循环移位指令的操作示意图,(a)循环左移;(b)循环右移;(c)带进位循环左移;(d)带进位循环右移,返回,任务3 8086指令系统,格式
16、:ROL DST,CNT 功能:循环左移,如图3-21(a)所示。 说明:影响状态标志位CF,OF只在CNT=1时有效,不影响SF ,PF ,ZF和AF 2)循环右移指令ROR 格式:ROR DST, CNT 功能:循环右移,如图3-21(b)所示。 说明:同指令ROL 3)带进位循环左移指令RCL 格式:RCL DST,CNT 功能:带进位循环左移,如图3-21(c)所示。,下一页,返回,上一页,任务3 8086指令系统,说明:同指令ROL 4)带进位循环右移指令RCR 格式:RCR DST,CNT 功能:带进位循环右移,如图3-21(d)所示。 说明:同指令ROL 例3-12在寄存器DX和AX中存放有32位无符号二进制数,试编写程序,实现乘4运算。 解:对于32位数据,先进行低16位左移,再进行高16位带进位左移,重复两遍,即乘以4,程序如下。 SHL AX,1 RCL DX,1 SHL AX,1 RCL DX,1,返回,上一页,