第八章-指令系统2014._第1页
第八章-指令系统2014._第2页
第八章-指令系统2014._第3页
第八章-指令系统2014._第4页
第八章-指令系统2014._第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

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

文档简介

1、苗清影80X86微处理器的指令系统三三. .逻辑运算和移位指令逻辑运算和移位指令(一)逻辑运算指令(一)逻辑运算指令(二)移位指令(二)移位指令(三)循环移位指令(三)循环移位指令四四. .串操作指令串操作指令(一)与(一)与REPREP相配合工作的相配合工作的MOVSMOVS、STOSSTOS、LODSLODS指令指令(二)与(二)与REPE/REPZREPE/REPZ和和REPNE/REPNZREPNE/REPNZ联合工作的联合工作的CMPSCMPS和和SCASSCAS指令指令80868086的指令系统的指令系统( (续)续)逻辑运算指令逻辑运算指令1. AND(Logical and )

2、 逻辑逻辑“与与”指令指令2. TEST(Test or non-destructive logical and ) 测试指令测试指令3. OR(Lgical inclusive or ) 逻辑逻辑“或或”指令指令4. XOR(Logical exclusive or) 逻辑逻辑“异或异或”指令指令5. NOT(Logical not ) 逻辑逻辑“非非”指令指令特点:特点:8086可以对可以对8位,或位,或16位操作数执行逻辑操作。位操作数执行逻辑操作。逻辑运算是按位操作,操作数应该是位串而不是数。逻辑运算是按位操作,操作数应该是位串而不是数。逻辑运算和移位指令逻辑运算和移位指令AND (L

3、ogical and) 逻辑逻辑“与与”指令指令格式:格式:AND dest, src ;B/W,(dest)(dest src)src: 立即数、寄存器、存储器。立即数、寄存器、存储器。dest: 寄存器、存储器。寄存器、存储器。执行操作:进行执行操作:进行“与与”运算运算,两,两位中有一位为位中有一位为0(或二位都为(或二位都为0),则结),则结 果果 为为0,否则为,否则为1。操作类型举例:操作类型举例:AND AL, 0FHAND CX, DIAND SI, MEM_NAME 注意:注意:“与与”指令中操作数不能同时为存储器;指令中操作数不能同时为存储器;“与与”指令的用途指令的用途:

