1、13.3 IBM PC机的指令系统机的指令系统l 数据传送数据传送指令指令l 算术算术指令指令l 逻辑逻辑指令指令l 串处理串处理指令指令l 控制转移控制转移指令指令l 处理机控制处理机控制指令指令注意:注意:1.指令的指令的基本功能基本功能 2.指令的执行指令的执行对标志位的影响对标志位的影响 3.对对寻址方式或寄存器使用的限制和隐含使用寻址方式或寄存器使用的限制和隐含使用学习方法:学习方法:1.理解而不是死记理解而不是死记 2.读程序,上机调试读程序,上机调试要求:要求:熟悉熟悉debug的使用的使用2MOV、PUSH、POP、PUSHA/PUSHAD、POPA/POPAD、XCHGIN、
2、OUT、XLATLEA、LDS、LESLAHF、SAHF、PUSHF、POPF CBW、CWD、CWDE、CDQ、BSWAP 3 通用数据传送指令通用数据传送指令 传送指令传送指令:MOV DST,SRC 执行操作:执行操作:(DST)(SRC)符号扩展符号扩展传送指令传送指令:MOVSX DST(16/32),SRC(8/16)执行操作:执行操作:(DST)符号扩展符号扩展(SRC)零扩展零扩展传送指令传送指令:MOVZX DST(16/32),SRC(8/16)执行操作:执行操作:(DST)零扩展零扩展(SRC)注意注意:*不影响标志位不影响标志位 *DST不能是不能是CS或或立即数立即数
3、 *DST、SRC不同时为段寄存器不同时为段寄存器 MOV DS,ES *DST、SRC不同时为存储不同时为存储单元单元 MOV VAR1,X *立即数立即数不能直接送不能直接送段寄存器段寄存器 MOV DS,2000HMOV指令传送功能指令传送功能立即数立即数段寄存器段寄存器CS DS ES SSCS DS ES SS通用寄存器通用寄存器AX BX CX DXAX BX CX DXBP SP SI DIBP SP SI DI存存储储器器MOV DS,AXMOV CS,AXMOV CH,4050HMOV DL,5BHMOV DX,5BHMOV DX,ALMOV VA1,VA2MOV 45,DL
4、 目的操作数不允许是目的操作数不允许是CSCS寄存器寄存器 数据类型不匹配数据类型不匹配 数据类型不匹配数据类型不匹配不允许两个操作数都是存储单元不允许两个操作数都是存储单元目的操作数不允许是立即数目的操作数不允许是立即数例:判断下列指令是否合法?例:判断下列指令是否合法?堆栈:堆栈:“先进后出先进后出”的存储区,存在于堆栈段中,的存储区,存在于堆栈段中,SP在任何时候都在任何时候都指向栈顶。堆栈常用来临时存放数据、传递参数、保存和恢复指向栈顶。堆栈常用来临时存放数据、传递参数、保存和恢复寄存器。寄存器。PUSH操作使栈顶向低地址方向移动,操作使栈顶向低地址方向移动,POP则相反。则相反。语语
5、法格式:法格式:PUSH reg16/seg/mem16/reg32/mem32PUSH data ;286新增新增 功功能描述:能描述:将指定的字数据压入栈顶将指定的字数据压入栈顶 7例:例:假设假设(AX)=2107 H,执行执行 PUSH AX(SP)低地址低地址高地址高地址(SP)07H 21H低地址低地址高地址高地址进栈方向进栈方向*PUSH AX 执行前执行前PUSH AX 执行后执行后演示 语语法格式:法格式:POP reg16/seg/mem16/reg32/mem32 ;操操作数不能是作数不能是CS 功功能描述:能描述:将栈顶字数据弹出堆栈将栈顶字数据弹出堆栈注意注意:*不影
6、响标志位不影响标志位 *堆栈操作必须以堆栈操作必须以字字或或双字双字为单位。为单位。9例:例:POP BX(SP)低地址低地址高地址高地址(SP)07H 21H低地址低地址高地址高地址出栈方向出栈方向07H21H (BX)=2107H POP BX 执行前执行前 POP BX 执行后执行后*演示10PUSHA将将 AX,CX,DX,BX,指令执行前的指令执行前的SP,BP,SI,和和 DI依次压入堆栈。依次压入堆栈。POPA从堆栈依次弹出从堆栈依次弹出 DI,SI,BP,SP,BX,DX,CX,和和 AX 寄存寄存器。器。PUSHAD/POPAD 将将PUSHA/POPA中的中的reg16换为
7、换为reg32,其余不变。,其余不变。交换指令交换指令:XCHG OPR1,OPR2 执执行操作:行操作:(OPR1)(OPR2)例:例:XCHG BX,BP+SI XCHG AL,BH 注意注意:*不影响标志位不影响标志位 *不允许使用段寄存器不允许使用段寄存器11 累加器专用传送指令累加器专用传送指令 输入指令输入指令:IN AC,PORT (I/O CPU)长格式长格式:IN AL/AX/EAX,PORT:(AL)(PORT)(字节字节)(AX)(PORT+1,PORT)(字字)(EAX)(PORT+3,PORT+2,PORT+1,PORT)(双字双字)短格式短格式:IN AL/AX/E
8、AX,DX:(AL)(DX)(字节字节)(AX)(DX)+1,(DX)(字字)(EAX)(DX)+3,(DX)+2,(DX)+1,(DX)(双字双字)12 输出指令输出指令:OUT PORT,AC (CPU I/O)长格式长格式:OUT PORT,AL/AX/EAX:(PORT)(AL)(字节字节)(PORT+1,PORT)(AX)(字字)(PORT+3,PORT+2,PORT+1,PORT)(EAX)(双字双字)短短格式:格式:OUT DX,AL/AX/EAX:(DX)(AL)(字节字节)(DX)+1,(DX)(AX)(字字)(DX)+3,(DX)+2,(DX)+1,(DX)(EAX)(双字
9、双字)13例:例:IN AX,28H ;MOV DX,28H ;IN AX,DX例:例:MOV DX,3FCH 例:例:OUT 5,AL OUT DX,AX例例:测试某状态寄存器(端口号测试某状态寄存器(端口号27H)的第)的第2位是否为位是否为1 IN AL,27H TEST AL,00000100B JNZ ERROR ;若若第第2位为位为1,转到,转到ERROR处理处理注意注意:*不影响标志位不影响标志位 *前前256个端口号个端口号00HFFH可直接在指令中指定可直接在指令中指定(长格式)长格式)*如果如果端口号端口号 256,端口号,端口号 DX(短格式)(短格式)14 换码指令换码
10、指令:XLAT (AL)(E)BX)+(AL)例例:MOV BX,OFFSET TABLE ;(BX)=0040H MOV AL,3 XLAT 指指令执行后令执行后(AL)=33H33 H 0046H30 H 0043H31 H 0044H32 H 0045H TABLE(DS)=F000H注意注意:*不影响标志位不影响标志位 *字节表格字节表格(长度不超过长度不超过256)*首地址首地址(BX)需转换代码需转换代码 (AL)(AL)=3(BX)15 地址传送指令地址传送指令 有效地址有效地址送送寄存器寄存器指令指令:LEA REG,SRC 指针指针送送寄存器寄存器和和段寄存器段寄存器指令指令
11、:LDS/LES REG,SRC LSS/LFS/LGS REG,SRC ;386及后继机型及后继机型 例:例:LDS REG,SRC 功能:存储器功能:存储器4个或个或6个相继字节送寄存器、个相继字节送寄存器、DS注意注意:*不影响标志位不影响标志位 *REG不能是不能是段寄存器,段寄存器,SRC必须为必须为存储器寻址方式存储器寻址方式16例:例:LEA BX,BX+SI+0F62H 例:例:LDS SI,10H例:例:LES DI,BXMOV BX,TABLEMOV BX,OFFSET TABLELEA BX,TABLELDS BX,TABLELES BX,TABLE ;(BX)=0040
12、H;(BX)=1000H;(BX)=1000H;(BX)=0040H;(BX)=0040H;(ES)=3000H;(DS)=3000H 00 H 40 H 00 H 30 H TABLE(DS):1000H 例:例:17 标志寄存器传送指令标志寄存器传送指令 标志送标志送AH指令指令:LAHF AH送标志寄存器送标志寄存器指令指令:SAHF 标志进栈标志进栈指令指令:PUSHF 标志出栈标志出栈指令指令:POPF 注意注意:*SAHF和和POPF影响标志位影响标志位 *无操作数无操作数 18注意注意:*不影响标志位不影响标志位 *无操作数无操作数指令指令 *隐含对隐含对AL 或或 AX 进行符
13、号扩展进行符号扩展类型转换指令类型转换指令CBW (8位位扩展到扩展到16位位)CWD (16位位扩展到扩展到32位位)CWDE (16位位扩展到扩展到32位位)CDQ (32位位扩展到扩展到64位位)19例:例:(EAX)=0A234B678H CBW CWD CWDE CDQ BSWAP EAX ;(AX)=0078H;(DX)=0FFFFH (AX)=0B678H;(EAX)=0FFFFB678H;(EDX)=0FFFFFFFFH;(EAX)=0A234B678H;(EAX)=12345678H (EAX)=78563412H203.3.2 算术指令算术指令 加法指令加法指令 ADD、A
14、DC、INC、XADD 减法指令减法指令 SUB,SBB,DEC,NEG,CMP 乘法指令乘法指令 MUL,IMUL 除法指令除法指令 DIV,IDIV 十进制调整指令十进制调整指令 DAA,DAS,AAA,AAS,AAM,AAD21 加法指令加法指令 加法加法指令:指令:ADD DST,SRC 带进位加法带进位加法指令:指令:ADC DST,SRC CF 加加1指令:指令:INC OPR 交换并相加交换并相加指令指令:XADD DST,SRC ;486及后继机型及后继机型注意注意:*影响标志影响标志AF,CF,OF,PF,SF,ZF (INC指令指令不影响不影响CF标志标志)。*操作数可以是
15、操作数可以是8位、位、16位或位或32位。位。主要与主要与ADDADD配配合,实现多精合,实现多精度加法运算度加法运算22CF 表示表示无符号数无符号数相加相加的溢出。的溢出。OF 表示表示带符号数带符号数相加相加的溢出。的溢出。1 结果为结果为负负0 否则否则SF=1 结果为结果为00 否则否则ZF=1 和的和的最高有效位最高有效位有向高位的进位有向高位的进位0 否则否则CF=1 两个操作数符号相同,而结果符号与之相反两个操作数符号相同,而结果符号与之相反0 否则否则OF=加法加法指令对指令对条件标志位条件标志位(CF/OF/ZF/SF)的影响)的影响23无符号数溢出无符号数溢出 0 0 0
16、 0 0 1 1 1 +1 1 1 1 1 0 1 1 0 0 0 0 0 0 1 0 (+7)+(-5)=+2 OF=0 7+251=2 CF=1 带符号数和无符号数都不溢出带符号数和无符号数都不溢出 0 0 0 0 0 1 0 0 +0 0 0 0 1 0 1 1 0 0 0 0 1 1 1 1 (+4)+(+11)=+15 OF=0 4+11=15 CF=0带符号数溢出带符号数溢出 0 0 0 0 1 0 0 1 +0 1 1 1 1 1 0 0 1 0 0 0 0 1 0 1 (+9)+(+124)=-123 OF=1 9+124=133 CF=0 带符号数和无符号数都溢出带符号数和无
17、符号数都溢出 1 0 0 0 0 1 1 1 +1 1 1 1 0 1 0 1 0 1 1 1 1 1 0 0 (-121)+(-11)=+124 OF=1 135+245=124 CF=1n=8bit 带符号数带符号数(-128127)无符号数无符号数(0255)带:带:无:无:带:带:无:无:带:带:无:无:带:带:无:无:24例:双精度数例:双精度数(32位字位字)的加法的加法 (DX)=0002H (AX)=0F365H (BX)=0005H (CX)=0E024H 指令序列指令序列 (1)ADD AX,CX (2)ADC DX,BX(1)执行后,(执行后,(AX)=0D389H CF
18、=1 OF=0 SF=1 ZF=0 (2)执行后,(执行后,(DX)=0008H CF=0 OF=0 SF=0 ZF=025 减法指令减法指令注意注意:*除除DEC指令指令不影响不影响 CF 标志外,标志外,均均对条件标志位对条件标志位有有影响影响。减法指令:减法指令:SUB DST,SRC 执行操作:执行操作:(DST)(DST)-(SRC)带借位减法指令带借位减法指令:SBB DST,SRC 执行操作:执行操作:(DST)(DST)-(SRC)CF 减减1指令:指令:DEC OPR 执行操作:执行操作:(OPR)(OPR)1 求补指令:求补指令:NEG OPR 执行操作:执行操作:(OPR
19、)(OPR)也可以也可以:(OPR)0FFFFH-(OPR)+1主要与主要与SBBSBB配配合,实现多精合,实现多精度减法运算度减法运算 减法指令减法指令 比较指令:比较指令:CMP OPR1,OPR2 执行操作:执行操作:(OPR1)-(OPR2)比较并交换指令:比较并交换指令:CMPXCHG DST,SRC ;486新增执行操作执行操作:累加器累加器AC与与DST相比较相比较 IF(AC)=(DST)ZF1,(DST)(SRC);ELSE ZF0,(AC)(DST);比较并交换比较并交换8字节指令:字节指令:CMPXCHG8B m64 ;Pentium执行操作执行操作:IF(EDX:EAX
20、)=(m64)ZF1,(m64)(ECX:EBX);ELSE ZF0,(EDX:EAX)(m64);注意注意:*均对条件标志位均对条件标志位有影响有影响。CMP指令指令执行后,通过相关执行后,通过相关标志位标志位的值就可以的值就可以看出比较的结果。看出比较的结果。如如:CMP AX,BX 条件条件(AX)-(BX)转移指令转移指令 标志位标志位 等于等于0 JZ(JE)OPR ZF=1 不等于不等于0 JNZ(JNE)OPR ZF=0 有借位有借位 JB(JNAE,JC)OPR CF=1 无借位无借位 JNB(JAE,JNC)OPR CF=0 有借位或结果为有借位或结果为0 JBE(JNA)O
21、PR CF ZF=1 无借位无借位,结果非结果非0 JNBE(JA)OPR CF ZF=0 关系关系(AX)(BX)(AX)(BX)(AX)(BX)(AX)(BX)(AX)(BX)(AX)(BX)无符号数无符号数比较比较带符号数带符号数的比较的比较 条件条件(AX)-(BX)转移指令转移指令 标志位标志位 等于等于0 JZ(JE)OPR ZF=1 不等于不等于0 JNZ(JE)OPR ZF=0 JL(JNGE)OPR SF OF=1 JNL(JGE)OPR SF OF=0 JLE(JNG)OPR (SF OF)ZF=1 JNLE(JG)OPR (SF OF)ZF=0 关系关系(AX)(BX)(
22、AX)(BX)(AX)(BX)(AX)(BX)(AX)(BX)(AX)(BX)1)(AX),(BX)符号相同时符号相同时:+,+-,-(关系不定关系不定)不会溢出不会溢出:OF=0;当当 (AX)(BX),一定为负一定为负:SF=1;(AX)(BX),一定非负一定非负:SF=0;2)(AX),(BX)符号不同时符号不同时:-,+(小于小于);+,-(大于大于)可能溢出可能溢出 前前-后后+时:若时:若OF=0,则,则SF=1;若若 OF=1,则,则 SF=0;前前+后后-时:若时:若OF=0,则则SF=0;若若 OF=1,则,则 SF=1;(AX)(BX)SF,OF 不同不同 SF OF=1(
23、AX)(BX)SF,OF 相同相同 SF OF=030减法减法指令对指令对条件标志位条件标志位(CF/OF/ZF/SF)的影响:)的影响:CF 表示表示无符号数无符号数减法减法的溢出。的溢出。1)被减数)被减数 减数减数 差为负数差为负数 超出无符号数表示超出无符号数表示范围范围 2)(OPR1)-(OPR2)=(OPR1)+(-OPR2)(OPR1)-(OPR2)补补=(OPR1)补补+(-OPR2)补补 =(OPR1)+0FFH-(OPR2)+1,因因(OPR1)(OPR2)不不会产生会产生进位进位OF 表示表示带符号数带符号数减法减法的溢出。的溢出。1 被减数的最高有效位有向高位的借位被
24、减数的最高有效位有向高位的借位0 否则否则CF=1 两个操作数符号相反,而结果的符号与减数相同两个操作数符号相反,而结果的符号与减数相同0 否则否则OF=1 减法转换为加法运算时无进位减法转换为加法运算时无进位0 否则否则CF=NEG指令对指令对CF/OF的影响:的影响:CF:操作数为:操作数为0时,求补的结果使时,求补的结果使CF=0,否则,否则CF=1。OF:字节运算对:字节运算对80H求补、字运算对求补、字运算对8000H求补或双字求补或双字 运算对运算对80000000H求补时求补时OF=1,否则,否则OF=0。理解:理解:NEG OPR 求补指令求补指令 执行:执行:(OPR)(OP
25、R)或或 (OPR)0FFFFH-(OPR)+1 即:即:0 (OPR)操作数按位取反,末位加一操作数按位取反,末位加一 1)无符号数:)无符号数:n=8 bit 范围范围:0 255 只有只有(OPR)=0时时 0 (OPR)不会产生借位不会产生借位 2)带符号数:)带符号数:n=8 bit 范围范围:-128 +127 只有只有(OPR)=-128 (OPR)=+128 超出范围超出范围 会溢出会溢出32例:例:x、y、z均为均为8字节字,分别存放在地址为字节字,分别存放在地址为X,X+4;Y,Y+4;Z,Z+4的存储单元中,用指令序列实现的存储单元中,用指令序列实现 w x+y+24-z
26、,并用,并用W,W+4单元存放单元存放w。MOV EAX,X MOV EDX,X+4 ADD EAX,Y ADC EDX,Y+4 ;x+y ADD EAX,24 ADC EDX,0 ;x+y+24 SUB EAX,Z SBB EDX,Z+4 ;x+y+24-z MOV W,EAX MOV W+4,EDX ;结果存入结果存入W,W+2单元单元33 乘法指令乘法指令 无无符号数乘法指令:符号数乘法指令:MUL SRC 用法:用法:IMUL r/m(8|16|32)执行操作:执行操作:字节字节操作数操作数 (AX)(AL)*(SRC)字字操作数操作数 (DX,AX)(AX)*(SRC)双双字字操作数
27、操作数 (EDX,EAX)(EAX)*(SRC)有有符号数乘法指令:符号数乘法指令:IMUL SRC 用法:用法:IMUL r/m(8|16|32)注意注意:*SRC不能为立即数不能为立即数。*隐含的乘数隐含的乘数/积寄存器。积寄存器。*除除CF和和OF外,对条件标志位外,对条件标志位无定义无定义。对标志对标志无定无定义义:指指令执行后这些令执行后这些标志不标志不可预测可预测(就是谁也不知道是(就是谁也不知道是0 0还是还是1 1)对对标志标志无影响无影响:指指令执行不改变标志状态令执行不改变标志状态34乘法指令乘法指令对对CF/OF的影响:的影响:00 乘积的高一半为零乘积的高一半为零11
28、否则否则MUL指令指令:CF/OF=例:例:(AX)=16A5H,(BX)=0611H (1)MUL BX ;16A5*0611=0089 5EF5 ;(DX)=0089H (AX)=5EF5H CF=OF=1 (2)IMUL BL ;A5*11 5B*11=060B F9F5H ;(AX)=0F9F5H CF=OF=1 00 乘积的高一半是低一半的符号扩展乘积的高一半是低一半的符号扩展11 否则否则 IMUL指令指令:CF/OF=检查乘积是检查乘积是字节字节/字字/双双字。而不字。而不再表示溢出。再表示溢出。判断乘积的高判断乘积的高一半是否具有一半是否具有有效数值。有效数值。;(DX,AX)
29、(AX)*(BX);(AX)(AL)*(BL)为什么在乘法指令中为什么在乘法指令中cfcf和和ofof不再表示溢出不再表示溢出分分析:析:以字节操作为例,以字节操作为例,(AX)(AL)*(SRC)。AL是是8位寄存器,位寄存器,(AL)281255,SRC也是字节数据,也是字节数据,(SRC)281255,(AL)*(SRC)(281)*(281)=21629+1,而乘法运算的结果是存放在而乘法运算的结果是存放在16位寄存器位寄存器AX中,中,(AX)2161 而而 21629+1 2161显然。即使最大值显然。即使最大值(AL)和和(SRC)存放的最大值参与运算,存放的最大值参与运算,也不
30、会产生溢出,其他的数据参与运算也不会产生溢出了。也不会产生溢出,其他的数据参与运算也不会产生溢出了。因此,在乘法指令中因此,在乘法指令中cf和和of不再表示溢出。不再表示溢出。36 除法指令除法指令 无无符号数符号数除法指令:除法指令:DIV SRC 执行操作:执行操作:字节字节操作操作 (AL)(AX)/(SRC)的的商商 (AH)(AX)/(SRC)的的余数余数 字操作字操作 (AX)(DX,AX)/(SRC)的的商商 (DX)(DX,AX)/(SRC)的的余数余数 带带符号数符号数除法指令:除法指令:IDIV SRC注意注意:*AX(DX,AX)为隐含的被除数寄存器。为隐含的被除数寄存器
31、。*AL(AX)为隐含的商寄存器。为隐含的商寄存器。*AH(DX)为隐含的余数寄存器。为隐含的余数寄存器。*SRC不能为立即数。不能为立即数。*对所有条件标志位均对所有条件标志位均无定义无定义,但会产生但会产生结果溢出结果溢出。除法错中断除法错中断 当被除数远大于除数时,所得的商就有可能超出它所能表当被除数远大于除数时,所得的商就有可能超出它所能表达的范围达的范围。如果存放商的寄存器。如果存放商的寄存器AL/AX不能表达,便产生不能表达,便产生溢出,溢出,8086CPU中就产生编号为中就产生编号为0的内部中断的内部中断除法错中除法错中断断。对对DIV指令,除数为指令,除数为0,或者在字节除时商
32、超过,或者在字节除时商超过8位,或者位,或者在字除时商超过在字除时商超过16位;位;对对IDIV指令,除数为指令,除数为0,或者在字节除时商不在,或者在字节除时商不在-128127范围内,或者在字除时商不在范围内,或者在字除时商不在-3276832767范围内。范围内。38例:例:x,y,z,v均为均为16位带符号数,计算位带符号数,计算(v-(x*y+z-540)/x MOV AX,X IMUL Y;x*y MOV CX,AX;保存保存x*y的低字的低字 MOV BX,DX;保存保存x*y的高字的高字 MOV AX,Z CWD ADD CX,AX ADC BX,DX ;x*y+z SUB C
33、X,540 SBB BX,0 ;x*y+z-540 MOV AX,V CWD SUB AX,CX SBB DX,BX ;v-(x*y+z-540)IDIV X ;(v-(x*y+z-540)/x39 逻辑运算逻辑运算指令指令 AND,OR,XOR,NOT,TEST 位测试并修改位测试并修改指令指令 BT,BTS,BTR,BTC 位扫描位扫描指令指令 BSF,BSR 移位移位指令指令 逻辑移位:逻辑移位:SHL,SHR 算术移位:算术移位:SAL,SAR 循环移位:循环移位:ROL,ROR 带进位的循环移位:带进位的循环移位:RCL,RCR 双精度数逻辑移位:双精度数逻辑移位:SHLD,SHRD
34、 3.3.3 逻辑指令和移位指令逻辑指令和移位指令40逻辑逻辑非非指令:指令:NOT OPR 执行操作:执行操作:(OPR)(OPR)逻辑逻辑与与指令:指令:AND DST,SRC 执行操作:执行操作:(DST)(DST)(SRC)逻辑逻辑或或指令:指令:OR DST,SRC 执行操作:执行操作:(DST)(DST)(SRC)异或异或指令:指令:XOR DST,SRC 执行操作:执行操作:(DST)(DST)(SRC)测试测试指令:指令:TEST OPR1,OPR2 执行操作:执行操作:(OPR1)(OPR2)CF OF SF ZF PF AF 0 0 *无定义无定义 根据运算结果设置根据运算
35、结果设置注意:注意:*OPROPR不能为立即数不能为立即数 *不影响标志位不影响标志位 41例:屏蔽例:屏蔽AL的的0和和1两位两位 AND AL,0FCH例:置例:置AL的第的第5位为位为1 OR AL,20H 例:使例:使AL的的0和和1两位变反两位变反 XOR AL,3例:测试某些位是例:测试某些位是0还是还是1 TEST AL,1 JZ EVEN *AND 1 1 1 1 1 1 0 0 *0 0 *OR 0 0 1 0 0 0 0 0 *1*XOR 0 0 0 0 0 0 1 1 *位测试并修改指令位测试并修改指令 386及后继机型及后继机型位测试指令:位测试指令:BT DST,SR
36、C执行操作:将目的操作数中由源操作数所指定的位复制到进位标志执行操作:将目的操作数中由源操作数所指定的位复制到进位标志CF位测试并置位测试并置1指令:指令:BTS DST,SRC执行操作:将目的操作数中由源操作数所指定的位复制到进位标志执行操作:将目的操作数中由源操作数所指定的位复制到进位标志CF,并将目的操作数中的该位置并将目的操作数中的该位置1.位测试并置位测试并置0指令:指令:BTR DST,SRC执行操作:将目的操作数中由源操作数所指定的位复制到进位标志执行操作:将目的操作数中由源操作数所指定的位复制到进位标志CF,并将目的操作数中的该位置并将目的操作数中的该位置0.位测试并变反指令:
37、位测试并变反指令:BTC DST,SRC执行操作:将目的操作数中由源操作数所指定的位复制到进位标志执行操作:将目的操作数中由源操作数所指定的位复制到进位标志CF,并将目的操作数中的该位变反并将目的操作数中的该位变反.*其它标志位无定义其它标志位无定义位扫描指令位扫描指令 386及后继机型及后继机型正向位扫描指令:正向位扫描指令:BSF REG,SRC执行操作:执行操作:for(i=0;i=0;i-)if(SRC的位的位i为为1)ZF 0;REG i;break;if (i1,MOV CL,CNT SHL OPR,CL ;以以SHL为例为例 *条件标志位:条件标志位:CF=移入的数值移入的数值
38、1 最高有效位的值发生变化最高有效位的值发生变化 0 最高有效位的值不变最高有效位的值不变 注意:当注意:当CNT=1CNT=1时,时,OFOF位有效;否则:位有效;否则:OFOF位位无定义无定义 移位指令:移位指令:SF、ZF、PF 根据移位结果设置根据移位结果设置,AF无定义无定义 循环移位指令:循环移位指令:只影响只影响CF,OFOF=49例:例:(AX)=0012H,(BX)=0034H,把它们装配成,把它们装配成(AX)=1234H MOV CL,8 ROL AX,CL ADD AX,BX;或;或 OR AX,BX例:例:(BX)=84F0H (1)(BX)为无符号数,求为无符号数,
39、求(BX)/2 SHR BX,1 ;(BX)=4278H (2)(BX)为带符号数,求为带符号数,求(BX)/2 SAR BX,1 ;(BX)=0C278H503.3.4 串处理指令串处理指令 串传送指令串传送指令 MOVS 存入串指令存入串指令 STOS 从串取指令从串取指令 LODS 串比较指令串比较指令 CMPS 串扫描指令串扫描指令 SCAS配合使用的前缀有:配合使用的前缀有:REP 重复重复 REPE/REPZ 相等相等/为零则重复为零则重复 REPNE/REPNZ 不相等不相等/不为零则重复不为零则重复与与REP配合工作的配合工作的 MOVS/STOS/LODS REP MOVS/
40、STOS/LODS 执行操作:执行操作:(1)如如(CX)=0则退出则退出REP,否则转,否则转(2)(2)(CX)(CX)-1 (3)执行执行MOVS/STOS/LODS(4)重复重复(1)(3)*这三个指令不影响标志位。这三个指令不影响标志位。52MOVS 串传送指令串传送指令MOVS DST,SRC例:例:MOVS ES:BYTE PTR DI,DS:SIMOVSB(字节)、(字节)、MOVSW(字)、(字)、MOVSD(双字)(双字)执行操作:执行操作:(1)(DI)(SI)(2)(SI)(SI)S,(DI)(DI)S 字节操作字节操作:S=1,字操作字操作:S=2,双字操作双字操作:
41、S=4 方向标志方向标志DF=0时用时用“”,DF=1时用时用“”。REP MOVS:将数据段中的整串数据传送到附加段中。将数据段中的整串数据传送到附加段中。源串(数据段)源串(数据段)目的串(附加段)目的串(附加段)执行执行REP MOVS之前,应先做好:之前,应先做好:(1)源串首地址(末地址)源串首地址(末地址)SI(2)目的串首地址(末地址)目的串首地址(末地址)DI(3 3)串长度)串长度 CX(4 4)建立方向标志)建立方向标志(CLD使使DF=0,STD使使DF=1)53例例3.58 datarea segmentmess1 db personal_computerdatarea
42、 endsextra segmentmess2 db 17 dup(?)extra endscode segmentlea si,mess1 lea di,mess2 mov cx,17 cld rep movsb code endslea si,mess1+16 lea di,mess2+16 mov cx,17 std rep movsb54 STOS 存入串指令存入串指令 STOS DST STOSB(字节)(字节)STOSW(字)(字)STOSD(双字)(双字)执行操作:执行操作:(DI)(AL|AX|EAX),(DI)(DI)(1|2|4)例:把附加段中的例:把附加段中的5个字节缓冲
43、区置为个字节缓冲区置为20Hlea di,mess2mov al,20Hmov cx,5cldrep stosb55 LODS 从串取指令从串取指令LODS SRCLODSB(字节)(字节)LODSW(字)(字)LODSD(双字)(双字)执行操作:执行操作:(AL|AX|EAX)(SI),(SI)(SI)(1|2|4)注意注意:*LODS指令一般不与指令一般不与REP联用联用 *源串源串默认默认在数据段中,目的串必须在附加段中,在数据段中,目的串必须在附加段中,但源串允许使用段跨越前缀来修改。但源串允许使用段跨越前缀来修改。*不影响条件标志位不影响条件标志位56 REPE/REPZ(REPNE
44、/REPNZ)CMPS/SCAS 执行操作:执行操作:(1)如如(CX)=0或或ZF=0(ZF=1)则退出,则退出,否则转否则转(2)(2)(CX)(CX)-1 (3)执行执行CMPS/SCAS (4)重复重复(1)(3)与与REPE/REPZ和和REPNE/REPNZ配合配合工作的工作的 CMPS 和和 SCAS57CMPS串比较指令串比较指令 CMPS SRC,DSTCMPSB(字节)(字节)CMPSW(字)(字)CMPSD(双字)(双字)执行操作:执行操作:(1)(SI)-(DI)根据比较结果设置条件标志位:相等根据比较结果设置条件标志位:相等 ZF=1 不等不等 ZF=0 (2)(SI
45、)(SI)(1|2|4),(DI)(DI)(1|2|4)58 SCAS串扫描指令串扫描指令SCAS DSTSCASB(字节)(字节)SCASW(字)(字)SCASD(双字)(双字)执行操作:执行操作:(AL|AX|EAX)-(DI)根据比较结果设置条件标志位:相等根据比较结果设置条件标志位:相等 ZF=1ZF=1 不等不等 ZF=0ZF=0 (DI)(DI)(1|2|4)59 例例3.60 从一个字符串中查找一个指定的字符从一个字符串中查找一个指定的字符mess db COMPUTERlea di,messmov al,Tmov cx,8cldrepne scasb(DI):相匹配字符的下一个
46、地址相匹配字符的下一个地址(CX):剩下还未比较的字符个数:剩下还未比较的字符个数COMPUTER(di)COMPUTER(di)60例例3.61 比较两个字符串,找出它们不相匹配的位置比较两个字符串,找出它们不相匹配的位置 lea si,mess1 lea di,mess2 mov cx,8 cld repe cmpsb例:反向传送例:反向传送COMPUTERCOMPUTER注意:串处理指令注意:串处理指令的特点的特点 1 1)2 2)3 3)613.3.5 控制转移指令控制转移指令 无条件转移指令无条件转移指令*条件转移指令条件转移指令*循环指令循环指令*子程序调用和返回指令子程序调用和返
47、回指令*中断指令中断指令 *不影响条件标志位不影响条件标志位62 无条件转移指令无条件转移指令 JMP 段内段内直接直接短短转移:转移:JMP SHORT OPR 执行操作:执行操作:(EIP)(EIP)+8位位移量(位位移量(-128127)段内段内直接直接近近转移:转移:JMP NEAR PTR OPR 执行操作:执行操作:(EIP)(EIP)+16位位移量位位移量 段内段内间接间接转移:转移:JMP WORD PTR OPR 执行操作:执行操作:(EIP)(EEA)段间段间直接直接远远转移:转移:JMP FAR PTR OPR 执行操作:执行操作:(EIP)OPR的段内偏移地址的段内偏移
48、地址 (CS)OPR所在段的段地址所在段的段地址 段间段间间接间接远远转移:转移:JMP DWORD PTR OPR 执行操作:执行操作:(EIP)(EA)(CS)(EA+(2|4)63 条件转移指令(条件转移指令(4类)类)注意:注意:只能使用只能使用段内直接转移段内直接转移 根据根据单个条件标志单个条件标志的设置情况转移:的设置情况转移:格式格式 测试条件测试条件 JZ OPR ZF=1(JE、JNE)JNZ OPR ZF=0 JS OPR SF=1 JNS OPR SF=0 JO OPR OF=1 JNO OPR OF=0 JC OPR CF=1(JB、JNAE)JNC OPR CF=0
49、(JNB、JAE)JP OPR PF=1 JNP OPR PF=0 64 比较两个比较两个无符号数无符号数,并根据比较结果转移:,并根据比较结果转移:*格式格式 测试条件测试条件 JNBE(JA)OPR CFZF=0*适用于地址或双精度数低位字的比较适用于地址或双精度数低位字的比较B B:below A:above N:not E:equalbelow A:above N:not E:equal65 格式格式 测试条件测试条件 JNLE(JG)OPR (SF OF)ZF=0 测试测试CX/ECX的值为的值为 0 则转移:则转移:格式格式 测试条件测试条件 JCXZ OPR (CX)=0 JEC
50、XZ OPR (ECX)=0比较两个比较两个带符号数带符号数,并根据比较结果转移:,并根据比较结果转移:*L L:less G:greater N:not E:equalless G:greater N:not E:equal67例例3.64 X50,转到,转到TOO_HIGH;计算计算X-Y,溢,溢出转到出转到OVERFLOW,否则,否则|X-Y|RESULT MOV AX,X CMP AX,50 JG TOO_HIGH SUB AX,Y JO OVERFLOW JNS NONNEG NEG AX NONNEG:MOV RESULT,AX TOO_HIGH:OVERFLOW:68例例3.65