Presentation is loading. Please wait.

Presentation is loading. Please wait.

3.4.2 算术运算指令(Arithmetic) 算术运算指令内容: 8086/8088提供加、减、乘、除等六种基本算术操作

Similar presentations


Presentation on theme: "3.4.2 算术运算指令(Arithmetic) 算术运算指令内容: 8086/8088提供加、减、乘、除等六种基本算术操作"— Presentation transcript:

1 3.4.2 算术运算指令(Arithmetic) 算术运算指令内容: 8086/8088提供加、减、乘、除等六种基本算术操作
(一)加法指令( Addition) (二)减法指令(Subtraction) (三)乘法指令(Multiplication) (四)除法指令(Division) (五)符号扩展指令 (六)十进制调整指令

2 特点: 大部分都影响标志位,不同指令影响不同: (1) 加、减法指令影响 SF,ZF,AF,PF,CF,OF; (2) 加1和减1指令不影响CF; (3) 乘法指令影响CF,OF; (4) 除法指令使大部分标志位的状态不确定; (5) 对BCD码调整指令对标志位的影响不同; (6) 转换指令对标志位无影响 都可以用于字节、字的运算; 双操作数指令除源为立即数外,其余必须有一个操作数 为寄存器;单操作数指令不能为立即数。

3 (一)加法指令( Addition) 8086具有5种加法操作指令: 1、 ADD(Addition)加法指令
2、 ADC(Add with carry)带进位加法指令 3、 INC(Increment by 1)加 1指令 4、AAA(ASCII adjust for addition)加法ASCII调整指令 5、DAA(Decimal adjust for addition)加法十进制调整指令

4 1、 ADD(Addition)加法指令 例: 指令格式:ADD dst , src ;(dst) (dst)+(src)
ADD CL,10 ;寄存器+立即数 ADD DX,SI ;寄存器+寄存器 ADD AX, MEM ;寄存器+存储器 ADD DATA[BX], AL ;存储器+寄存器 ADD BYTE PTR ALPHA[DI],30H;存储器+立即数

5 2、 ADC(Add with carry)带进位加法指令
格式:ADC dst,src ;(dst)←(dst)+(src)+CF CF: 进位标志CF的现行值(上条指令CF值) 特点: 与ADD同。 用途:主要用于多字节运算中。 例: ADC CX, ;寄存器+立即数+CF ADC AL, BL ;寄存器+寄存器+CF ADC DX, COUNT[SI] ;寄存器+存储器+CF ADC BLOCK[DI], BX ;存储器+寄存器+CF ADC BYTE PTR MEM, 6 ;存储器+立即数+CF

6 计算两个多字节数相加 3B74AC60F8H+20D59E36C1H=? 两个多字节数存放在: DATA1,DATA2开始的单元。
应用举例: 计算两个多字节数相加 3B74AC60F8H+20D59E36C1H=? 两个多字节数存放在: DATA1,DATA2开始的单元。 流程图 多字节数内存存放

7 程序: MOV CX, 5 MOV SI, 0 ; 清SI CLC ;清CF LOOPER: MOV AL, DATA2[SI]
ADC DATA1[SI],AL INC SI ;(SI)+1  (SI) DEC CX ;(CX)-1 (CX) JNZ LOOPER ;(CX)0转 HLT ;停机

8 特点: 可以进行8位、16位的无符号数和带符号数的加法运算; 源操作数和目标操作数不能同时为存储器, 不能为段寄存器;
指令影响标志位的情况: OF=1, 8位带符号数相加,和超出范围(-128~+127), 16位带符号数相加,和超出范围(-32768~+32767); CF=1, 8位无符号数相加,和超过255, 16位无符号数相加,和超过65535。 其他条件标志(SF,AF,PF,ZF)根据定义设定。

9 例: MOV AL,7EH ;(AL)=7EH MOV BL, 5BH ;(BL)=5BH ADD AL,BL ;(AL)=7EH+5BH=D9H 影响标志位的情况: SF=1 , 结果最高位=1 ZF=0 ,结果不等于0 AF=1 ,D3 位向D4 有进位 PF=0 ,”1”的个数为奇数 CF=0 ,无进位 OF=1 ,和超过+127 (两个正数相加,结果为负;反之亦是)

10 问题思考: 分析两标志位(1) 什么叫溢出?什么叫进位? (2) 有进位就有溢出,没有进位就没有溢出? (1)解答:
分析两标志位(1) 什么叫溢出?什么叫进位? (2) 有进位就有溢出,没有进位就没有溢出? (1)解答: 溢出------通常是指带符号数的补码溢出。 补码运算能表示范围为:-2 n-1 ~+2 n+1 –1,如果运算结果超出该范围,叫补码溢出,此时OF=1,故用OF标志判断带符号数运算是否超范围(结果溢出)。 进位------是指运算结果的最高位向更高位的进位。 有进位,CF=1;无进位, CF=0,用CF标志判断无符号数运算是否超范围(结果溢出) 。

11 结论: 有进位不一定有溢出,没有进位不一定没有溢出。
(2)有进位就有溢出,没有进位就没有溢出? 结论: 有进位不一定有溢出,没有进位不一定没有溢出。 以8位二进制数为例分析一下数的溢出与进位情况: 下面分4种情况加以讨论: (1) 带符号数和无符号数都不溢出 (2) 无符号数溢出 (3) 带符号数溢出 (4) 带符号数和无符号数都溢出

12 (1) 带符号数和无符号数都不溢出

