1、第三节第三节 8086/8088的指令系统的指令系统(续)续)内容内容: 三、逻辑运算和移位指令三、逻辑运算和移位指令 (一)逻辑运算指令(一)逻辑运算指令 (二)移位指令(二)移位指令 (三)循环移位指令(三)循环移位指令 四、串操作指令四、串操作指令(一)(一) (二)(二)三、逻辑运算和移位指令三、逻辑运算和移位指令1、AND(Logical and ) 逻辑逻辑“与与”指令指令2、 TEST(Test or non-destructive logical and ) 测试指令测试指令3、OR(Lgical inclusive or ) 逻辑逻辑“或或”指令指令4、XOR(Logical
2、 exclusive or) 逻辑逻辑“异或异或”指令指令5、NOT(Logical not ) 逻辑逻辑“非非”指令指令影响条件码:影响条件码: (NOT指令除外,其他指令同)指令除外,其他指令同) 格式:格式:AND dest, src ;B/W,(dest)(dest (src)执行操作:按位进行执行操作:按位进行“与与”运算。运算。操作类型举例:操作类型举例:AND AL, 0FH ;寄存器;寄存器 立即数立即数AND CX, DI ; 寄存器寄存器 寄存器寄存器AND SI, MEM_NAME ; 寄存器寄存器 存储器存储器AND ALPHA DI, AX ; 存储器存储器 寄存器寄
3、存器 AND word ptr BXSI, 0FFFEH ; 存储器存储器 立即数立即数 “与与”指令的用途指令的用途:对一个数据的指定位清对一个数据的指定位清0。例:例: 若(若(AL)=4 H AND AL, 0 H ; (AL)=03H, ; ;。“与与”指令应用举例:指令应用举例:例例1:将英文小写字母:将英文小写字母ASCII转换成大写。转换成大写。小写英文字母小写英文字母ASCII为:为:az 61H7AH大写英文字母大写英文字母ASCII为:为:AZ 41H5AH程序:程序:MOV AL, z ; AND AL,0H; 例例2:判断键盘按下的字符是不是:判断键盘按下的字符是不是Y
4、? ;键入无回显,(键入无回显,(AL)=输入键的字符码输入键的字符码AND AL, 0DFHCMP AL, YJE YES YES: 0110 00010100 00011101 111161H41HFDH(Test or non_destructive logical and ) 格式:格式: TEST dest , src;(;(dest)(src)执行操作:执行操作: 二个操作数相与的结果不存入目的,只影响标志位二个操作数相与的结果不存入目的,只影响标志位。操作类型举例:操作类型举例:TEST BH, 7 ; 寄存器寄存器 立即数立即数TEST SI , BP ;寄存器;寄存器 寄存器
5、寄存器TEST DI ,TABLEBX ; 寄存器寄存器 存储器存储器TEST SI,CH ;存储器;存储器 寄存器寄存器TEST word ptr BXDI, 6ACEH ;存储器;存储器 立即数立即数用途:用途:常常常常,但又不希望改变原有的操作,但又不希望改变原有的操作数的情况下,常在此指令后边加一条数的情况下,常在此指令后边加一条 条件转移指令。条件转移指令。例:判断例:判断A单元中数据的奇偶性单元中数据的奇偶性设:设: (A )= 0AEH程序:程序:MOV AL,A;(AL)=0AEH TEST AL,01H JZ EVEN ; 结果结果=0为偶数转为偶数转EVEN 奇数处理奇数处
6、理 EVEN:偶数处理偶数处理检测(检测(AL)的最低位是否为)的最低位是否为0,若为,若为0转转EVEN格式:格式:OR dset, src;(;(dset)(dset) (src)执行操作:执行操作: 进行按位进行按位“或或”运算运算用途:用途:将操作数的指定将操作数的指定操作类型举例:操作类型举例:OR BL,0F6H; 寄存器寄存器 立即数立即数OR AH, BL;寄存器;寄存器 寄存器寄存器OR CL ,BETABXDI; 寄存器寄存器 存储器存储器OR GAMMASI ,DX;存储器;存储器 寄存器寄存器OR BYTE PTR MEM_BYTE , 80H;存储器;存储器 立即数立
7、即数格式:格式:XOR dset , src ;B/W(dset) (dset) (src)执行的操作:对指令的两个操作数进行按位执行的操作:对指令的两个操作数进行按位“异或异或”运算。运算。操作类型举例:操作类型举例:XOR DI, 23F6HH ; 寄存器寄存器 立即数立即数XOR SI , DX ;寄存器;寄存器 寄存器寄存器XOR CL , BUFFER ; 寄存器寄存器 存储器存储器XOR MEMBX,AX ;存储器;存储器 寄存器寄存器XOR byte ptrTABLEBPSI, 3DH ; 存储器存储器 立即数立即数用途:用途:a 应用举例:应用举例:例例1: 将(将(AL)中的
8、第中的第1、3、5、7位求反位求反 0、2、4、6位保持不位保持不变。变。MOV AL, 0FHXOR AL,0AAH例例2:比较三条比较三条AX 清清“0”指令:指令: XOR AX , AX ; 清清AX , 清清CF,2个字节,个字节,3个个T。 SUB AX, AX ;清清AX , 清清CF,2个字节,个字节,3个个T。 MOV AX , 0 ;清清AX ,不影响标志位,不影响标志位, 3个字节,个字节,4个个T。 XOR清清“0”指令在多字节累加程序中十分有用。指令在多字节累加程序中十分有用。例例3:将存放在将存放在TABLE开始的开始的100个字节的个字节的16进制数进行累加,进制
9、数进行累加,和存于和存于SUM+1、SUM单元。单元。程序:程序:100个字节的个字节的16进制数进制数进行累加。进行累加。 LEA BX , TABLEMOV CL,100XOR AX ,AXLOOPER:ADD AL,BXJNC GOONINC AHGOON: INC BXDEC CLJNZ LOOPERMOV SUM , AXHLT流流程程图图开始开始初始化,置数据块地址指针初始化,置数据块地址指针置循环次数,清(AL)、(AH)置循环次数,清(AL)、(AH)累加1个字节送(AL)累加1个字节送(AL)有进位?有进位?地址指针1地址指针1循环次数1循环次数1 循环次数0? 循环次数0?
10、结束结束(AH)+1 (AH)(AH)+1 (AH)Y YN NN NY Y格式:格式: NOT dest ;B/W 指令操作数只有一个指令操作数只有一个,指令指令。执行操作:执行操作: 字节求反:(字节求反:(dest)0FFH-(dest) 字求反:字求反: (dest 0FFFFH-(dest) 影响标志位:对标志位无影响。影响标志位:对标志位无影响。操作类型举例:操作类型举例: NOT AH; 8位寄存器求反位寄存器求反 NOT CX;16位寄存器求反位寄存器求反 NOT BYTE PTR BP;8位存储器求反位存储器求反 NOT WORD PTR COUNT ;16位存储器求反位存储
11、器求反综合举例:综合举例:1使某些位置使某些位置“0”。 IN AL,61H;(;(AL)= B 设备控制寄存器设备控制寄存器 想使此位为想使此位为0执行指令:执行指令: 即可。即可。2. 使某些位置使某些位置“1”。 IN AL,61H;(;(AL)= 执行指令:执行指令: 想使此位为想使此位为“1”3. 使某些位求反:使某些位求反:IN AL,61H ;(;(AL)= 0 0 0 0 0 0 0 1 0 1 4. 测试某些位(测奇偶性):测试某些位(测奇偶性):测试测试 “奇奇”“”“偶偶”性。性。 见见TEST指令的用途例子。指令的用途例子。(1)AND指令用来对指令的指定位清指令用来对
12、指令的指定位清“0”。(2)OR指令常用来对某些位置指令常用来对某些位置1。(3)XOR指令用在程序开头,使某个寄存器清指令用在程序开头,使某个寄存器清“0”。(4)NOT指令对某个数据取反,指令对某个数据取反,+1成补码。成补码。(5)TEST指令用来检测指定位为指令用来检测指定位为1,还是,还是0。( 4条条 ): 。(1)、)、 SHL/SAL(Shift logical left/shift arithmetic left) 逻辑左移逻辑左移/算术左移指令算术左移指令(2)、)、SHR (Shift logical right ) 逻辑右移指令逻辑右移指令(3)、)、SAR (Shif
13、t arithmetic right )算术右移指令算术右移指令( 4条)条): 。(1)、)、ROL (Rotate left ) 不含不含CF循环左移指令循环左移指令(2)、)、ROR (Rotate right ) 不含不含CF循环右移指令循环右移指令(3)、)、RCL (Rotate left through carry )含含CF循环左移指令循环左移指令(4)、)、RCR (Rotate right through carry )含含CF循环右移指令循环右移指令共同点:共同点: 所有移位指令都可以作所有移位指令都可以作B/W操作。操作。 指令中的指令中的 cnt : 表示移位次数表示
14、移位次数 cnt=1,1可写在指令中,不能是可写在指令中,不能是1以外的常数。以外的常数。 cnt1,用,用CL存放移位次数存放移位次数 ,不能是其他寄存器。不能是其他寄存器。 如:如:SAL AX,1 MOV CL,4 SAL AX,CL 利用移位指令编制利用移位指令编制 *, / 程序,程序, 执行时间比直接用执行时间比直接用 * ,/ 指令快,指令快, 速度可提高速度可提高5-6倍。倍。( 4条条 ) : (1)、)、 SHL/SAL(Shift logical left/shift arithmetic left)逻辑左移逻辑左移/算术左移指令算术左移指令格式:格式: SHL dest
15、 ,cnt ;逻辑左移指令;逻辑左移指令, B/W SAL dest ,cnt ;算术左移指令;算术左移指令, B/W dest : 寄存器、存储器寻址方式。寄存器、存储器寻址方式。 cnt : 表示移位次数表示移位次数 cnt=1,1可写在指令中。可写在指令中。 cnt1,用,用CL存放移位次数存放移位次数 。 执行操作:执行操作:相当于无符号数的相当于无符号数的2功能。功能。 SHL/SAL指令操作示意图如下图所示:指令操作示意图如下图所示:指令格式举例:指令格式举例: SHL AH,1 SAL SI, CL SAL WORD PTR BX+5 ,1 SHL BYTE PTR , CL0C
16、Fdest(2)、)、SHR (Shift logical right )逻辑右移指令逻辑右移指令格式:格式: SHR dest ,cnt ;逻辑右移指令;逻辑右移指令, B/W执行操作:执行操作:相当于无符号数的相当于无符号数的2功能。功能。 SHR指令操作示意图如下图所示:指令操作示意图如下图所示:dest : 寄存器、存储器寻址方式。寄存器、存储器寻址方式。指令格式举例:指令格式举例:SHR BL , 1SHR AX , CLSHR BYTE PTR DI+BP,1SHR WORD PTR BLOCK ,CLdestCF0 (Shift arithmetic right )格式:格式:
17、SAR dest ,cnt ;算术右移指令;算术右移指令, B/W执行操作:执行操作:相当于带符号数的相当于带符号数的2功能功能,对负数向下舍入对负数向下舍入 IDIV指令对负数向上舍入。指令对负数向上舍入。(下页解释)下页解释) SAR指令操作示意图如下图所示指令操作示意图如下图所示dset指令格式举例:指令格式举例:SAR AL , 1SHR DL , CLSHR WORD PTR TABLESI,1SHR BYTE PTR STATUS ,CLCF( 4条)条): 。共同点:共同点: 不含不含CF循环移位指令,循环移位指令,。 含含CF循环移位指令,循环移位指令,。 影响标志影响标志OF
18、、CF (Rotate left )格式:格式: ROL dest ,cnt ;不含;不含CF循环左移指令循环左移指令, B/W执行操作:执行操作:ROL指令操作示意图如下图所示指令操作示意图如下图所示 CFdest指令格式举例:指令格式举例:ROL BH , 1ROL DX , CLROL WORD PTR TABLEDI,1ROL BYTE PTR ALPHA ,CL影响标志影响标志OF、CF 情况:情况: : 移位后,最高有效位(符号位)是否发生变化:移位后,最高有效位(符号位)是否发生变化: 如果移位后,如果移位后, CF根据各条指令的规定设置。根据各条指令的规定设置。 OF 值不定。
19、值不定。 CF=从目标操作数移出的最后一位。从目标操作数移出的最后一位。 SF、ZF、PF、AF不影响。不影响。 (Rotate right )格式:格式: ROR dest ,cnt ;不含;不含CF循环右移指令循环右移指令, B/W执行操作:执行操作:ROR指令操作示意图如下图所示指令操作示意图如下图所示 CFdest指令格式举例:指令格式举例:ROR CX , 1ROL BH , CLROL BYTE PTRBETA , 1ROL WORD PTR COUNT , CL (Rotate left through carry )格式:格式: RCR dest ,cnt ;含;含CF循环左移
20、指令循环左移指令, B/W执行操作:执行操作:RCL指令操作示意图如下图所示指令操作示意图如下图所示 。CFdest指令格式举例:指令格式举例:RCL BX , 1RCL DL , CLRCL BYTE PTR ARRAYDI , 1RCL WORD PTR SI+BP , CL (Rotate right through carry )格式:格式: RCR dest ,cnt ;含;含CF循环左移指令循环左移指令, B/W执行操作:执行操作:RCR指令操作示意图如下图所示指令操作示意图如下图所示 CFdest指令格式举例:指令格式举例:RCR DI, 1RCR SI , CLRCR WORD
21、 PTRSI+BX+3, 1RCL BYTE PTRPORT, CL带进位循环左移带进位循环左移移移9次还原次还原带进位循环左移带进位循环左移移移9次还原次还原循环右移(不带循环右移(不带CF) 移移8次还原次还原循环左移(不带循环左移(不带CF) 移移8次还原次还原算术右移算术右移(带符号数(带符号数2)逻辑右移逻辑右移(无(无 符号数符号数2)执行操作执行操作名称名称指令格式指令格式SHL oprd,1CL逻辑左移逻辑左移(无符号数(无符号数*2)0 CF 0 CF SAL oprd,1CL算术左移算术左移CF0 SHR oprd, 1CLCF SAR oprd, 1CLCF ROL op
22、rd,1CLCF ROR oprd, 1CLCF RCL oprd,1 1CL1 CF RCR oprd, 11CL1(Rotate)(Shift): 循环移位指令移位后,操作数中原来各数位的信息不会循环移位指令移位后,操作数中原来各数位的信息不会丢失,这是移动了位置,必要时可以恢复。丢失,这是移动了位置,必要时可以恢复。 循环移位指令可以对操作数进行测试。循环移位指令可以对操作数进行测试。例:测试例:测试(AL)5 = 0?MOV CL , 3JNC ZEROZERO:四、串操作指令(四、串操作指令(String manipulation ) “串串”就是内存中一段地址相连的字节或字。就是内
23、存中一段地址相连的字节或字。 。 8088有有5种基本操作:种基本操作: 1、 MOVS(Move string) 串传送指令串传送指令 2、CMPS(Compare string) 串比较指令串比较指令 3、SCAS(Scan string) 串扫描指令串扫描指令 4、LODS(Load from string) 从串取指令从串取指令 5、STOS (Store in to string) 存入串指令存入串指令 可以只有源操作数,可以只有目标操作数,可能二者都有。可以只有源操作数,可以只有目标操作数,可能二者都有。 源操作数用源操作数用SI 寻址,隐含寻址,隐含DS值为段地址,可以用段跨越前
24、缀指定其它段。值为段地址,可以用段跨越前缀指定其它段。 目标操作数用目标操作数用DI寻址,隐含寻址,隐含ES为段地址。为段地址。 每次操作对每次操作对SI、DI 调整:调整: 与上述指令基本配合使用前缀有:与上述指令基本配合使用前缀有:(Repeat) (Repeat while equal/zero) (Repeat while not equal/not zero)。下面分二种情况来讨论:下面分二种情况来讨论: 格式:格式:REP 串指令串指令串指令可为:串指令可为:MOVS、STOS、LODS。MOVS(Move String) 串传送串传送LODS(Load from String)
25、从串取指令从串取指令STOS(Store into String) 存入串指令存入串指令(1) MOVS dest,src;(;(ES):():(DI)(DS):():(SI)MOVSB (字节)(字节);(SI)(SI)1,(,(DI)(DI) 1MOVSW (字);(字);(SI)(SI)2,(,(DI)(DI)2 该指令不影响条件码该指令不影响条件码 。 *如:如: MOVS ES:BYTE PTR DI,DS:SI* 单指令不能完成单指令不能完成 ; 归纳在执行归纳在执行MOVS指令时,应该先做好以下准备工作:指令时,应该先做好以下准备工作:(1) 数据段中数据段中(如反向传送到末地址
26、)(如反向传送到末地址)。(2) 附加段中附加段中(或反向传送末地址)(或反向传送末地址)。(3) 。(4) CLD(clear direction flag) 功能:功能:,执行串处理指令时,执行串处理指令时 可以使地址可以使地址。 STD(set direction flag)功能:功能:,执行串处理指令时可以使地址,执行串处理指令时可以使地址LODS src;(字节)(字节)(AL) (DS):(SI), (SI) (SI) 1 (字(字)(AX) (DS):(SI),(SI) (SI)2LODSB (字节)(字节);(AL) (DS):(SI),(SI) (SI) 1LODSW (字)
27、(字) ;(AX) (DS):(SI),(SI) (SI)2功能:该指令把由功能:该指令把由。DF=0,(,(SI) (SI)+1或或+2DF=1,(,(SI) (SI)-1或或-2(1) 指令允许用段跨越前缀来指定非数据段的存储区。指令允许用段跨越前缀来指定非数据段的存储区。(2) 该指令不影响条件码。该指令不影响条件码。一般说来,一般说来,它不与它不与REP联用联用,每重复一次,累加器的内容就改变一次。每重复一次,累加器的内容就改变一次。 (AL)中只能保持最后一个元素。中只能保持最后一个元素。有时有时。(3) 适用于在一个循环中,用基本串操作指令构成复杂串操作适用于在一个循环中,用基本串
28、操作指令构成复杂串操作时很有用。时很有用。 STOS dest;(字节)(字节) (ES):(DI) (AL) , (DI) (DI) 1 (字(字) (ES):(DI) (AX) , (DI) (DI) 2(2) STOSB (字节)(字节); (ES):(DI) (AL) , (DI) (DI) 1(3) STOSW (字)(字) ; (ES):(DI) (AX) , (DI) (DI) 2用途:用途:与与REP联用时,(联用时,(CX)缓冲区长度。用来建立一串相同的值。缓冲区长度。用来建立一串相同的值。例:在附加段例:在附加段STORE开始存开始存5个空格个空格程序:程序: MOV AL
29、,20H ;_ (AL) MOV CX,5 MOV DI,offset STORE CLD REP STOSB ;(ES):(DI) (AL) (DI) (DI)+120H20H20H20H20H20H20H20H20H20H.STORE:STORE:例:内存中有一个首地址为例:内存中有一个首地址为BLOCK。 存放正数的缓冲区首址为存放正数的缓冲区首址为PUOS-DATA, 存放负数的缓冲区首址为存放负数的缓冲区首址为MINUS-DATA。设:设: 源数据块用源数据块用SI寻址,寻址, 正数的目的区用正数的目的区用DI寻址,寻址, 负数的目的区用负数的目的区用BX寻址。寻址。 循环次数循环次
30、数 ( CX )。用用LODS指令把源数据取入(指令把源数据取入(AL)中,)中, 检查其符号,确定正、负,检查其符号,确定正、负,若为正数用若为正数用STOS指令送至正数缓冲区,指令送至正数缓冲区,若是负数,把(若是负数,把(DI)与()与(BX)交换,仍使用)交换,仍使用STOS传送,传送,传送传送 完后再完后再 将(将(DI)与()与(BX)交换,恢复原值。)交换,恢复原值。程序:程序:START: MOV SI,OFFSET BLOCKMOV DI,OFFSET PUOS-DATA ; 正数缓冲区正数缓冲区MOV BX,OFFSET MINUS-DATA ;负数缓冲区;负数缓冲区MOV
31、 CX,COUNT GOON: JNZ MINS ;若负数转;若负数转MINS ;正数;正数 ,(,(DI)(AL),(),(DI)(DI)+1JMP AGAINMINS: XCHG BX,DI ;负数;负数 ,(,(DI)(AL),(),(DI)(DI)+1XCHG BX,DI AGAIN:DEC CX JNZ GOON HLT 格式:格式:REPE(或(或REPZ)string primitive String primitive可为可为 : 1、CMPS(Compare string ) 串比较指令串比较指令 2、SCAS (Scan string ) 串扫描指令,搜索指令串扫描指令,搜
32、索指令 格式:格式:REPNE(或(或REPNZ)string primitive string primitive可为可为 : 1、CMPS(Compare string ) 串比较指令串比较指令 2、SCAS (Scan string ) 串扫描指令,搜索指令串扫描指令,搜索指令 (SI)作为源串地址,(作为源串地址,(DI)目的串地址目的串地址(1) CMPS dest,src;(ES) :(DI) -(DS):(SI),CMPSB (字节)(字节);(SI) (SI)1,(DI)(DI) 1CMPSW (字);(字);(SI) (SI)2,(DI) (DI)2执行操作:执行操作:(ES
33、) :(DI) -(DS):(SI),结果不存,置标志。结果不存,置标志。字节操作:字节操作:(SI) (SI)1,(DI)(DI) 1字操作:字操作:(SI) (SI)2,(DI) (DI)2 学习学习REPZ CMPSB指令指令例:利用例:利用CMPS指令对指令对STRING1和和STRING2二个字符串进行二个字符串进行 比较,相同在比较,相同在RESULT 单元送单元送00H,不同送,不同送0FFH。MOV SI,OFFSET STRING1 MOV DI,OFFSET STRING2 MOV CX,COUNT CLD REPZ CMPSB JNZ UNMAT ;若串不同,在;若串不同
34、,在RESUL单元中置单元中置0FFH MOV AL,0 ;若串相等,在;若串相等,在RESULT单元中置单元中置00H JMP OULPT UNMAT:MOV AL,0FFH (Scan string ) :格式:格式:SCAS dest SCASB(字节);(字节);(AL)-(ES):():(DI),(),(DI)(DI)1 SCASW(字);(字);(AX)-(ES):():(DI),(),(DI) (DI)2 (AL)或()或(AX) - 目的串目的串两数相减,只影响标志,不影响操作数。两数相减,只影响标志,不影响操作数。其它特性与其它特性与MOVS同。同。 例:要搜索的关键字例:要
35、搜索的关键字 放在放在(AL)或或(AX)中,搜索某一数据块或字符串中有无中,搜索某一数据块或字符串中有无关关 键字,键字,;MOV DI,OFFSET BLOCK;设置数据块地址指针;设置数据块地址指针 MOV CX,COUNT ;设置数据块长度;设置数据块长度MOV AL, ; 关键字送入关键字送入AL或或AX ;(;(CX)0,Z=0 继续继续SCASB JZ FOUND MOV DI,0 JMP DONEFOUND:DEC DI DONE: HLT应用举例:应用举例:例:一个数据块由大小写英文字母、数字、其他符号组成,例:一个数据块由大小写英文字母、数字、其他符号组成,用用CR(ASC
36、II码码0DH)结束。数据块首地址为结束。数据块首地址为BLOCK1。将其传送到将其传送到BLOCK2为首地址的内存区,并为首地址的内存区,并。分析:分析:大小写英文字母中相应大小写英文字母中相应ASCII码的关系:码的关系:az相应相应ASCII码为:码为: 61H7AHAZ相应相应ASCII码为:码为:41H5AH程序和流程图如下:程序和流程图如下:程序程序:LEA SI , BLOCK1LEA DI , BLOCK2CLDNEXT: LODSBCMP AL JZ DONECMP AL , JC OKCMP AL , JNC OKOK:JMP NEXTDONE: HLT开始开始初始化,置源地址、目的地址指针初始化,置源地址、目的地址指针清方向标志DF清方向标志DF取一个字符取一个字符回车?回车? z? z?aa转换为大写字母转换为大写字母送存送存结束结束Y YY YN NN NY YN N流程图流程图指令指令重复重复前缀前缀操作数操作数地址指针寄存器地址指针寄存器MOVS源,目标源,目标(DS): (SI) , (ES): (DI)CMPS源,目标源,目标(DS): (SI) ,(ES): (DI)SCAS目标目标(ES): (DI)LODS源源(DS): (SI)STOS目标目标(ES): (DI)