1、第4章 80 x86指令系统 三、逻辑类指令(位操作指令)这一类指令包括逻辑运算指令、移位指令和循环这一类指令包括逻辑运算指令、移位指令和循环移位指令等三组。移位指令等三组。位操作类指令以位操作类指令以二进制位二进制位为基本单位进行数据的为基本单位进行数据的操作操作当需要对字节或字数据中的各个二进制位操作时,当需要对字节或字数据中的各个二进制位操作时,可以考虑采用位操作类指令可以考虑采用位操作类指令注意这些指令对标志位的影响注意这些指令对标志位的影响 逻辑运算指令逻辑运算指令AND OR XOR NOT TEST移位指令移位指令SHL SHR SAR 循环移位指令循环移位指令ROL ROR R
2、CL RCR1第4章 80 x86指令系统 1.1.逻辑运算指令逻辑运算指令逻辑运算类指令与算术运算指令不同逻辑运算类指令与算术运算指令不同算术指令算术指令是按是按字节或字进行算术运算字节或字进行算术运算,而,而逻辑运算指逻辑运算指令是把操作数按位令是把操作数按位来进行逻辑运算。来进行逻辑运算。“与与”运算指令运算指令格式格式:AND dst,src“或或”运算指令运算指令格式:格式:OR dst,src“非非”运算指令运算指令格式:格式:NOT opr“异或异或”运算指令运算指令格式:格式:XOR dst,src测试指令测试指令格式:格式:TEST dst,src说明:说明:TEST相当于相
3、当于AND运算,但是运算,但是不保存结果,仅影响标志。不保存结果,仅影响标志。2第4章 80 x86指令系统 1 逻辑运算指令逻辑运算指令 NOT 目的 ;取反指令 AND 目的,源 ;按位与指令 OR 目的,源 ;按位或指令 XOR 目的,源 ;按位异或指令 TEST 目的,源;测试指令,与AND指令操作相同,只是不改变目的操作数的内容 单操作数逻辑指令NOT不影响标志位,操作数与INC、DEC和NEG一样:3第4章 80 x86指令系统 逻辑与指令AND对两个操作数执行逻辑与运算,结果送目的操作数AND AND dest,srcdest,src;destdestdestdestsrcsrc
4、 只有相只有相“与与”的两位的两位都是都是1,结果才是,结果才是1;否;否则,则,“与与”的结果为的结果为04第4章 80 x86指令系统 逻辑或指令OR对两个操作数执行逻辑或运算,结果送目的操作数OR OR dest,srcdest,src;destdestdestdestsrcsrc只要相只要相“或或”的两位的两位有一位是有一位是1,结果就是,结果就是1;否则,结果为;否则,结果为05第4章 80 x86指令系统 逻辑异或指令XOR对两个操作数执行逻辑异或运算,结果送目的操作数XOR XOR dest,srcdest,src;destdestdestdestsrcsrc只有相只有相“异或异
5、或”的两的两位不相同,结果才是位不相同,结果才是1;否则,结果为否则,结果为06第4章 80 x86指令系统 测试指令TEST 对两个操作数执行逻辑与运算,结果并不送目的操作数,仅按AND指令影响标志TEST TEST dest,srcdest,src;destdestsrcsrc AND与与TEST指令的关系,指令的关系,同同SUB与与CMP指令的关系一样指令的关系一样7第4章 80 x86指令系统 逻辑非指令NOT对一个操作数执行逻辑非运算NOT NOT reg/memreg/mem;reg/memreg/memreg/memreg/mem 按位取反,原来按位取反,原来是是“0”的位变为的
6、位变为“1”;原来是;原来是“1”的位变为的位变为“0”8第4章 80 x86指令系统 例 逻辑运算mov al,75h;AL75Hand al,32h;AL30H;CFOF0,SF0,ZF0,PF1or al,71h;AL71H;CFOF0,SF0,ZF0,PF1xor al,0f1h;AL80H;CFOF0,SF1,ZF0,PF0not al;AL7FH 标志不变9第4章 80 x86指令系统 逻辑运算指令的应用逻辑运算指令的应用and bl,11110110b;BL中中D0和和D3清清0,其余位不变,其余位不变or bl,00001001b;BL中中D0和和D3置置1,其余位不变,其余位
7、不变xor bl,00001001b;BL中中D0和和D3求反,其余位不变求反,其余位不变 AND指令可用于复位某些位(同指令可用于复位某些位(同0相与),不影响其他位相与),不影响其他位 OR指令可用于置位某些位(同指令可用于置位某些位(同1相或),不影响其他位相或),不影响其他位 XOR指令可用于求反某些位(同指令可用于求反某些位(同1相异或),不影响其他位相异或),不影响其他位10第4章 80 x86指令系统 例例4.7 从偏移地址从偏移地址TABLE开始的内存区中,存放着开始的内存区中,存放着100个字节个字节型数据,要求将这些数进行累加,并将累加和的低位存型数据,要求将这些数进行累加
8、,并将累加和的低位存SUM单元,单元,高位存高位存SUM+1单元。程序如下:单元。程序如下:LEA BX,TABLE;(BX)数据表地址指针数据表地址指针 MOV CL,100 ;(CL)数据块长度数据块长度 XOR AX,AX ;清;清AL、AH,并清进位并清进位CFLOOPER:ADD AL,BX ;加一个数到加一个数到AL JNC GOON ;如如(CF)=0,转移到转移到GOON INC AH ;否则,否则,AH加加1 GOON:INC BX ;地址指针加地址指针加1 DEC CL ;计数值减计数值减1 JNZ LOOPER ;如如(CL)0,转移到转移到LOOPER MOV SUM,
9、AX;否则,否则,(SUM)(AL),(SUM+1)(AH)HLT ;停止停止11第4章 80 x86指令系统 常见的用法常见的用法 清进位标志位:清进位标志位:AND AX,AX 或或 OR AL,AL等等 清零操作数:清零操作数:XOR AX,AX 不仅把不仅把AX清清零,而且也影响了状态标志零,而且也影响了状态标志 把某几位取反:用把某几位取反:用XOR指令,把要取反指令,把要取反的位和的位和1异或,不变的位和异或,不变的位和0异或异或 清零或置位某几位:用清零或置位某几位:用AND指令清零,指令清零,用用OR指令置指令置位位12第4章 80 x86指令系统 2 移位指令移位指令 将操作
10、数移动一位或多位,分成逻辑移位和算将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作术移位,分别具有左移或右移操作 移位指令的移位指令的第一个操作数第一个操作数是指定的被移位的操是指定的被移位的操作数,可以是寄存器或存储单元;作数,可以是寄存器或存储单元;后一个操作后一个操作数数表示移位位数:表示移位位数:该操作数该操作数为为1,表示移动一位,表示移动一位 该操作数该操作数为为CL,CL寄存器值表示移位位数寄存器值表示移位位数(移位(移位位数位数大于大于1只能只能CL表示表示)按照移入的位设置进位标志按照移入的位设置进位标志CF,根据移位后根据移位后的结果影响的结果影响SF
11、、ZF、PF13第4章 80 x86指令系统 逻辑左移指令SHL(shift logical left)SHL reg/mem,1/CL;reg/mem左移1或CL位;最低位补0,最高位进入CFSHL和和SAL指令的功能指令的功能演示演示14SHL和SAL指令的功能15第4章 80 x86指令系统 例例4.8 将一个将一个16位无符号数乘以位无符号数乘以10。该数原来存放在以。该数原来存放在以FACTOR为首地址的两个连续的存储单元中为首地址的两个连续的存储单元中(低位在前,高位在低位在前,高位在后后)。因为因为FACTOR 10=(FACTOR 8)+(FACTOR 2),故可用左故可用左移
12、指令实现以上乘法运算。编程如下:移指令实现以上乘法运算。编程如下:MOV AX,FACTOR;(AX)被乘数被乘数SHL AX,1 ;(AX)=FACTOR 2MOV BX,AX ;暂存暂存BXSHL AX,1 ;(AX)=FACTOR 4SHL AX,1 ;(AX)=FACTOR 8ADD AX,BX ;(AX)=FACTOR 10 HLT 以上程序的执行时间大约需以上程序的执行时间大约需26个时钟。如用乘法指令编程,个时钟。如用乘法指令编程,执行时间将超过执行时间将超过130个时钟。个时钟。16第4章 80 x86指令系统 逻辑右移指令SHR(shift logical right)SHR
13、 reg/mem,1/CL;reg/mem右移1/CL位;最高位补0,最低位进入CF17第4章 80 x86指令系统 例例4.9 将一个将一个16位无符号数除以位无符号数除以512。该数原来存放在以。该数原来存放在以DIVIDAND为首地址的两个连续的存储单元中。为首地址的两个连续的存储单元中。因为因为DIVIDAND512=(DIVIDAND2)256,故可用逻辑右故可用逻辑右移指令完成上述除法运算。编程如下:移指令完成上述除法运算。编程如下:MOV AX,DIVIDAND ;(AX)被除数被除数SHR AX,1 ;(AX)=DIVIDAND2XCHG AL,AH ;(AL)(AH),相当于
14、循环右移相当于循环右移8位位CBW ;清;清AX的高的高8位,位,(AX)=DIVIDAND512HLT 当然,也可以将立即数当然,也可以将立即数9传送到传送到CL寄存器,然后用指令寄存器,然后用指令SHR AX,CL完成除以完成除以512的运算。但是相比之下,上面的程序执行的运算。但是相比之下,上面的程序执行速度更快。速度更快。18第4章 80 x86指令系统 算术左移指令算术左移指令SAL(shift arithmetic left)SAL reg/mem,1/CL;与;与SHL是同一条指令是同一条指令19SHL和SAL指令的功能20第4章 80 x86指令系统 算术右移指令SAR(shi
15、ft arithmetic right)SAR reg/mem,1/CL;reg/mem右移1/CL位;最高位不变,最低位进入CF21SAR指令的功能22第4章 80 x86指令系统 3)循环移位指令循环移位指令 8086/8088指令系统有四条循环移位指令,指令系统有四条循环移位指令,不带进位标志不带进位标志CF的左循环移位的左循环移位指令指令ROL和和右循环移位指令右循环移位指令ROR(也称小循环也称小循环),以及,以及带进位标志带进位标志CF的左循环移位指令的左循环移位指令RCL和右循环移位指令和右循环移位指令RCR(也称大循环也称大循环)。循环移位指令的操作数类型与移位指令相同,可以是
16、循环移位指令的操作数类型与移位指令相同,可以是8位或位或16位的寄存器或存储器。指令中指定的左移或右移的位数也可位的寄存器或存储器。指令中指定的左移或右移的位数也可以是以是1或由或由CL寄存器指定,但不能是寄存器指定,但不能是1以外的常数或以外的常数或CL以外的其以外的其他寄存器。他寄存器。所有循环移位指令都只影响进位标志所有循环移位指令都只影响进位标志CF和溢出标志和溢出标志OF,但,但OF标志的含义对于左循环移位指令和右循环移位指令有所不同。标志的含义对于左循环移位指令和右循环移位指令有所不同。23第4章 80 x86指令系统 循环移位指令(rotate)循环移位指令类似移位指令,但要将从
17、一端移出的位返回到另一端形成循环。分为:ROL reg/mem,1/CL;不带进位循环左移ROR reg/mem,1/CL;不带进位循环右移RCL reg/mem,1/CL;带进位循环左移RCR reg/mem,1/CL;带进位循环右移 循环移位指令的操作数形式与移位指令相同,按指令功能设置进位标志CF,但不影响SF、ZF、PF、AF标志演示演示演示演示演示演示演示演示24ROL指令的功能25ROR指令的功能26RCL指令的功能27RCR指令的功能28第4章 80 x86指令系统 (1)循环左移指令循环左移指令ROL(ROtate Left)。指令格式:指令格式:ROL dst,1/CL RO
18、L指令将目的操作数向左循环移动指令将目的操作数向左循环移动1位或移位或移CL寄存器指定寄存器指定的位数。最高位移到进位标志的位数。最高位移到进位标志CF,同时最高位移到最低位形成同时最高位移到最低位形成循环,进位标志循环,进位标志CF不在循环回路之内。不在循环回路之内。ROL指令的操作如图指令的操作如图4.24所示。所示。CFdst图图4.24 ROL指令操作示意图指令操作示意图 29第4章 80 x86指令系统 ROL指令将影响指令将影响CF和和OF两个状态标志位。如果循环移位次两个状态标志位。如果循环移位次数等于,且移位以后目的操作数新的最高位与数等于,且移位以后目的操作数新的最高位与CF
19、不相等,则不相等,则(OF)=1,否则否则(OF)=0。因此,因此,OF的值表示循环移位前后符号位的值表示循环移位前后符号位是否有所变化。如果移位次数不等于,则是否有所变化。如果移位次数不等于,则OF的值不确定。的值不确定。ROL指令的例子如下:指令的例子如下:ROL BH,1;寄存器循环左移寄存器循环左移1位位ROL DX,CL ;寄存器循环左移寄存器循环左移(CL)位位ROL WORD PTR DI,1 ;存储器循环左移存储器循环左移1位位ROL BYTE PTR ALPHA,CL ;存储器循环左移存储器循环左移(CL)位位 30第4章 80 x86指令系统 (2)循环右移指令循环右移指令
20、ROR(ROtate Right)。指令格式:指令格式:ROR dst,1/CL ROR指令将目的操作数向右循环移动指令将目的操作数向右循环移动1位或移位或移CL寄存器指定寄存器指定的位数。最低位移到进位标志的位数。最低位移到进位标志CF,同时最低位移到最高位。该同时最低位移到最高位。该指令的操作如图指令的操作如图4.25表示。表示。ROR指令也将影响状态标志位指令也将影响状态标志位CF和和OF。若循环移位次数等若循环移位次数等于且移位后新的最高位和次高位不等,则于且移位后新的最高位和次高位不等,则(OF)=1,否则否则(OF)=0。若循环移位次数不等于,则若循环移位次数不等于,则OF的值不确
21、定。的值不确定。图图4.25 ROR指令操作示意图指令操作示意图CFdst31第4章 80 x86指令系统 下面是下面是ROR指令的几个例子指令的几个例子:ROR CX,1 ;寄存器循环右移寄存器循环右移1位位 ROR BH,CL ;寄存器循环右移寄存器循环右移(CL)位位ROR BYTE PTR BETA,1 ;存储器循环右移存储器循环右移1位位 ROR WORD PTR ALPHA,CL ;存储器循环右移存储器循环右移(CL)位位 32第4章 80 x86指令系统 (3)带进位循环左移指令带进位循环左移指令RCL(Rotate Left through Carry)。指令格式:指令格式:R
22、CL dst,1/CL RCL指令将目的操作数连同进位标志指令将目的操作数连同进位标志CF一起向左循环移动一起向左循环移动1位位或移或移CL寄存器指定的位数。最高位移入寄存器指定的位数。最高位移入CF,而,而CF移入最低位。移入最低位。该指令的操作如图该指令的操作如图4.26所示。所示。RCL指令对状态标志位的影响与指令对状态标志位的影响与ROL指令相同。指令相同。图图4.26 RCL指令操作示意图指令操作示意图CFdst33第4章 80 x86指令系统 (4)带进位循环右移指令带进位循环右移指令RCR(Rotate Right through Carry)。指令格式:指令格式:RCR dst
23、,1/CL RCR指令将目的操作数与进位标志指令将目的操作数与进位标志CF一起向右循环移动一起向右循环移动1位位或移或移CL寄存器指定的位数。最低位移入进位标志寄存器指定的位数。最低位移入进位标志CF,CF则移则移入最高位。该指令的操作如图入最高位。该指令的操作如图4.27所示。所示。RCR指令对状态标志位指令对状态标志位的影响与的影响与ROR指令相同。指令相同。图图4.27 RCR指令操作示意图指令操作示意图CFdst34第4章 80 x86指令系统 这里介绍的四条循环移位指令与前面讨论过的移位指令有所不这里介绍的四条循环移位指令与前面讨论过的移位指令有所不同,循环移位之后,操作数中原来各位
24、的信息不会丢失,而只是同,循环移位之后,操作数中原来各位的信息不会丢失,而只是移到了操作数中的其他位或进位标志上,必要时还可以恢复。移到了操作数中的其他位或进位标志上,必要时还可以恢复。利用循环移位指令可以对寄存器或存储器中的任一位进行位利用循环移位指令可以对寄存器或存储器中的任一位进行位测试。例如,要求测试测试。例如,要求测试AL寄存器中第寄存器中第5位的状态是位的状态是“0”还是还是“1”,可利用以下指令实现:,可利用以下指令实现:MOV CL,5;(CL)移位次数移位次数ROL AL,CL;(CF)AL的第的第5位位JNC ZERO;若若(CF)=0,转,转ZERO;否则否则ZERO:3
25、5第4章 80 x86指令系统 逻辑移位适用于无符号数,算术移位适用于有符号数。逻辑移位适用于无符号数,算术移位适用于有符号数。逻辑左移和算术左移的机器码完全相同,是助记符的逻辑左移和算术左移的机器码完全相同,是助记符的两种写法。两种写法。ROL循环左移:操作数整体左移,最高位移到循环左移:操作数整体左移,最高位移到CF,最低最低位补原最高位位补原最高位ROR循环右移:操作数整体右移,最低位移到循环右移:操作数整体右移,最低位移到CF,最高最高位补原最低位位补原最低位RCL带进位的循环左移:类似于带进位的循环左移:类似于ROL循环移位,循环移位,CF加入加入到循环圈中。到循环圈中。RCR带进位
26、的循环右移:类似于带进位的循环右移:类似于ROR循环移位,循环移位,CF加入加入到循环圈中。到循环圈中。36第4章 80 x86指令系统 四、串操作指令 串操作指令的特征是对数据块(字符串)进行操串操作指令的特征是对数据块(字符串)进行操作,作,并且其中部分指令可以两个操作数同时是存储器操并且其中部分指令可以两个操作数同时是存储器操作数。作数。MOVSMOVS(Move string)(Move string)串传送串传送CMPSCMPS(Compare string)(Compare string)串比较串比较SCASSCAS(Scan string)(Scan string)串扫描串扫描L
27、ODSLODS(Load from string)(Load from string)从串中取数据从串中取数据STOSSTOS(Store in to string)(Store in to string)存数据到串中存数据到串中37第4章 80 x86指令系统 串操作指令每次执行完成一个字节或一个串操作指令每次执行完成一个字节或一个字的操作。字的操作。通常使用重复前缀,用来完成数据块的操通常使用重复前缀,用来完成数据块的操作。作。重复前缀重复前缀 REP 重复重复 REPE/REPZ 相等相等/为零则重复为零则重复 REPNE/REPNZ 不相等不相等/不为零则重复不为零则重复38第4章 8
28、0 x86指令系统 串操作指令需要指明每次操作的类型:串操作指令需要指明每次操作的类型:B 字节,字节,W字字例如:例如:MOVSB,CMPSW等。等。串操作指令使用串操作指令使用隐含寻址方式隐含寻址方式,源串地址为,源串地址为DS:SI,目的串地址为目的串地址为ES:DI,待处理串的长度放在待处理串的长度放在CX中。中。使用使用DF来表示每次操作以后变址寄存器来表示每次操作以后变址寄存器SI和和DI的变化方向的变化方向CLD;DF=0 SI,DI做增量变化做增量变化 B:+1或或W:+2STD;DF=1 SI,DI做减量变化做减量变化 B:-1或或W:-239第4章 80 x86指令系统 M
29、OVS指令指令(两个操作数同时是存储器操作数两个操作数同时是存储器操作数)MOVSB 或或 MOVSW 以字节或字为单位在存储单元之间传以字节或字为单位在存储单元之间传送数据送数据,可以使用可以使用REP前缀前缀REP MOVS ES:dst_string,seg:src_stringREP MOVSBREP MOVSW(ES):(DI)(DS):(SI)(SI)(SI)1,(DI)(DI)1(字节操作字节操作)(SI)(SI)2,(DI)(DI)2(字操作字操作)其中,其中,DF=0时用时用“”,DF=1时用时用“”第一种格式的一个重要优点第一种格式的一个重要优点是可以对源字符串进行段重设是
30、可以对源字符串进行段重设(但目的字符串的段地址只能在但目的字符串的段地址只能在ES,不可进行段重设不可进行段重设)。在第二种和第三种格式中,串操作指令字符的后面加上一在第二种和第三种格式中,串操作指令字符的后面加上一个字母个字母“B”或或“W”,指出操作对象是字节串或字串。指出操作对象是字节串或字串。40第4章 80 x86指令系统 注意:注意:在在MOVSB、MOVSW这两种指令下,指令后面不允许出这两种指令下,指令后面不允许出现操作数。例如,以下指令都是合法的:现操作数。例如,以下指令都是合法的:REP MOVS DATA2,DATA1;操作数类型应预先定义操作数类型应预先定义 MOVS
31、BUFFER2,ES:BUFFER1 ;源操作数进行段重设源操作数进行段重设REP MOVS WORD PTRDI,SI;用变址寄存器表示操作数用变址寄存器表示操作数REP MOVSB ;字节串传送字节串传送 MOVSW ;字串传送字串传送但以下表示方法是非法的:但以下表示方法是非法的:MOVSB DEST,ES:SRC41第4章 80 x86指令系统 例例4.10 将将数据段中首地址数据段中首地址为为BUFFER1的的200个字节传送到个字节传送到附加数据段附加数据段首地址为首地址为BUFFER2的内存区中。使用字节串传送指的内存区中。使用字节串传送指令的程序段如下:令的程序段如下:LEA
32、SI,BUFFER1;(SI)源串首地址指针源串首地址指针LEA DI,BUFFER2 ;(DI)目的串首地址指针目的串首地址指针MOV CX,200 ;(CX)字节串长度字节串长度CLD ;清方向标志清方向标志DFREP MOVSB ;传送传送200个字节个字节HLT ;停止停止42第4章 80 x86指令系统 LODS指令指令LODSB 或或 LODSW 从内存中取出字节或字到累加器从内存中取出字节或字到累加器AL或或AX可以使用可以使用REP前缀,但意义不大前缀,但意义不大。LODS seg:src_string ;可以段超越可以段超越LODSB;(AL)(DS):(SI)LODSW;(
33、AX)(DS):(SI)(AL)(DS):(SI)或或 (AX)(DS):(SI)(SI)(SI)1(字节操作字节操作)(SI)(SI)2(字操作字操作)其中,当其中,当DF=0时用时用“”,当,当DF=1时用时用“”。43第4章 80 x86指令系统 例例4.11 内存中以内存中以BUFFER为首址的缓冲区内有为首址的缓冲区内有10个非压缩型个非压缩型BCD码形式存放的十进制数,它们的值可能是码形式存放的十进制数,它们的值可能是09中的任意一中的任意一个,将这些十进制数顺序显示在屏幕上。个,将这些十进制数顺序显示在屏幕上。根据题意可编程如下:根据题意可编程如下:LEA SI,BUFFER;(
34、SI)缓冲区首址缓冲区首址 MOV CX,10 ;(CX)字符串长度字符串长度 CLD ;清状态标志位清状态标志位DFGET:LODSB ;取一个取一个BCD码到码到AL ORAL,30H ;BCD码转换为码转换为ASCII码码 MOV AH,02H ;(AH)功能号功能号 MOV DL,AL ;(DL)字符字符 INT 21H ;显示显示 DEC CX ;(CX)(CX)1 JNZ GET ;未完成未完成10个字符则重复个字符则重复 HLT 44第4章 80 x86指令系统 STOS指令指令STOSB 或或 STOSW 从累加器中存字节或字到存从累加器中存字节或字到存储器储器,可以使用可以使
35、用REP前缀前缀 REP STOS ES:dst_string REP STOSB;(ES):(DI)(AL)REP STOSW;(ES):(DI)(AX)(ES):(DI)(AL)或或 (ES):(DI)(AX)(DI)(DI)1(字节操作字节操作)(DI)(DI)2(字操作字操作)其中,当其中,当DF=0时用时用“”,当,当DF=1时用时用“”。STOS指令对状态标志位没有影响。指令若加上重复前指令对状态标志位没有影响。指令若加上重复前缀缀REP,则操作将一直重复进行下去,直到则操作将一直重复进行下去,直到(CX)=0。45第4章 80 x86指令系统 例例4.12 将字符将字符装入以装入
36、以AREA为首址的为首址的100个字节中。个字节中。LEA DI,AREAMOV AX,#MOV CX,50CLDREP STOSWHLT 程序采用了送存程序采用了送存50个字个字(#),也可以采用送存,也可以采用送存100个字个字节节(#)的方法。这两种方法程序执行的结果是相同的,但前者执的方法。这两种方法程序执行的结果是相同的,但前者执行速度要更快一些。行速度要更快一些。46第4章 80 x86指令系统 例例4.13 一个数据块由大写或小写的英文字母、数字和各种其一个数据块由大写或小写的英文字母、数字和各种其他符号组成,其结束符是回车符他符号组成,其结束符是回车符CR(ASCII码为码为0
37、DH),数据块数据块的首地址为的首地址为BLOCK1。将数据块传送到以将数据块传送到以BLOCK2为首地址的为首地址的内存区,并将其中所用的英文小写字母内存区,并将其中所用的英文小写字母(az)转换成相应的大转换成相应的大写字母写字母(AZ),其余不变。其余不变。实现:判断,数据搬家,转换小写字母为大写。实现:判断,数据搬家,转换小写字母为大写。前面已经讨论过英文小写字母与相应的大写字母的前面已经讨论过英文小写字母与相应的大写字母的ASCII码码之间有一定的关系,即只需将小写字母的之间有一定的关系,即只需将小写字母的ASCII码减码减20H,即即可得到相应大写字母的可得到相应大写字母的ASCI
38、I码。程序如下:码。程序如下:47第4章 80 x86指令系统 LEA SI,BLOCK1;(SI)源地址指针源地址指针 LEA DI,BLOCK2;(DI)目标地址指针目标地址指针 CLD ;清方向标志清方向标志DFNEXT:LODSB ;取一个字符到取一个字符到AL CMP AL,0DH ;是否回车符是否回车符 JZ DONE ;是,则转是,则转DONE CMP AL,61H ;否则,是否小于否则,是否小于a JC OK ;C=1,是小于是小于a,则转则转OK CMP AL,7BH ;是否大于是否大于z JNC OK ;C=0,是大于是大于z,则转则转OK SUB AL,20H ;否则,否
39、则,AL减减20HOK:STOSB ;送存送存 JMP NEXT ;转移到转移到NEXTDONE:HLT ;停止停止程序使用回车符控制结束。并没有使用程序使用回车符控制结束。并没有使用CX48第4章 80 x86指令系统 CMPS指令指令CMPSB 或或 CMPSW 以字节或字为单位进行两个存储器操作数以字节或字为单位进行两个存储器操作数的比较,可以使用的比较,可以使用REPE/REPZ前缀,前缀,用源操作数用源操作数-目的操作目的操作数,但并不送目的操作数,数,但并不送目的操作数,与与CMP指令可以比较。指令可以比较。REPE/REPNE CMPS srg:src_string,ES:dst
40、_stringREPE/REPNE CMPSBREPE/REPNE CMPSW(DS):(SI)(ES):(DI)(SI)(SI)1,(DI)(DI)1(字节操作字节操作)(SI)(SI)2,(DI)(DI)2(字操作字操作)CMPS指令与其他指令有所不同,指令中的源操作数在前,而指令与其他指令有所不同,指令中的源操作数在前,而目的操作数在后目的操作数在后49第4章 80 x86指令系统 例例4.14 比较两个字符串,找出其中第一个不相等字符的地址。比较两个字符串,找出其中第一个不相等字符的地址。如果两个字符全部相同,则转到如果两个字符全部相同,则转到ALLMATCH进行处理。这两个进行处理。
41、这两个字符串长度均为字符串长度均为20,首地址分别为,首地址分别为STRING1和和STRING2。LEA SI,STRING1;(SI)字符串字符串1首地址首地址 LEA DI,STRING2;(DI)字符串字符串2首地址首地址 MOV CX,20 ;(CX)字符串长度字符串长度 CLD ;清方向标志清方向标志DF REPE CMPSB ;如相等,重复进行比较如相等,重复进行比较 JCXZ ALLMATCH;若若(CX)=0,跳至跳至ALLMATCH DEC SI ;否则否则(SI)1,修正地址修正地址 DEC DI ;(DI)1,使其指向所要寻找的不等字符使其指向所要寻找的不等字符 HLT
42、 ;停止停止ALLMATCH:MOV SI,0 MOV DI,0 HLT ;停止停止50第4章 80 x86指令系统 SCAS指令指令SCASB 或或 SCASW 在数据串中在数据串中查找查找AL或或AX中的中的内容,可以使用内容,可以使用REPNE/REPNZ前缀前缀。REPE/REPNE SCASES:dst_string REPE/REPNE SCASB REPE/REPNE SCASW (AL)(ES):(DI)或或 (AX)(ES):(DI)(DI)(DI)1(字节操作字节操作)(DI)(DI)2(字操作字操作)字符串的起始地址只能放在字符串的起始地址只能放在(ES:DI)中,不允许
43、中,不允许段超越。段超越。51第4章 80 x86指令系统 例例4.15 在包含在包含100个字符的字符串中寻找第一个回车符个字符的字符串中寻找第一个回车符CR(其其ASCII码为码为0DH),找到后将其地址保留在找到后将其地址保留在(ES:DI)中,中,并在屏幕上显示字符并在屏幕上显示字符 Y。如果字符串中没有回车符,则在屏幕如果字符串中没有回车符,则在屏幕上显示字符上显示字符 N。该字符串的首地址为该字符串的首地址为STRING。LEADI,STRING;(DI)字符串首址字符串首址MOV AL,0DH ;(AL)回车符回车符MOV CX,100 ;(CX)字符串长度字符串长度CLD ;清
44、状态标志位清状态标志位DF REPNE SCASB ;如未找到,重复扫描如未找到,重复扫描 JZ MATCH ;如找到,则转如找到,则转MATCHMOV DL,N ;字符串中无回车,则字符串中无回车,则(DL)NJMP DSPY ;转到转到DSPYMATCH:DECDI ;(DI)(DI)1 MOV DL,Y ;(DL)YDSPY:MOV AH,02H INT 21H ;显示字符显示字符 HLT 52第4章 80 x86指令系统 表表4.6 串操作指令的重复前缀、操作数和地址指针串操作指令的重复前缀、操作数和地址指针 指指 令令 重重 复复 前前 缀缀 操操 作作 数数 地址指针寄存地址指针寄存器器 MOVSREP 目的,源目的,源 ES:DI,DS:SI LODS无无 源源 DS:SI STOSREP 目的目的 ES:DI CMPSREPE/REPNE 源,目的源,目的DS:SI,ES:DI SCASREPE/REPNE 目的目的 ES:DI 53第4章 80 x86指令系统 作业P150 10,1254