13 (2) 无符号数溢出 二进制数 看作无符号数 看作带符号数 1 + 7 251 258 + 7 - 5 + 2 相 加 标志
(2) 无符号数溢出 二进制数 看作无符号数 看作带符号数 1 + 7 251 258 + 7 - 5 + 2 标志 CF=1,OF=0 CF=1 OF=0 溢出 无符号数溢出 结果应为2,错 不溢出 异号数相加 不可能有溢出

14 (3) 带符号数溢出

15 (4) 带符号数和无符号数都溢出

16 结论: (1)带符号数相加是否溢出根据OF= 1 ?判断。 OF=1,同符号数相加,结果符号与其相反,产生溢出;
异号数相加,不可能溢出。 (2)无符号数相加是否溢出根据CF= 1 ?判断。 CF=1,无符号数相加产生溢出。 (3)对标志的解释,取决于程序员。如带符号数只关心OF、SF;无符号数只关心CF,而OF、SF无意义 。

17 3、INC (Increment by 1 )加 1 指令
格式: INC dst ;(B/W), (dst)←(dst)+1 dst : 寄存器、存储器。不能是段寄存器。 功能:对指定的目标操作数+1  操作数单元。 用途:用于在循环程序中修改地址指针和循环次数。 标志位影响情况:影响SF,ZF,AF,PF,OF。 不影响CF。

18 例: 操作数类型:可以是寄存器,存储器,不能是段寄存器。 INC DL ; 8位寄存器+1 INC SI ;16位寄存器+1
INC BYTE PTR [BX][SI] ;存储器+1(字节操作) INC WORD PTR [DI] ;存储器+1(字操作) INC DS ; 错

19 (二)减法指令(Subtraction)
8086有7条减法指令 : 1、SUB(Subtraction)减法指令 2、SBB(Subtraction with borrow)带进位减法指令 3、DEC(Decrement by 1 ) 减 1 指令 4、NEG(Negate) 求补指令 5、CMP(Compare) 比较指令 6、AAS(ASCII adjust for subtraction)减法ASCII调整指令 7、DAS(Decimal adjust for subtraction)减法十进制调整指令

20 1、SUB(Subtraction)减法指令
格式:SUB dst,src;(dst)←(dst)-(src) Src:立即数,寄存器,存储器。 dst:寄存器,存储器。 例: SUB AL,37H ;寄存器-立即数 SUB BX,DX ;寄存器-寄存器 SUB CX, VAR1 ;寄存器-存储器 SUB ARRAY[SI], AX ;存储器-寄存器 SUB WORD PTR [BX][DI],512H ;存储器减立即数 这种指令影响标志位: AF、CF、OF、PF、SF、ZF标志。 CF=1,无符号数小减大,运算结果溢出; OF=1,带符号数运算溢出。

21 2、SBB(Subtraction with borrow)带借位减法指令
格式::SBB dst,src;(dst)←(dst)-(src)-CF CF: 借位标志CF的现行值(上条指令CF值) Src:立即数,寄存器,存储器; dst:寄存器,存储器。 指令影响标志位、B/W数运算情况同SUB。 用途:用于多字节数相减。 例: SBB BX,100H ;寄存器-立即数 -CF SBB CX,DX ;寄存器-寄存器-CF SBB AL, DATA1[SI] ;寄存器-存储器-CF SBB DISP[BP], BL ;存储器-寄存器-CF SBB BYTE PTR ALPHA[SI+6], 96H;存储器-立即数-CF

22 3、DEC (Decrement by 1 ) 减 1 指令
格式: DEC dst ;(B/W) (dst)←(dst)-1 dst : 寄存器 、存储器。不能是段寄存器。 功能:对指定的目标操作数-1  操作数单元。 用途:用于在循环程序中修改地址指针和循环次数。 标志位影响情况:影响SF,ZF,AF,PF,OF。 不影响CF。

23 DEC 用途举例: MOV AX , 0FFFFH CYC: DEC AX JNZ CYC HLT 用于延时时间。

24 4、NEG (Negate) 求补指令 格式: NEG dst ;B/W, (dst) ← 0 - (dst)
操作: 把操作数按位求反后末位+1。 (dst) ← 0FFFFH -(dst)+1 影响标志:AF、CF、OF、PF、SF、ZF。 CF: 操作数为0时求补,CF=0 ; 其他情况均使CF=1. OF: 对-128 或-32768求补,OF=1; 否则OF=0.

25 应用举例:求绝对值 在内存中, 从AREA1开始存放100个带符号数。 求各数的绝对值存于AREA2的开始单元。 流程图

26 程序: LEA SI, AREA1 LEA DI, AREA2 MOV CX, 100 CHECK: MOV AL, [SI]
OR AL, AL ;(AL)内容不变,置标志 JNS NEXT ;SF=0转NEXT NEG AL ;负数求补 NEXT: MOV [DI], AL ;送目标 INC SI INC DI DEC CX JNZ CHECK HLT

27 5、CMP(Compare) 比较指令 格式:CMP dst,src ; B/W (dst)-(src) 结果不回送,只置标志。
影响标志: AF、CF、OF、PF、SF、ZF 。 src: 立即数,寄存器,存储器。 dst:寄存器,存储器。 例: CMP AL,0AH ;寄存器与立即数比较 CMP CX, DI ;寄存器与寄存器比较 CMP AX, AREA1 ;寄存器与存储器比较 CMP [BX+5], SI ;存储器与寄存器比较 CMP WORD PTR AMMA,100H;存储器与立即数比较