4、(1) 清清CF , 自己自己“与与”自己。自己。 操作数不变操作数不变 ,CF=0 例:例:AND AL ; 结果:操作数不变结果:操作数不变 ,CF=0。 (2) 使操作数中若干位保持不变,若干位与使操作数中若干位保持不变,若干位与“1”相与;相与; 而若而若干位置为干位置为“0 “的场合,若干位与的场合,若干位与“0” 相与。相与。例:例: 若(若(AL)=43H AND AL, 0FHAL=? (AL)=03H, (AL)03不变;不变;(AL)47=00H,屏蔽高,屏蔽高4位。位。“与与”指令应用举例:指令应用举例:例例1:将英文小写字母:将英文小写字母ASCII转换成大写。转换成大

5、写。小写英文字母小写英文字母ASCII为:为:az 61H7AH大写英文字母大写英文字母ASCII为:为:AZ 41H5AH程序:程序:MOV AL, zAND AL, 0DFH; (AL)=5AH0110 00010100 00011101 111161H41HDFH应用举例应用举例例例2:判断键盘按下的字符是不是:判断键盘按下的字符是不是Y?MOV AH, 7INT 21H ; 键入无回显,(键入无回显,(AL)=输入键的字符码输入键的字符码AND AL, 0DFHCMP AL, YJE YES YES: 应用举例应用举例格式:格式: TEST dest , src;(;(dest)(sr

6、c)src: 立即数、寄存器、存储器。立即数、寄存器、存储器。dest: 寄存器、存储器。寄存器、存储器。执行操作:二个操作数相与的结果不存,置条件码。执行操作:二个操作数相与的结果不存,置条件码。操作类型举例:操作类型举例:TEST BH, 7 ; 寄存器寄存器 立即数立即数TEST SI , BP ;寄存器;寄存器 寄存器寄存器TEST DI ,TABLEBX ; 寄存器寄存器 存储器存储器2. TEST 测试指令测试指令常常用来检测一些条件是否满足,但又不希望改变原有的操作常常用来检测一些条件是否满足,但又不希望改变原有的操作数的情况下,常在此指令后边加一条数的情况下,常在此指令后边加一

7、条 条件转移指令。条件转移指令。例:判断例:判断A A单元中数据的单元中数据的奇偶性奇偶性,设:(设:(A A )= 0AEH= 0AEH程序:程序:MOV AL,A;(AL)=0AEH TEST AL,01H JZ EVEN ;结果;结果=0为偶数转为偶数转EVEN 奇数处理奇数处理 EVEN:偶数处理:偶数处理 ; 检测(检测(AL)的最低位是否为)的最低位是否为0, 若为若为0转转EVEN用途用途:格式:格式:OR dset, src;(;(dset)(dset) (src)dest: 寄存器、存储器。寄存器、存储器。src: 立即数、寄存器、存储器。立即数、寄存器、存储器。执行操作:进

8、行按位执行操作:进行按位“或或”运算,两位操作数中任一位为运算,两位操作数中任一位为1(或(或都为都为1),则该位(结果),则该位(结果)=1,否则为,否则为0。操作类型举例:操作类型举例:OR BL, 0F6H; OR AH, BL;OR CL, BETABXDI; OR 逻辑逻辑“或或”指令指令(1) 清清CF , 自己与自己自己与自己“或或”,操作数不变,操作数不变,CF=0 例:例: OR AL ;(AL)不变,不变,CF=0(2) 使某个操作数若干位保持不变,若干位与使某个操作数若干位保持不变,若干位与“0”或或 ;而若干位置而若干位置1。若干位与。若干位与“1”或或 。(3) 将两

9、个操作数信息组合。将两个操作数信息组合。 若(若(AL)=03H 用用OR指令组合使(指令组合使(AL)=33H=3 。 OR AL,30H ;(AL) =33H 用途用途格式:格式:XOR dset , src ;B/W(dset) (dset) (src)dest: 寄存器、存储器,寄存器、存储器,src: 立即数、寄存器、存储器。立即数、寄存器、存储器。对指令的两个操作数进行按位对指令的两个操作数进行按位“异或异或”运算。二位不相同时为运算。二位不相同时为1,相同时为,相同时为0。操作类型举例:操作类型举例:XOR DI, 23F6HH ;寄存器;寄存器 立即数立即数XOR SI, DX

10、 ;寄存器;寄存器 寄存器寄存器XOR CL, BUFFER ;寄存器;寄存器 存储器存储器XOR 逻辑逻辑“异或异或”指令指令对某些特定位求反,某些特定位与对某些特定位求反,某些特定位与“1” ,其余位保持不变,其余位保持不变,保持不变与保持不变与“0” 。应用举例:应用举例:例例1: 将(将(AL)中的第中的第1、3、5、7位求反位求反 0、2、4、6位保持不变。位保持不变。MOV AL, 0FHXOR AL, 0AAH用途用途比较三条(比较三条(AX)清清“0”指令:指令: XOR AX, AX ; 清清AX,清,清CF,2个字节,个字节,3个个T。 SUB AX, AX ;清清AX,清

11、,清CF,2个字节,个字节,3个个T。 MOV AX, 0 ;清清AX,不影响标志位,不影响标志位, 3个字节,个字节,4个个T。 XOR清清“0”指令在多字节累加程序中十分有用。指令在多字节累加程序中十分有用。说明说明LEA BX, TABLEMOV CL, 100XOR AX, AXLOOPER:ADD AL, BXJNC GOONINC AHGOON: INC BXDEC CLJNZ LOOPERMOV SUM , AXHLT读程序:读程序:LEA BX , TABLEMOV CL, 100XOR AX, AXLOOPER:ADD AL, BXJNC GOONINC AHGOON: IN

12、C BXDEC CLJNZ LOOPERMOV SUM, AXHLT流流程程图图开始开始初始化,置数据块地址指针初始化,置数据块地址指针置循环次数,清(AL)、(AH)置循环次数,清(AL)、(AH)累加1个字节送(AL)累加1个字节送(AL)有进位?有进位?地址指针1地址指针1循环次数1循环次数1 循环次数0? 循环次数0?结束结束(AH)+1 (AH)(AH)+1 (AH)Y YN NN NY Y100个字节的个字节的16进制数进行累加。进制数进行累加。读程序:读程序:格式:格式: NOT dest ;B/W 指令对操作数按位求反。指令对操作数按位求反。执行操作:执行操作: 字节求反:(字

13、节求反:(dest)0FFH-(dest)字求反:字求反: (dest 0FFFFH-(dest)源操作数:寄存器、存储器。不能是立即数。源操作数:寄存器、存储器。不能是立即数。影响标志位:对标志位无影响。影响标志位:对标志位无影响。操作类型举例:操作类型举例: NOT AHNOT CXNOT1使某些位置使某些位置“0”。 IN AL,61H;(;(AL)= B 设备控制寄存器设备控制寄存器 想使想使D1为为0执行指令:执行指令: AND AL,? 即可。即可。2. 使某些位置使某些位置“1”。 IN AL,61H;(;(AL)= 执行指令:执行指令: OR AL,? 想使想使D1为为“1”应

14、用举例应用举例3. 使某些位求反:使某些位求反:IN AL,61H ;(;(AL)= 0 XOR AL,? 0 0 0 0 0 0 1 0 1 4. 测试某些位(测奇偶性):测试测试某些位(测奇偶性):测试 “奇奇”“”“偶偶”性。性。 应用举例应用举例(1)AND指令用来对指令的指定位清指令用来对指令的指定位清“0”。(2)OR指令常用来对某些位置指令常用来对某些位置1。(3)XOR指令用在程序开头,使某个寄存器清指令用在程序开头,使某个寄存器清“0”。(4)NOT指令对某个数据取反,指令对某个数据取反,+1成补码。成补码。(5)TEST指令用来检测指定位为指令用来检测指定位为1,还是,还是

15、0。逻辑指令应用小结:逻辑指令应用小结:1. 算逻移位指令算逻移位指令(1) SHL/SAL 逻辑左移逻辑左移/算术左移指令算术左移指令(2)SHR 逻辑右移指令逻辑右移指令(3)SAR 算术右移指令算术右移指令2. 循环移位循环移位(1)ROL 不含不含CF循环左移指令循环左移指令(2)ROR 不含不含CF循环右移指令循环右移指令(3)RCL 含含CF循环左移指令循环左移指令(4)RCR 含含CF循环右移指令循环右移指令移位指令移位指令 所有移位指令都可以作所有移位指令都可以作B/W操作。操作。 指令中的指令中的 dest:寄存器、存储器寻址方式。寄存器、存储器寻址方式。 cnt: 表示移位

16、次数表示移位次数 cnt=1,1可写在指令中,不能是可写在指令中,不能是1以外的常数。以外的常数。 cnt1,用,用CL存放移位次数存放移位次数 ,不能是其他寄存器。不能是其他寄存器。 如:如:SAL AX,1 共同点:共同点:算逻移位指令,条件码设置:算逻移位指令,条件码设置:执行多次移位指令后对执行多次移位指令后对CF、OF的影响的影响: CF=从目标操作数移从目标操作数移出的最后一位;出的最后一位;OF不定。不定。执行一次移位指令指令后对执行一次移位指令指令后对CF、OF的影响的影响: OF用于判断移用于判断移位后最高有效位是否发生变化,最高位与位后最高有效位是否发生变化,最高位与CF不

17、等,则:不等,则: OF = 1, 否则:无变化时,否则:无变化时,OF = 0。CF根据各条指令的规定设置。根据各条指令的规定设置。SF、ZF、PF,AF无定义。无定义。循环移位指令:循环移位指令:SF、ZF、PF、AF不影响。不影响。共同点:共同点:1、SHL/SAL逻辑左移逻辑左移/算术左移指令算术左移指令格式:格式: SHL dest, cnt;逻辑左移指令;逻辑左移指令, B/W SAL dest, cnt;算术左移指令;算术左移指令, B/W dest: 寄存器、存储器寻址方式。寄存器、存储器寻址方式。 cnt: 表示移位次数表示移位次数 cnt=1,1可写在指令中。可写在指令中。

18、 cnt1,用,用CL存放移位次数存放移位次数 。 左移指令左移指令1、SHL/SAL执行操作:相当于无符号数的执行操作:相当于无符号数的2功能。功能。 SHL/SAL指令操作示意图如下图所示:指令操作示意图如下图所示:指令格式举例:指令格式举例: SHL AH, 1 SAL SI, CL SAL WORD PTR BX+5, 1 SHL BYTE PTR, CL0CFdestMOV AH, 3FH 0011 1111SAL AH, 1 AH=7EH左移指令左移指令2、SHR 逻辑右移指令逻辑右移指令格式:格式:SHR dest, cnt;逻辑右移指令;逻辑右移指令, B/W执行操作:相当于无

19、符号数的执行操作:相当于无符号数的2功能。功能。 SHR指令操作示意图如下图所示:指令操作示意图如下图所示:dest: 寄存器、存储器寻址方式。寄存器、存储器寻址方式。指令格式举例:指令格式举例:SHR BL, 1SHR AX, CLdestCF0右移指令右移指令3、SAR 算术右移指令算术右移指令格式:格式: SAR dest, cnt;算术右移指令;算术右移指令, B/W执行操作:相当于带符号数的执行操作:相当于带符号数的2功能功能,对负数向下舍入对负数向下舍入 IDIV指令对负数向上舍入。指令对负数向上舍入。 SAR指令操作示意图如下图所示指令操作示意图如下图所示dsetdest: 寄存

20、器、存储器寻址方式。寄存器、存储器寻址方式。指令格式举例:指令格式举例:SAR AL, 1SHR DL, CLCFMOV AL, 88H 1000 1000SAR AL, 1 AL=C4H右移指令右移指令用用SAR指令与用指令与用IDIV指令做除法的区别:指令做除法的区别:用用SAR指令做除法(对负数向下舍入)指令做除法(对负数向下舍入)MOV AX, 81H; (AX) = -127SAR AX, 1; (AX)= - 64用用IDIV指令做除法(指令做除法(IDIV指令对负数向上舍入)指令对负数向上舍入)MOV AX, 81H;(AX)= -127MOV CL, 2IDIV CL;(AL)

21、= -63 ,(AH)= -1右移指令右移指令应用举例:应用举例:(BX)=84F0H (1) 若若(BX)无符号数,求(无符号数,求(BX)/2SHR BX,1; (BX)=4278 CF=0,OF=1,SF=0,ZF=0 (2) 若(若(BX)带符号数,求()带符号数,求(BX)/4 MOV CL,02H 或或SAR BX,1 SAR BX,CL SAR BX,1 ; CF=0,OF无意义,无意义, SF=1,ZF=01 11 11 11 10 00 00 00 00 01 12 23 34 45 56 67 70 00 01 10 00 00 00 01 18 89 9101011111

22、2121313141415150 01 11 11 11 10 00 00 00 01 12 23 34 45 56 67 70 01 10 00 00 00 01 10 08 89 9101011111212131314141515 ROL、ROR 不含不含CF循环移位指令,操作数移动循环移位指令,操作数移动8次后还原。次后还原。 RCL、RCR 含含CF循环移位指令,操作数移动循环移位指令,操作数移动9次后还原。次后还原。 影响标志影响标志OF、CF ROL、 RCL影响标志影响标志OF、CF情况相同情况相同 ; ROR 、RCR影响标志影响标志OF、CF情况相同情况相同 。 SF、ZF、

23、PF、AF不影响。不影响。循环移位指令循环移位指令1、ROL不含不含CF循环左移指令循环左移指令格式:格式: ROL dest, cnt;不含;不含CF循环左移指令循环左移指令, B/W执行操作:执行操作:ROL指令操作示意图如下图所示,移动指令操作示意图如下图所示,移动8次后操次后操作数还原。作数还原。CFdest指令格式举例:指令格式举例:ROL BH, 1ROL DX, CL循环移位指令循环移位指令影响标志影响标志OF、CF 情况:情况: 左循环移动左循环移动1次后:次后: 移位后,最高有效位(符号位)是否发生变化:移位后,最高有效位(符号位)是否发生变化: 如果移位后,最高有效位与如果

24、移位后,最高有效位与CF不等不等 则:则: OF = 1, 否则:(无变化时)否则:(无变化时)OF = 0 CF根据各条指令的规定设置。根据各条指令的规定设置。 左循环移动多次后:左循环移动多次后: OF 值不定。值不定。 CF=从目标操作数移出的最后一位。从目标操作数移出的最后一位。 SF、ZF、PF、AF不影响。不影响。循环移位指令循环移位指令2、ROR 不含不含CF循环右移指令循环右移指令格式:格式: ROR dest, cnt ;不含;不含CF循环右移指令循环右移指令, B/W执行操作:执行操作:ROR指令操作示意图如下图所示指令操作示意图如下图所示 右移右移8次后操作数还原。次后操

25、作数还原。CFdest指令格式举例:指令格式举例:ROR CX , 1ROL BH , CL循环移位指令循环移位指令影响标志影响标志OF、CF 情况:情况: 右循环移动右循环移动1次后:次后: 如果移位后,最高位如果移位后,最高位 次高位,次高位, 则则 : OF=1; 否则否则 : OF=0。 CF根据各条指令的规定设置。根据各条指令的规定设置。 右循环移动多次后:右循环移动多次后:OF 值不定。值不定。 CF=从目标操作数移出的最后一位。从目标操作数移出的最后一位。 SF、ZF、PF、AF不影响。不影响。循环移位指令循环移位指令3、RCL 含含CF循环左移指令循环左移指令格式:格式:RCR

26、 dest, cnt ;含;含CF循环左移指令循环左移指令, B/W执行操作:执行操作:RCL指令操作示意图如下图所示指令操作示意图如下图所示 左移左移9次后操作数还原。次后操作数还原。CFdest指令格式举例:指令格式举例:RCL BX , 1RCL DL , CL影响标志:影响标志:RCL 与与ROL 影响标志影响标志OF、CF情况相同情况相同循环移位指令循环移位指令4、RCR 含含CF循环右移指令循环右移指令格式:格式:RCR dest ,cnt ;含;含CF循环左移指令循环左移指令, B/W执行操作:执行操作:RCR指令操作示意图如下图所示指令操作示意图如下图所示 右移右移9次后操作数

27、还原。次后操作数还原。CFdest指令格式举例:指令格式举例:RCR DI, 1RCR SI , CL影响标志:影响标志:RCR 与与 ROR 影响标志影响标志OF、CF情况相同情况相同循环移位指令循环移位指令37带进位循环左移带进位循环左移移移9次还原次还原带进位循环左移带进位循环左移移移9次还原次还原循环右移(不带循环右移(不带CF) 移移8次还次还原原循环左移(不带循环左移(不带CF) 移移8次还原次还原算术右移算术右移(带符号数(带符号数2)逻辑右移逻辑右移(无(无 符号数符号数2)执行操作执行操作名称名称指令格式指令格式SHL oprd,1CL逻辑左移逻辑左移(无符号数(无符号数*2

28、)0 CF 0 CF SAL oprd,1CL算术左移算术左移CF0 SHR oprd, 1CLCF SAR oprd, 1CLCF ROL oprd,1CLCF ROR oprd, 1CLCF RCL oprd,1 1CL1 CF RCR oprd, 11CL1循环移位指令循环移位指令(Rotate)与移位指令与移位指令(Shift)不同点:不同点:循环移位指令移位后,操作数中原来各数位的信息不会丢失,循环移位指令移位后,操作数中原来各数位的信息不会丢失,这是移动了位置,必要时可以恢复。循环移位指令可以对操这是移动了位置,必要时可以恢复。循环移位指令可以对操作数进行测试。作数进行测试。例:测

29、试例:测试(AL)5 =? 0MOV CL , 3ROL AL , CLJNC ZEROZERO:利用带进位循环移位指令将两个寄存器或存储器单元利用带进位循环移位指令将两个寄存器或存储器单元组合起来一起移位。组合起来一起移位。例:例: 将将DX、AX组合起来构成组合起来构成32位寄存器向左移一位。位寄存器向左移一位。如下图所示:如下图所示:0 015150 01515DXDXAXAX程序:程序: SHL AX , 1 RCL DX , 132位寄存器向左移一位位寄存器向左移一位串操作指令(串操作指令(String manipulation ) “串串”就是内存中一段地址相连的字节或字。就是内存

30、中一段地址相连的字节或字。 串操作串操作对串对串中各项进行操作,也叫数据块操作。中各项进行操作,也叫数据块操作。 8086有有5种基本操作:种基本操作: 1. MOVS(Move string) 串传送指令串传送指令 2. CMPS(Compare string) 串比较指令串比较指令 3. SCAS(Scan string) 串扫描指令串扫描指令 4. LODS(Load from string) 从串取指令从串取指令 5. STOS (Store in to string) 存入串指令存入串指令可以只有源操作数,可以只有目标操作数,可能二者都有。可以只有源操作数,可以只有目标操作数,可能二

31、者都有。 源操作数用源操作数用SI 寻址,隐含寻址,隐含DS值为段地址,可以用段跨越前缀值为段地址,可以用段跨越前缀指定其它段。指定其它段。 目标操作数用目标操作数用DI寻址,隐含寻址,隐含ES为段地址。为段地址。 每次操作对每次操作对SI、DI 调整:调整:DF=1,DI、SI自动自动-1 (字节)或字节)或-2(字);(字);DF=0,DI、SI自动自动+1(字节)或(字节)或+2(字)。(字)。 与上述指令基本配合使用前缀有:与上述指令基本配合使用前缀有: REP(Repeat)重复。)重复。 REPE/REPZ(Repeat while equal/zero) 相等相等/为零则重复。为

32、零则重复。 REPNE/REPNZ(Repeat while not equal/not zero)不相等)不相等/不不为零则重复。为零则重复。指令解释指令解释下面分二种情况来讨论下面分二种情况来讨论1、与、与REP相配合工作的相配合工作的MOVS、STOS、LODS指令指令 REP 重复串操作直到(重复串操作直到(CX)=0为止为止2、 与与REPE/REPZ和和REPNE/REPNZ联合工作的联合工作的CMPS和和SCAS指令指令 REPE/REPZ 当相等当相等/为零时重复串操作为零时重复串操作 REPNE/REPNZ 当不相等当不相等/不为零时重复串操作不为零时重复串操作1、与、与RE

33、P相配合工作的相配合工作的MOVS、STOS、LODS指令,指令,REP 重复串操作直到(重复串操作直到(CX)=0为止为止 格式:格式:REP String Primitive 串指令串指令 String Primitive 可为:可为:MOVS、STOS、LODS。1. MOVS(Move String) 串传送串传送2. LODS (Load from String) 从串取指令从串取指令3. STOS(Store into String)存入串指令)存入串指令 REP 重复串操作执行过程重复串操作执行过程: (1) 当当(CX)= 0,结束,结束REP, 执行执行REP后的下一条指令。

34、后的下一条指令。 (2) 当当(CX)0, (CX) (CX) -1 , (3) 执行执行REP后的串指令,后的串指令, (4) 重复重复(1) (3)。)。REP 执行流程图执行流程图( (C CX)X)=0?=0?Y Y(CX) (CX)-1(CX) (CX)-1执行下一条指令执行下一条指令执行REP后的串执行REP后的串指令指令N NMOVS(Move string)串传送)串传送(1) MOVS dest, src; (ES):DI)(DS): (SI)(2) MOVSB (字节字节); (SI)(SI)1,(DI)(DI) 1(3) MOVSW (字字); (SI)(SI)2,(DI

35、)(DI)2 当方向标志当方向标志 CLD, DF=0时时 用用“+” STD , DF=1时时 用用“-” 该指令不影响条件码该指令不影响条件码 。*如:如: MOVS ES:BYTE PTR DI,DS:SI* MOV单指令不能完成单指令不能完成 存储单元之间的数据传送;存储单元之间的数据传送; MOVS指令就是为解决指令就是为解决 存储单元之间数据传送而设置的。存储单元之间数据传送而设置的。将内存的数据段中以将内存的数据段中以AREA1为首地址的为首地址的100个数据,传送个数据,传送到附加段中的到附加段中的AREA2为首地址的区域。为首地址的区域。写程序写程序应用应用MOV指令编程指令

36、编程 MOV AX,SEG AREA1 MOV DS,AX MOV AX,SEG AREA2 MOV ES,AX MOV SI,OFFSET AREA1;将;将AREA1偏移地址偏移地址SI MOV DI,OFFSET AREA2 MOV CX,100LOOP1:MOV AL,SI; (AL)(DS): (SI) MOV ES:DI,AL;(ES): (DI)(AL) INC SI INC DI DEC CX JNE LOOP1MOVSBMOV SI; OFFSET AREA1MOV DI; OFFSET AREA2MOV CX, 100CLDMOVSBDEC CXJNZ AGAINAGAIN

37、:REP & MOVSBMOV AX,SEG AREA1MOV DS,AX MOV AX,SEG AREA2MOV ES,AX MOV SI,OFFSET AREA1 MOV DI,OFFSET AREA2 MOV CX,100 CLD; DF=0,增址传送,增址传送REP MOVSB归纳在执行归纳在执行MOVS指令时,应该先做好以下准备工作:指令时,应该先做好以下准备工作:(1) 数据段中源串首地址数据段中源串首地址(如反向传送到末地址如反向传送到末地址)存入存入SI寄存器中。寄存器中。(2) 附加段中目的串首地址附加段中目的串首地址(或反向传送末地址或反向传送末地址)存入存入DI寄

38、存器中。寄存器中。(3) 数据串长度存入数据串长度存入CX寄存器。寄存器。(4) 建立方向标志建立方向标志 建立方向标志介绍两条指令:建立方向标志介绍两条指令: CLD(clear direction flag) 功能:功能:DF=0,执行串处理指令时,执行串处理指令时 可以使地址自动可以使地址自动+1或或+2。 STD(set direction flag)功能:功能:DF=1,执行串处理指令时可以使地址自动,执行串处理指令时可以使地址自动-1或或 -2。2. LODS(Load from string) 从串取指令从串取指令(1) LODS src; (字节字节) (AL) (DS):(S

39、I), (SI) (SI) 1 (字字) (AX) (DS):(SI), (SI) (SI)2(2) LODS B (字节字节); (AL) (DS):(SI), (SI) (SI) 1(3) LODS W (字字); (AX) (DS):(SI), (SI) (SI)2功能:该指令把由功能:该指令把由(SI)指定的数据段中某单元内容指定的数据段中某单元内容 (AL)或或 (AX)中。中。DF=0,(SI) (SI)+1或或+2DF=1,(SI) (SI)-1或或-2LODS应用注意应用注意(1) 指令允许用段跨越前缀来指定非数据段的存储区。指令允许用段跨越前缀来指定非数据段的存储区。(2)

40、该指令不影响条件码。该指令不影响条件码。(3) 一般说来,一般说来,它不与它不与REP联用,每重复一次,累加器的内容就改变一次。联用,每重复一次,累加器的内容就改变一次。 (AL)中只能保持最后一个元素。中只能保持最后一个元素。有时缓冲区中的一串字符需要多次取出测试时可用本指令。有时缓冲区中的一串字符需要多次取出测试时可用本指令。适用于在一个循环中,用基本串操作指令构成复杂串操作时适用于在一个循环中,用基本串操作指令构成复杂串操作时很有用。很有用。 STOS 存入串指令存入串指令将将(AL)或或(AX) (ES):(DI),(DI) 1或或2(DI)存入串指令有存入串指令有3种格式:种格式:(

41、1) STOS dest;(字节字节) (ES):(DI) (AL) , (DI) (DI) 1 (字字) (ES):(DI) (AX) , (DI) (DI) 2(2) STOS B (字节字节); (ES):(DI) (AL), (DI) (DI) 1(3) STOS W (字字); (ES):(DI) (AX), (DI) (DI) 2用途:用途:与与REP联用时,联用时,(CX)缓冲区长度。用来建立一串相同的值。缓冲区长度。用来建立一串相同的值。例:在附加段例:在附加段STORE开始存开始存5个空格个空格程序:程序: MOV AL,20H ;_ (AL) MOV CX,5 MOV DI

42、,offset STORE CLD REP STOSB ;(ES):(DI) (AL) (DI) (DI)+120H20H20H20H20H20H20H20H20H20H.STORE:STORE:LODS,STOS指令应用指令应用内存中有一个首地址为内存中有一个首地址为BLOCK补码表示的有符号数的数据补码表示的有符号数的数据块,要求将正、负数分开,分别存于二个缓冲区,存放正数块,要求将正、负数分开,分别存于二个缓冲区,存放正数的缓冲区首址为的缓冲区首址为PUOS-DATA,存放负数的缓冲区首址为,存放负数的缓冲区首址为MINUS-DATA。设:设: 源数据块用源数据块用SI寻址,寻址, 正数

43、的目的区用正数的目的区用DI寻址,寻址, 负数的目的区用负数的目的区用BX寻址,寻址, 循环次数循环次数 ( CX )。用用LODS指令把源数据取入指令把源数据取入(AL)中中,检查,检查其符号,确定正、其符号,确定正、负负,若,若为正数用为正数用STOS指令送至正数缓冲区指令送至正数缓冲区,若是,若是负数,负数,把把(DI)与与(BX)交换,仍使用交换,仍使用STOS传送传送,传送,传送 完后再完后再 将将(DI)与与(BX)交换,恢复原值。交换,恢复原值。程序程序: START:MOV SI,OFFSET BLOCKMOV DI,OFFSET PUOS-DATA ; 正数缓冲区正数缓冲区M

44、OV BX,OFFSET MINUS-DATA; 负数缓冲区负数缓冲区MOV CX,COUNT CLDGOON: LODS B TEST AL,80H JNZ MINS ;若负数转若负数转MINS STOS B ;正数,正数,(DI)(AL)),),(DI)(DI)+1JMP AGAINMINS: XCHG BX,DI STOSB ;负数,负数,(DI)(AL),(DI)(DI)+1XCHG BX,DI AGAIN: DEC CX JNZ,GOON HLT与与REPE/REPZ和和REPNE/REPNZ联联合工作的合工作的CMPS和和SCAS指令指令REPE/REPZ ;当相等;当相等/为零时

45、重复串操作为零时重复串操作格式:格式:REPE(或(或REPZ)string primitive;当相等重复;当相等重复前缀前缀REPZ,String primitive可为可为: CM PS , SCAS 1、CM PS (Compare string) 串比较指令串比较指令 2、SCAS (Scan string) 串扫描指令,搜索指令串扫描指令,搜索指令执行过程:执行过程:(1) 当当(CX)= 0,结束,结束REPZ, 执行执行REPZ下一条指令;下一条指令;(2) 当当(CX)0,将,将CX 的内容减的内容减1,执行执行REPZ后的串指令;后的串指令;(3) 当当ZF = 1,返回,

46、返回 (1) ;(4) 当当ZF1,则结束,则结束REPZ 执行执行REPZ下一条指令。下一条指令。注意:注意: (CX)减减1操作不影响标志操作不影响标志 ZF标志由串操作决定标志由串操作决定 当当 (CX) = 0或或ZF=0时退出循环时退出循环REPZ执行流程执行流程( (C CX)X)=0?=0?Y Y(CX) (CX)-1(CX) (CX)-1执行下一条指令执行下一条指令执行REZ后的串执行REZ后的串指令指令N NZF=1?ZF=1?N NY YREPNE/REPNZ 当不相等当不相等/不为零时不为零时重复串操作重复串操作格式:格式:REPNE(或(或REPNZ)string pr

47、imitive;当不相等重;当不相等重复前缀复前缀REPNZ,String primitive可为可为: CMPS, SCAS1、CM PS (Compare string) 串比较指令串比较指令 2、SCAS (Scan string) 串扫描指令,搜索指令串扫描指令,搜索指令执行过程:执行过程:(1) 当当(CX )= 0,结束结束REPNZ, 执行执行REPNZ下一条指令。下一条指令。(2) 当当(CX)0,将,将CX 的内容减的内容减1, 执行执行REPNZ后的串指令。后的串指令。 当当ZF = 0,返回返回(1); 当当ZF0,则结束则结束REPNZ, (4) 执行执行REPNZ下一

48、条指令。下一条指令。注意:注意: (CX)减减1操作不影响标志操作不影响标志 ZF标志由串操作决定标志由串操作决定 当当 (CX) = 0或或ZF=1时退出循环时退出循环REPNZ执行流程执行流程( (C CX)X)=0?=0?Y Y(CX) (CX)-1(CX) (CX)-1执行下一条指令执行下一条指令执行RENZ后的串执行RENZ后的串指令指令N NZF=0?ZF=0?N NY Y1.CMPS(Compare string) 串比较指令串比较指令 (SI) 作为源串地址,作为源串地址,(DI) - 目的串地址目的串地址(1) CMPS dest,src;(ES):(DI) - (DS):(

49、SI), 结果不存,置标志结果不存,置标志(2) CMPS B (字节字节); (SI) (SI)1,(DI)(DI) 1(3) CMPS W (字字);(SI) (SI)2,(DI) (DI)2执行操作:执行操作:(ES): (DI) - (DS): (SI), 结果不存,置标志。结果不存,置标志。字节操作字节操作: (SI) (SI)1,(DI)(DI) 1字操作字操作: (SI) (SI)2,(DI) (DI)2注意注意: 两数相减,只影响标志,不影响操作数。其它操作规定与两数相减,只影响标志,不影响操作数。其它操作规定与MOVS同。同。利用利用CMPS指令对指令对STRING1和和ST

50、RING2二个字符串进行二个字符串进行比较,相同在比较,相同在RESULT 单元送单元送00H,不同送,不同送0FFH。写程序写程序例:利用例:利用CMPS指令对指令对STRING1和和STRING2二个字符串进行二个字符串进行 比较,相同在比较,相同在RESULT 单元送单元送00H,不同送,不同送0FFH。MOV SI,OFFSET STRING1 MOV DI,OFFSET STRING2 MOV CX,COUNT CLD REPZ CMPSB JNZ UNMAT ;若串不同,在;若串不同,在RESUL单元中置单元中置0FFH MOV AL,0 ;若串相等,在;若串相等,在RESULT单元中置单元中置00H JMP OULPT UNMAT:MOV AL,0FFH OUTPT:MOV RESULT,AL HLTSCAS (Scan string) 串扫描指令,搜索指令串扫描指令

温馨提示

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

评论

0/150

提交评论