
lec08算术逻辑运算类指令.ppt
29页第 08 讲 8086 / 8088指令系统 ——算术运算&逻辑运算类指令,,数据传送类指令 算术运算类指令 逻辑运算类指令 串处理类指令 控制转移类指令 处理机控制指令,8086/8088的指令系统,重点关注: 指令的汇编格式 指令的基本功能 指令支持的寻址方式 指令的执行对标志位的影响 指令的特殊要求,,算术运算类指令: 加法指令 ADD、ADC、INC 减法指令 SUB、SBB、DEC、NEG、CMP 乘法指令 MUL、IMUL 除法指令 DIV、IDIV 十进制调整指令 DAA、DAS、 AAA、AAS、AAM、AAD, 加法指令 加法指令: ADD DST, SRC 执行操作: (DST) (SRC) + (DST) 带进位加法指令: ADC DST, SRC 执行操作: (DST) (SRC) + (DST) + CF 加1指令: INC OPR 执行操作: (OPR) (OPR) + 1,注意: * 都影响状态标志位,但 INC指令不影响CF标志位 减法指令 减法指令: SUB DST, SRC 执行操作: (DST) (DST) - (SRC) 带借位减法指令: SBB DST, SRC 执行操作: (DST) (DST) - (SRC) - CF 减1指令: DEC OPR 执行操作: (OPR) (OPR) - 1 求补指令: NEG OPR 执行操作: (OPR) - (OPR) 比较指令: CMP OPR1, OPR2 执行操作: (OPR1) - (OPR2),注意: * 除DEC指令不影响 CF标志外,均对状 态标志位有影响。
例 2‑17】 试分析如下指令执行结果及标志位的状态,MOV BX,0 ; (BX)=0,不影响标志位 DEC BX ; (BX)=0FFFFH,CF不影响、PF=1、AF=1、ZF=0、SF=1、OF=0 INC BX ; (BX)=0,CF不影响、PF=1、AF=1、ZF=1、SF=0、OF=0 SUB BX,1 ; (BX)=0FFFFH,CF=1、PF=1、AF=1、ZF=0、SF=1、OF=0 NEG BX ; (BX)=1,CF=1、PF=0、AF=1、ZF=0、SF=0、OF=0,例:x、y、z 均为双字数据,分别存放在地址为X, X+2; Y, Y+2;Z, Z+2的存储单元中,用指令序列实现 w x + y + 24 - z ,并用W, W+2单元存放w,MOV AX, X MOV DX, X+2 ADD AX, Y ADC DX, Y+2 ; x+y ADD AX, 24 ADC DX, 0 ; x+y+24 SUB AX, Z SBB DX, Z+2 ; x+y+24-z MOV W, AX MOV W+2, DX ; 结果存入W, W+2单元, 乘法指令 无符号数乘法指令: MUL SRC 带符号数乘法指令: IMUL SRC 执行操作:字节操作数 (AX) (AL) * (SRC) 字操作数 (DX, AX) (AX) * (SRC),注意: * AL (AX) 为隐含的乘数。
AX (DX,AX) 为隐含的乘积 * src若为存储器操作数时,注意用ptr明确类型 如:MUL WORD PTR [BP][DI] ; 字乘,乘积送DX:AX * SRC不能为立即数和段寄存器除CF和OF外,对其它状态标志位无定义 乘法指令对 CF/OF 的影响:,例 2‑19 : 已知(AL)=0FFH,(BL)=2, MUL BL ;乘积(AX)= 01FEH,(255×2 = 510), CF=OF=1 IMUL BL ;乘积(AX)= 0FFFEH,(-1×2 = -2), CF=OF=0,00 乘积的高一半为零 11 否则,MUL指令: CF,OF =,,00 乘积的高一半是低一半的符号扩展 11 否则,IMUL指令: CF,OF =,,对标志没有定义:指令执行后这些标志是任意的、不可预测(就是不知道是0还是1) 对标志没有影响:指令执行不改变标志状态, 除法指令 无符号数除法指令: DIV SRC 带符号数除法指令: IDIV SRC 执行操作: 字节操作 (AL) (AX) / (SRC) 的商 (AH) (AX) / (SRC) 的余数 字操作 (AX) (DX, AX) / (SRC) 的商 (DX) (DX, AX) / (SRC) 的余数,注意: * AX (DX,AX) 为隐含的被除数寄存器。
* AL (AX) 为隐含的商寄存器 * AH (DX) 为隐含的余数寄存器 * SRC不能为立即数 * 对所有状态标志位均无定义 * 两个N位操作数相除,应首先把被除数符号扩展为2N位 * src若为存储器操作数时,注意用ptr明确类型 如:IDIV BYTE PTR [DI] ;AX除以8 位存储器操作数,例 2-20:已知(AX)=0410H,(BL)= 0B8H DIV BL ;商AL=05H ,余数AH=78H IDIV BL ;商AL=F2H(即-14),余数AH=20H(即32) ;有符号数0410H真值为1040,B8H 真值为-72 ;注意DIV和I DIV的区别例 2-21】X、Y、Z、V、W均为16位有符号数, 计算W←(V-(X*Y+Z-1234))/X 确定计算顺序如下: ① X*Y → 暂存中间结果 ② X*Y+Z → X*Y+Z-1234 → 暂存中间结果 ③ V-(X*Y+Z-1234) → (V-(X*Y+Z-1234))/X → 保存最终结果 确定各次运算的数据类型: ① X*Y 乘积为32位 ② X*Y结果为32位,Z进行符号扩展成32位, X*Y+Z-1234 结果为32位。
③ X*Y+Z-1234的结果是32位,V需扩展到32位,(V-(X*Y+Z-1234))结果为32位,X为16位,因此,(V-(X*Y+Z-1234))/X最终结果为16位表达式计算,MOV AX, X IMUL Y ; X*Y MOV CX, AX ; X*Y(32位)暂存入BX:CXDX:AX需用于Z的符号扩展 MOV BX, DX MOV AX, Z ; Z置入AX进行符号扩展至DX:AX,扩展为32位 CWD ADD CX, AX ADC BX, DX ; X*Y+Z SUB CX, 1234 SBB BX, 0 ; X*Y+Z-1234 MOV AX, V ; V置入AX进行符号扩展至DX:AX,扩展为32位 CWD SUB AX, CX SBB DX, BX ; V-(X*Y+Z-1234) IDIV X ; (V-(X*Y+Z-1234))/X,商在AX中,余数在DX中 MOV W, AX ; 保存最终结果,2.7.3 逻辑运算类指令: 逻辑运算指令 AND、OR、NOT、XOR、TEST 移位指令 SHL、SHR 、 SAL 、SAR、 ROL、ROR、RCL、RCR,逻辑非指令:NOT OPR * 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 * * * 无定义,根据运算结果设置, 逻辑运算指令,,,例:屏蔽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,* * * * * * * * OR 0 0 1 0 0 0 0 0 * * 1 * * * * *,,* * * * * * 0 1 XOR 0 0 0 0 0 0 1 1 * * * * * * 1 0,,,,* * * * * * * * AND 1 1 1 1 1 1 0 0 * * * * * * 0 0,,* * * * * * * * AND 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 *,,,AND指令一般用来屏蔽、保留一些位,其中要屏蔽的位可以和“0 ”进行逻辑“与”,而要保留的位可以和“1 ”进行逻辑“与”。
【例 2‑23】 将AX中的最高位和最低位保留,其余位清零,可用下面的指令: AND AX, 8001H,,OR指令常用来将某些位置位,同时使其余位保持不变,其中需要置位的位可以和“1”进行逻辑“或”,而保持不变的位可以和“0”进行逻辑“或” 【例 2‑24】 将BX中的低4 位置位,而其余位不变,可以使用下面的指令: OR BX, 000FH,,XOR指令常用来将某些特定位“求反”,而其余位则保持不变,其中要“求反”的位和“1 ”进行逻辑“异或”,要保持不变的位和“0 ”进行逻辑“异或” 【例 2‑25】 假设(BH)= 10110010B,分析以下指令执行后BH中的内容 XOR BH,01011011B 指令执行后,(BH)=11101001B XOR指令的另一个重要应用是,一个寄存器操作数自身与自身进行逻辑“异或”实现清零,例如: XOR BH,BH ;BH清零 XOR SI,SI ;SI清零 当然,使用其他指令也能实现寄存器内容的清零,例如: MOV SI,0 ;SI清零 SUB SI,SI ;SI清零 AND SI,0 ;SI清零,,TEST 指令常常用于位测试,并与条件转移指令一起共同完成对特定位的判断,并实现相应的程序转移。
这与比较指令 CMP类似,不过TEST指令只比较某些特定的位,而CMP指令比较整个操作数 例如: 若要检测AL中的最低位是否为1,若为1则转移,可用以下指令: TEST AL,01H JNZ NEXT …… NEXT: 若要检测BX中的内容是否为0,若为0则转移,可用以下指令: TEST BX,0FFFFH JZ NEXT …… NEXT:,逻辑左移 SHL OPR, CNT 逻辑右移 SHR OPR, CNT 算术左移 SAL OPR, CNT(同逻辑左移) 算术右移 SAR OPR, CNT,,,,,,,,CF 0,,,,,,0 CF,CF,,,,,,,,,,,,, 移位指令,循环左移 ROL OPR, CNT 循环右移 ROR OPR, CNT 带进位循环左移 RCL OPR, CNT 带进位循环右移 RCR OPR, CNT,CF,,,,,CF,,,,,,,CF,,,,,,,,,,,,,,,CF,,,注意: * OPR可用除立即数以外的任何寻址方式 * CNT=1,SHL OPR, 1 CNT1,MOV CL, CNT SHL OPR, CL ; 以SHL为例 * 状态标志位: CF = 移出的数值 1 CNT=1时,最高有效位的值发生变化 0 CNT=1时,最高有效位的值不变 当移位次数大于1。