28 用途: 用比较指令来比较两个数之间的关系: 两者是否相等,两个数中哪个大。 (1) 根据ZF标志,判断两者是否相等;
(2) 根据CF标志, 判断两个无符号数的大小; (3) 用SF、OF标志,判断二个带符号数的大小。

29 (1) 根据ZF标志,可判断两者是否相等 例: CMP AX, BX ZF=1, (AX) = (BX),两者相等 ZF=0, (AX) = (BX),两者不相等 (2) 根据CF标志, 判断两个无符号数的大小 例: 比较AX,BX寄存器, 将大数  (AX) CMP AX,BX JNC NEXT ; CF=0转NEXT XCHG AX,BX NEXT:…… 结论:CF=0 ,(AX) > (BX); CF=1, (AX) < (BX) (3) 用SF、OF标志,判断二个带符号数的大小(分析略)

30 (三)乘法指令(Multiplication)
可对字节、字进行操作;两个8位数相乘,结果为16位数,两个16位数相乘,结果为32位数; 可对无符号整数或有符号整数进行操作;对应有两条乘法指令。 1、MUL(Multiply) 无符号数乘法指令 格式:MUL src ; 字节操作 (AX)←(AL)×(src) ;字操作 (DX), (AX)←(AX)×(src) 2、IMUL(Integer Multiply) 有符号数乘法指令 格式:IMUL src ; 执行的操作同MUL,只是处理的数据是带符号的。

31 说明: 1、被乘数(即dst)隐含在AL或AX中,乘数(即src)由指令寻址,其寻址方式可以是除立即寻址方式之外的任何数据寻址方式,同时,它也决定了乘法是字运算还是字节运算。 2、乘法指令对除CF和OF以外的标志位无定义(即状态不定),如果乘积的高一半为0(或为符号位),则CF和OF均为0,否则均为1。 例: MUL CL IMUL DL MUL BYTE PTR[BX] IMUL NUMR

32 (四)除法指令(Division) 除法与乘法指令一样
可对字节、字进行操作;但字节除法是用16位数除以8位数,字除法是用32位数除以16位数。 可对无符号整数或有符号整数进行操作;对应有两条除法指令。 1、DIV(Division) 无符号数除法指令 格式:DIV src ; 字节操作 (AL)←(AX)/(src)的商 (AH)←(AX)/(src)的余数 ;字操作 (AX)←(DX,AX)/(src)的商 (DX)←(DX,AX)/(src)的余数 2、IDIV(Integer Division) 有符号数除法指令 格式:IDIV src ; 执行的操作同DIV ,只是处理的数据是带符号的,商和余数均为有符号数,余数符号同被除数符号。

33 说明: 1、被除数(即dst)隐含在AX 或(DX,AX)中,除数(即src)由指令寻址,其寻址方式可以是除立即寻址方式之外的任何数据寻址方式,同时,它也决定了除法是字运算还是字节运算。 2、除法指令对所有标志位无定义(即状态不定)。 3、执行除法指令时如果产生商溢出,微处理器就会产生除法错中断。 例: DIV CL IDIV DL DIV BYTE PTR[BP] IDIV WORD PTR[BX]

34 (五)符号扩展指令 功能: 将带符号的字节类型(8位)数据扩展为字类型(16位); 将带符号的字类型(16位)数据扩展为双字类型(32位)。
1、CBW(Convert Byte to Word)字节转换为字指令 格式:CBW ; 将(AL)的符号扩展到(AH)中去。 D7 D0 D7 D0 AH 0 • • • • • • 0 AL 正数 D7 D0 D7 D0 负数 AH 1 • • • • • • 1 AL 1 *指令执行后不影响标志位

35 2、CWD(Convert Word to Double Word)字转换为双字指令
格式:CWD ; 将(AX)的符号扩展到(DX)中去。 D15 D0 D15 D0 DX 0 • • • • • • 0 AX 正数 D15 D0 D15 D0 负数 DX 1 • • • • • • 1 AX 1 *指令执行后不影响标志位

36 例: 使NUMB2字节存储单元的内容除以NUMB1字节存储单元的内容,将商存于ANSQ字节单元中,余数存于ANSR字节单元中。 MOV AL,NUMB2 CBW IDIV NUMB1 MOV ANSQ,AL;商 MOV ANSR,AH;余数

37 (六)十进制调整指令 1、AAA(ASCII adjust for addition)加法ASCII调整指令
2、DAA(Decimal adjust for addition)加法十进制调整指令 3、AAS(ASCII adjust for subtraction)减法ASCII调整指令 4、DAS(Decimal adjust for subtraction)减法十进制调整指令

38 DAA 指令 格式: DAA;调整(AL)中压缩的二进制BCD码的和。 方法是:
若AF=1 or (AL)低4位>9,则(AL)加06H,且自动置AF=1; 若CF=1 or (AL)高4位>9,则(AL)加60H,且自动置CF=1。 说明: 1、该指令对PSW中的OF标志无定义,会影响所有其他标志位。 2、该指令应紧跟在加法指令后使用。调整后的和存入AL中。

39 BCD码运算规则: BCD码是十进制数,运算时应满足逢十进一规则;而运算器对数据运算时,都是按照二进制运算规则进行处理的,(BCD码为4位二进制数,是逢十六进一)故将BCD码传给运算器进行运算时,其结果需要修正。 例:计算1+8的值 1+8=9正确 例:计算5+7的值 结果大于9 加6修正 5+7=12正确

40 3.4.3 逻辑运算和移位指令 (一)逻辑运算指令 1、AND(Logical and ) 逻辑“与”指令
2、TEST(Test or non-dstructive logical and ) 测试指令 3、OR(Logical inclusive or ) 逻辑“或”指令 4、XOR(Logical exclusive or) 逻辑“异或”指令 5、NOT(Logical not ) 逻辑“非”指令 特点: 8086可以对8位,或16位操作数执行逻辑操作。 逻辑运算是按位操作的。 影响标志位: (NOT指令除外,其他指令同) CF=OF=0, AF未定义 , SF ZF PF (根据运算结果设置) ↕  ↕   ↕

41 1、AND(Logical and )逻辑“与”指令
格式:AND dst, src ;B/W,(dst)(dst )∧ (src) src: 立即数、寄存器、存储器。 dst: 寄存器、存储器。 注意:“与”指令中操作数不能同时为存储器。 两位中有一位为0(或二位都为0),则结 果 为0,否则为1。 举例: AND AL, 0FH ;寄存器 ∧ 立即数 AND CX, DI ; 寄存器 ∧ 寄存器 AND SI, MEM_NAME ; 寄存器 ∧ 存储器 AND ALPHA [DI], AX ; 存储器 ∧ 寄存器 AND word ptr [BX][SI], 0FFFEH ; 存储器 ∧ 立即数

42 “与”指令的用途: (1) 清CF , 自己“与”自己, 操作数不变 ,CF=0 例:AND AL,AL ; 结果:操作数不变 ,CF=0。 (2) 使操作数中若干位保持不变,若干位清“0 “;保持不 变的位与“1”相与;清“0 “的位与“0” 相与。 例: 若(AL)=43H AND AL, 0FH ; (AL)=03H, (AL)0~3不变; ;(AL)4~7=0H,屏蔽高4位。

43 “与”指令应用举例 例:将英文小写字母ASCII转换成大写。 小写英文字母ASCII为: ‘a’~’z’ 61H~7AH
程序: MOV AL, ’z’ AND AL, 0DFH ; (AL)=5AH 61H 41H DFH

44 2、 TEST(Test or non_dstructive logical and )测试指令
格式: TEST dst , src; B/W ,(dst)∧(src) src: 立即数、寄存器、存储器。 dst: 寄存器、存储器。 执行操作: 二个操作数相与的结果不保存,置标志位。 操作类型举例: TEST BH, ; 寄存器 ∧ 立即数 TEST SI , BP ;寄存器 ∧ 寄存器 TEST DI ,TABLE[BX] ; 寄存器 ∧ 存储器 TEST [SI],CH ;存储器 ∧ 寄存器 TEST word ptr [BX][DI], 6ACEH ;存储器 ∧ 立即数

45 用途:是条件转移指令的先行指令,常用于检测一些条件是否满足,但又不希望改变原有的操作数的情况,检测的位与“1”相与;不检测的位与“0” 相与。在此指令后边常加一条条件转移指令。
例:判断A单元中数据的奇偶性 设: (A L)= 0AEH 程序:MOV AL,A ;(AL)=0AEH TEST AL,01H JZ EVEN ; 结果=0为偶数转EVEN … 奇数处理 EVEN:偶数处理 检测(AL)的最低位是否为0,若为0转EVEN

46 3、OR(Logical inclusive or )逻辑“或”指令
格式:OR dst, src; B/W ,(dst)←(dst) (src) dst: 寄存器、存储器。 src: 立即数、寄存器、存储器。 注意:“或”指令中操作数不能同时为存储器; 两位操作数中任一位为1(或都为1), 则该位(结果)=1, 否则为0。 举例: OR BL,0F6H ; 寄存器 立即数 OR AH, BL ;寄存器 寄存器 OR CL ,BETA[BX][DI] ; 寄存器 存储器 OR GAMMA[SI] ,DX ;存储器 寄存器 OR BYTE PTR MEM_BYTE , 80H ;存储器 立即数

47 影响标志位: CF=0F=0, AF未定义 , SF ZF PF 用途: (1)清CF , 自己与自己“或”,操作数不变,CF=0
↕  ↕   ↕ 用途: (1)清CF , 自己与自己“或”,操作数不变,CF=0 例: OR AL,AL ;(AL)不变,CF=0 (2)使某个操作数若干位保持不变,若干位置1;保持不变的位与“0”或 ;位置1的与“1”或。 (3) 将两个操作数信息组合。 若(AL)=03H 用OR指令组合使(AL)=33H=’3’ 。 OR AL,30H ;(AL)=33H

48 4、XOR(Logical exclusive or)逻辑“异或”指令
格式:XOR dst , src ;B/W(dst)  (dst)  (src) dst: 寄存器、存储器。 src: 立即数、寄存器、存储器。 执行的操作:对指令的两个操作数进行按位“异或”运算;二位不相同时为1, 相同时为0。 注意: “异或”指令中操作数不能同时为存储器。 举例: XOR DI, 23F6HH ; 寄存器  立即数 XOR SI , DX ;寄存器  寄存器 XOR CL , BUFFER ; 寄存器  存储器 XOR MEM[BX],AX ;存储器  寄存器 XOR byte ptrTABLE[BP][SI], 3DH ; 存储器  立即数

49 用途:(1)使操作数清0,同时清CF , 自己与自己“异或”,操作数清0,CF=0
影响标志位: CF=0F=0, AF未定义 , SF ZF PF ↕  ↕   ↕ 用途:(1)使操作数清0,同时清CF , 自己与自己“异或”,操作数清0,CF=0 例: XOR AL,AL ;(AL)=0,CF=0 (2)对某些特定位求反时,这些特定位与“1”  ; 让某些位保持不变时,这些位与“0”  。 例:将(AL)中的第1、3、5、7位求反, 0、2、4、6位保持不变。 MOV AL, 0FH XOR AL,0AAH

50 (3)异或指令常用于判断两个操作数是否相等。
例:测试(AL)中的值是否等于33H。 XOR AL, 33H JZ MATCH 比较三条(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”指令在多字节累加程序中十分有用。

51 5、NOT(Logical not )逻辑“非”指令
格式: NOT dst ;B/W 指令操作数只有一个,指令对操作数按位求反。 执行操作: 字节求反:(dst)0FFH-(dst) 字求反: (dst)  0FFFFH-(dst) 源操作数:寄存器、存储器。不能是立即数。 影响标志位:对标志位无影响。 例: NOT CX ;16位寄存器求反 NOT BYTE PTR [BP] ;8位存储器求反 例: NOT AL 执行前(AL)= B, 执行后(AL)= B

52 综合举例: 1.使某些位置“0”。 2. 使某些位置“1”。 3. 使某些位求反。 IN AL,61H;(AL)=×××× ×× × ×B
↑设备控制寄存器 ↑想使此位为0 执行指令: AND AL,0FDH 即可。 使某些位置“1”。 IN AL,61H;(AL)=×××× ××××B 执行指令: OR AL, ↑想使此位为“1” 3. 使某些位求反。 IN AL,61H ;(AL)= × × × × × × 0 × XOR AL,02H ⊕ × × × × × × 1 ×

53 逻辑指令应用小结: (1)AND指令用来对指令的指定位清“0”。 (2)OR指令常用来对某些位置1。
(3)XOR指令用在程序开头,使某个寄存器清“0”;还常用来对某些位取反。 (4)NOT指令对某个数据取反,+1成补码。 (5)TEST指令用来检测指定位为1,还是0。

54 (二)移位指令 (8086有8条移位指令) 1、 算逻移位指令( 4条 ): SHL , SHR, SAL , SAR 。 (1)、 SHL/SAL(Shift logical left/shift arithmetic left) 逻辑左移/算术左移指令 (2)、SHR (Shift logical right ) 逻辑右移指令 (3)、SAR (Shift arithmetic right )算术右移指令 2、循环移位( 4条): ROL, ROR , RCL, RCR。 (1)、ROL (Rotate left ) 不含CF循环左移指令 (2)、ROR (Rotate right ) 不含CF循环右移指令 (3)、RCL (Rotate left through carry )含CF循环左移指令 (4)、RCR (Rotate right through carry )含CF循环右移指令

55 共同点: 所有移位指令都可以作B/W操作。 指令中的 dst : 寄存器、存储器寻址方式。 cnt : 表示移位次数
cnt=1,1可写在指令中,不能是1以外的常数。 cnt>1,用CL存放移位次数 ,不能是其他寄存器。 如: SAL AX,1 MOV CL,4 SAL AX,CL 利用移位指令编制乘除程序,执行时间比直接用乘除指令快, 速度可提高5-6倍。

56 标志位设置: 算逻移位指令: 循环移位指令:SF、ZF、PF、AF不影响。 执行多次移位指令后对CF、OF的影响:
移位后最高位的值被改变, OF = 1; 否则,无变化时,OF = 0, CF根据各条指令的规定设置。 SF、ZF、PF,AF无定义。 ↕ ↕ ↕ 循环移位指令:SF、ZF、PF、AF不影响。 OF、CF影响情况在指令中讲: ROL、 RCL影响标志OF、CF情况相同 ; ROR 、 RCR影响标志OF、CF情况相同 。

57 1、 算逻移位指令 4条 : SHL , SHR, SAL , SAR (1)、 SHL/SAL(Shift logical left/shift arithmetic left) 逻辑左移/算术左移指令 格式: SHL dst ,cnt ;逻辑左移指令, B/W SAL dst ,cnt ;算术左移指令, B/W dst : 寄存器、存储器寻址方式。 cnt : 表示移位次数 cnt=1,1可写在指令中。 cnt>1,用CL存放移位次数 。

58 SHL/SAL指令操作示意图如下图所示:
执行操作:相当于无符号数×2功能。 SHL/SAL指令操作示意图如下图所示: 指令格式举例: SHL AH,1 SAL SI, CL SAL WORD PTR [BX+5] ,1 SHL BYTE PTR , CL dst CF

59 (2)、SHR (Shift logical right )逻辑右移指令 格式: SHR dst ,cnt ;逻辑右移指令, B/W
执行操作:相当于无符号数÷2功能。 SHR指令操作示意图如下图所示: dst CF dst : 寄存器、存储器寻址方式。 指令格式举例: SHR BL , 1 SHR AX , CL SHR BYTE PTR [DI+BP],1 SHR WORD PTR BLOCK ,CL

60 (3)、SAR (Shift arithmetic right )算术右移指令 格式: SAR dst ,cnt ;算术右移指令, B/W
执行操作:相当于带符号数÷2功能,对负数向下舍入 IDIV指令对负数向上舍入。(下页解释) SAR指令操作示意图如下图所示 dst dst : 寄存器、存储器寻址方式。 指令格式举例:SAR AL , 1 SAR DL , CL SAR WORD PTR TABLE[SI],1 SAR BYTE PTR STATUS ,CL

61 用SAR指令与用IDIV指令做除法的区别:
MOV AX , 81H ; (AX) = -127 SAR AX , 1 ; (AX)= - 64 用IDIV指令做除法(IDIV指令对负数向上舍入) : MOV AX , 81H ;(AX)= -127 MOV CL , 2 IDIV CL ;(AL)= -63 ,(AH)= -1

62 应用举例: (BX)=84F0H SHR BX,1 ; (BX)=4278 CF=0,OF=1,SF=0,ZF=0
MOV CL,02H 或SAR BX,1 SAR BX,CL SAR BX,1 ; CF=0,OF无意义,SF=1,ZF=0

63 共同点: 影响标志OF、CF 2、循环移位 4条: ROL, ROR , RCL, RCR。
ROL、ROR 不含CF循环移位指令,操作数移动8次后还原。 RCL、 RCR 含CF循环移位指令,操作数移动9次后还原。 影响标志OF、CF ROL、 RCL影响标志OF、CF情况相同 ; ROR 、 RCR影响标志OF、CF情况相同 。 SF、ZF、PF、AF不影响。

64 (1)、ROL (Rotate left )不含CF循环(小循环)左移指令
格式: ROL dst ,cnt ;不含CF循环左移指令, B/W 执行操作:ROL指令操作示意图如下图所示 移动8次后操作数还原。 dst CF 指令格式举例: ROL BH , 1 ROL DX , CL ROL WORD PTR TABLE[DI],1 ROL BYTE PTR ALPHA ,CL

65 影响标志OF、CF 情况: 左循环移动1次后: 左循环移动多次后:
移位后,最高有效位(符号位)是否发生变化, 如果移位后,最高有效位发生变化则: OF = 1, 否则(无变化时)OF = 0。 CF根据各条指令的规定设置。 左循环移动多次后: OF 值不定。 CF=从目标操作数移出的最后一位。 SF、ZF、PF、AF不影响。

66 (2)、ROR (Rotate right )不含CF循环(小循环)右移指令
格式: ROR dst ,cnt ;不含CF循环右移指令, B/W 执行操作:ROR指令操作示意图如下图所示 右移8次后操作数还原。 dst CF 指令格式举例: ROR CX , 1 ROL BH , CL ROL BYTE PTRBETA , 1 ROL WORD PTR COUNT , CL

67 影响标志OF、CF 情况: 右循环移动1次后: CF根据各条指令的规定设置。 右循环移动多次后: OF 值不定。
如果移位后,最高有效位发生变化则, OF=1; 否则 : OF=0。 CF根据各条指令的规定设置。 右循环移动多次后: OF 值不定。 CF=从目标操作数移出的最后一位。 SF、ZF、PF、AF不影响。

68 (3)、RCL (Rotate left through carry )含CF循环(大循环)左移指令
格式: RCR dst ,cnt ;含CF循环左移指令, B/W 执行操作:RCL指令操作示意图如下图所示, 左移9次后操作数还原。 dst CF 指令格式举例: RCL BX , 1 RCL DL , CL RCL BYTE PTR ARRAY[DI] , 1 RCL WORD PTR [SI+BP] , CL 影响标志:RCL 与ROL 影响标志OF、CF情况相同

69 (4)、RCR (Rotate right through carry )含CF循环(大循环)右移指令
格式: RCR dst ,cnt ;含CF循环左移指令, B/W 执行操作:RCR指令操作示意图如下图所示, 右移9次后操作数还原。 dst CF 指令格式举例: RCR DI, 1 RCR SI , CL RCR WORD PTR[SI+BX+3], 1 RCL BYTE PTRPORT, CL 影响标志:RCR 与 ROR 影响标志OF、CF情况相同

70 小结: 带进位循环左移移9次还原 循环右移(不带CF) 移8次还原 循环左移(不带CF) 移8次还原 执行操作 名称 指令格式 1 CL
算术右移 (带符号数÷2) 逻辑右移 (无 符号数÷2) 执行操作 名称 指令格式 SHL oprd, 1 CL 逻辑左移 (无符号数*2) CF SAL oprd, 算术左移 SHR oprd, SAR oprd, ROL oprd, ROR oprd, RCL oprd, 1 1 RCR oprd,

71 循环移位指令(Rotate)与移位指令(Shift)不同点:
循环移位指令移位后,操作数中原来各数位的信息不会丢失,只是移动了位置,必要时可以恢复。 循环移位指令可以对操作数进行测试。 例:测试(AL)5 =? 0 MOV CL , 3 ROL AL , CL JNC ZERO ZERO: …

72 利用带进位循环移位指令将两个寄存器或存储器单元
组合起来一起移位。 例: 将DX、AX组合起来构成32位寄存器向左移一位。 如下图所示: 32位寄存器向左移一位 程序: SHL AX , 1 RCL DX , 1

73 3.4.4 串操作指令(String manipulation )(自学)
“串”就是内存中一段地址相连的字节或字。 串操作—对串中各项进行操作,也叫数据块操作。 8088有5种基本操作: 1、MOVS(Move string) 串传送指令 2、LODS(Load from string) 从串取指令 3、STOS (Store in to string) 存入串指令 4、CMPS(Compare string) 串比较指令 5、SCAS(Scan string) 串扫描指令

74 共同点: 可以只有源操作数,可以只有目标操作数,可能二者都有。 源操作数用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) 相等/为零则重复。 REPNE/REPNZ(Repeat while not equal/not zero)不相等/不为零则重复。

75 分二种情况: (一) 与REP相配合工作的MOVS、STOS、LODS指令 REP 重复串操作直到(CX)=0为止
(二) 与REPE/REPZ和REPNE/REPNZ联合工作的CMPS和SCAS指令 REPE/REPZ 当相等/为零时重复串操作 REPNE/REPNZ 当不相等/不为零时重复串操作

76 (一) 与REP相配合工作的MOVS、STOS、LODS指令
REP 重复串操作直到(CX)=0为止 格式:REP 串指令 串指令可为:MOVS、STOS、LODS。 MOVS(Move String) 串传送指令 LODS(Load from String) 从串取指令 STOS(Store into String) 存入串指令

77 REP 重复串操作执行过程: (1) 当(CX)= 0 ,结束REP, 执行REP后的下一条指令。 (2) 当(CX)≠0, (CX) (CX) -1 , (3) 执行REP后的串指令, (4) 重复(1)~(3)。 REP 执行流程图

78 1、MOVS(Move string)串传送
串传送有3种格式: (1) MOVS dst,src;((ES):(DI)←((DS):(SI)) MOVSB (字节);(SI)←(SI)±1,(DI)←(DI) ±1 MOVSW (字);(SI)←(SI)±2,(DI)←(DI)±2 当方向标志 CLD , DF=0时 用“+” STD , DF=1时 用“-” 该指令不影响标志位 。 如: MOVS ES:BYTE PTR [DI],DS:[SI] * MOV单指令不能完成 存储单元之间的数据传送; MOVS指令就是为解决 存储单元之间数据传送而设置的。

79 例: 将内存的数据段中以AREA1为首地址的100个数据,传送到附加段中的AREA2为首地址的区域。 用MOVS串操作指令编程:
MOV AX,SEG AREA1 MOV DS,AX MOV AX,SEG AREA2 MOV ES,AX MOV SI,OFFSET AREA1 MOV DI,OFFSET AREA2 MOV CX,100 CLD ; DF=0,增址传送 REP MOVSB ; or MOVS ES:BYTE PTR[DI], DS:[SI]

80 应用MOV指令编程: MOV AX,SEG AREA1 MOV DS,AX MOV AX,SEG AREA2
MOV ES,AX MOV SI,OFFSET AREA1 ;将ARE1偏移地址→SI MOV DI,OFFSET AREA2 MOV CX,100 LOOP1:MOV AL,[SI] ; (AL)←((DS):(SI)) MOV ES:[DI],AL ;((ES):(DI))←(AL) INC SI INC DI DEC CX JNE LOOP1

81 归纳:在执行MOVS指令时,应该先做好以下准备工作
(1) 数据段中源串首地址(或反向传送末地址)存入SI寄存器中。 (2) 附加段中目的串首地址(或反向传送末地址)存入DI寄存器中。 (3) 数据串长度存入CX寄存器。 (4) 建立方向标志 建立方向标志介绍两条指令: · CLD(clear direction flag) 功能:DF=0,执行串处理指令时 可以使地址自动+1或+2。 · STD(set direction flag) 功能:DF=1,执行串处理指令时可以使地址自动-1或 -2。

82 2、LODS(Load from string) 从串取指令
从串取指令有3种格式: LODS src;(字节)(AL) ((DS):(SI)), (SI) (SI) ±1 (字)(AX) ((DS):(SI)),(SI)  (SI)±2 LODSB (字节);(AL) ((DS):(SI)),(SI) (SI) ±1 LODSW (字) ;(AX) ((DS):(SI)),(SI)  (SI)±2 功能:该指令把由(SI)指定的数据段中某单元内容  (AL) 或 (AX)中。 DF=0,(SI)← (SI)+1或+2 DF=1,(SI) ←(SI)-1或-2

83 LODS应用注意: (1) 指令允许用段跨越前缀来指定非数据段的存储区。 (2) 该指令不影响标志位。 一般说来,
(1) 指令允许用段跨越前缀来指定非数据段的存储区。 (2) 该指令不影响标志位。 一般说来, 它不与REP联用,每重复一次,累加器的内容就改变一次。 (AL)中只能保持最后一个元素。 当缓冲区中的一串字符需要多次取出测试时可用本指令。 适用于在一个循环中,用基本串操作指令构成复杂串操作时很有用。

84 3 、 STOS(Store into string) 存入串指令
将(AL)或(AX)  ((ES):(DI)),(DI) ±1或±2(DI) 存入串指令有3种格式: STOS dst;(字节) ((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)←缓冲区长度。用来建立一串相同的值。

85 例:在附加段STORE开始存5个空格 程序: MOV AL,20H ;‘ ’  (AL) MOV CX,5 MOV DI,offset STORE CLD REP STOSB ;((ES):(DI))  (AL) (DI)  (DI)+1

86 例:内存中有一个首地址为BLOCK补码表示的有符号数的数据块。 要求将正、负数分开,分别存于二个缓冲区:
LODS,STOS指令应用 例:内存中有一个首地址为BLOCK补码表示的有符号数的数据块。 要求将正、负数分开,分别存于二个缓冲区: 存放正数的缓冲区首址为PLUS-DATA, 存放负数的缓冲区首址为MINUS-DATA。 设: 源数据块用SI寻址, 正数的目的区用DI寻址, 负数的目的区用BX寻址。 循环次数  ( CX )。

87 传送过程: 用LODS指令把源数据取入(AL)中, 检查其符号,确定正、负, 若为正数用STOS指令送至正数缓冲区,
若是负数,把(DI)与(BX)交换,仍使用STOS传送, 传送完后再将(DI)与(BX)交换,恢复原值。

88 程序:START: MOV SI,OFFSET BLOCK
MOV DI,OFFSET PLUS-DATA ; 正数缓冲区 MOV BX,OFFSET MINUS-DATA ;负数缓冲区 MOV CX,COUNT CLD GOON:LODS B TEST AL,80H JNZ MINS ;若负数转MINS STOS B ;正数 ,(DI)←(AL),(DI)←(DI)+1 JMP AGAIN MINS: XCHG BX,DI STOSB ;负数 ,(DI)←(AL),(DI)←(DI)+1 XCHG BX,DI AGAIN:DEC CX JNZ,GOON HLT

89 (二) 与REPE/REPZ和REPNE/REPNZ联合工作的CMPS和SCAS指令
1、CMPS(Compare string ) 串比较指令 2、SCAS (Scan string ) 串扫描指令,搜索指令

90 执行过程: 注意: REPZ执行流程 ◆ (CX)减1操作不影响标志 ◆ ZF标志由串操作决定 ◆ 当 (CX) = 0或ZF=0时退出循环
当(CX)= 0 , 结束REPZ, 执行REPZ下一条指令; (2) 当(CX)≠0,将CX 的内容减1, 执行REPZ后的串指令; (3) 当ZF = 1, 返回 (1) ; (4) 当ZF≠1, 则结束REPZ 执行REPZ下一条指令。 注意: ◆ (CX)减1操作不影响标志 ◆ ZF标志由串操作决定 ◆ 当 (CX) = 0或ZF=0时退出循环 REPZ执行流程

91 REPNE/REPNZ 当不相等/不为零时重复串操作
格式:REPNE(或REPNZ)string primitive REPNZ前缀: 当不相等重复 串指令可为 : CMPS , SCAS 1、CMPS(Compare string ) 串比较指令 2、SCAS (Scan string ) 串扫描指令,搜索指令

92 执行过程: 注意: REPNZ执行流程 ◆ (CX)减1操作不影响标志 ◆ ZF标志由串操作决定
当(CX )= 0 , 结束REPNZ, 执行REPNZ下一条指令。 (2) 当(CX)≠0,将CX 的内容减1, 执行REPNZ后的串指令。 当ZF = 0, 返回(1); 当ZF≠0, 则结束REPNZ, (4) 执行REPNZ下一条指令。 注意: ◆ (CX)减1操作不影响标志 ◆ ZF标志由串操作决定 ◆ 当 (CX) = 0或ZF=1时退出循环 REPNZ执行流程

93 1、CMPS(Compare string ) 串比较指令
(SI)—作为源串地址,(DI)—目的串地址 串比较指令有3种格式: CMPS dst,src ; CMPSB (字节); CMPSW (字); 执行操作: ((ES) :(DI) -(DS):(SI)),结果不存,置标志。 字节操作:(SI) (SI)±1,(DI)←(DI) ±1 字操作:(SI) (SI)±2,(DI) (DI)±2 注意:两数相减,只影响标志,不影响操作数。 其它操作规定与MOVS同。

94 REPZ CMPSB指令应用 例: 利用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 HLT

95 2、SCAS (Scan string ) 串扫描指令,搜索指令
(DI)—字符串起始地址,(AL)或(AX) — 关键字 串扫描指令有3种格式: 格式:SCAS dst SCASB(字节);(AL)-((ES):(DI)),(DI)(DI)±1 SCASW(字);(AX)-((ES):(DI)),(DI)  (DI)±2 注意:(AL)或(AX) - 目的串 两数相减,只影响标志,不影响操作数。 其它特性与MOVS同。

96 REPNE SCASB指令应用。 例:要搜索的关键字放在(AL)或(AX)中,搜索某一数据块或字符串中有无关键字,若有,把搜索次数记下来,且记录关键字地址;若搜索次数为0,表示没有要搜索的关键字。 MOV DI,0FFSET BLOCK;设置数据块地址指针 MOV CX,COUNT ;设置数据块长度 MOV AL,CHAR ; 关键字送入AL或AX REPNE SCASB ;(CX)≠0,ZF=0 继续SCASB JZ FOUND MOV DI, ;没有搜索到,搜索次数为0 JMP DONE FOUND:DEC DI MOV POINTR,DI ;记录关键字地址 MOV BX, OFFSET BLOCK SUB DI , BX ;把搜索次数记下来 DONE:HLT

97 应用举例: 例:一个数据块由大小写英文字母、数字、其他符号组成, 用CR(ASCII码0DH)结束。数据块首地址为BLOCK1。 将其传送到BLOCK2为首地址的内存区,并将英文中小 写英文字母(a~z)转换成大写英文字母(A~Z),其余不变。 分析: 大小写英文字母中相应ASCII码的关系: ‘a’~’z’相应ASCII码为: 61H~7AH ‘A’~’Z’相应ASCII码为:41H~5AH 英文中小写英文字母(a~z)转换成大写英文字母(A~Z): 只要将小写的ASCII码减去20H即可。 程序和流程图如下:

98 程序: 流程图 LEA SI , BLOCK1 LEA DI , BLOCK2 CLD NEXT: LODSB CMP AL , 0DH
JZ DONE CMP AL , 61H JC OK CMP AL , 7BH JNC OK SUB AL , 20H OK: STOSB JMP NEXT DONE: HLT 流程图

99 小结:串操作指令重复前缀,操作数,地址指针
地址指针寄存器 MOVS REP 源,目标 (DS): (SI) , (ES): (DI) CMPS REPE/REPNE (DS): (SI) ,(ES): (DI) SCAS 目标 (ES): (DI) LODS (DS): (SI) STOS

100 作业三(续1): 教材:P121 习题 7,8,9,13


Download ppt "3.4.2 算术运算指令(Arithmetic) 算术运算指令内容: 8086/8088提供加、减、乘、除等六种基本算术操作"

Similar presentations


Ads by Google