1 / 100

3.4.2 算术运算指令 ( Arithmetic)

3.4.2 算术运算指令 ( Arithmetic). 算术运算指令 内容: 8086/8088提供加、减、乘、除等六种基本算术操作 (一)加法指令( Addition) ( 二)减法指令( Subtraction) ( 三)乘法指令( Multiplication) ( 四)除法指令( Division) ( 五)符号扩展指令 (六)十进制调整指令. 特点: 大部分都影响标志位 ,不同指令影响不同: (1) 加、减法指令影响 SF,ZF,AF,PF,CF,OF; (2) 加1和减1指令不影响 CF;

chavi
Download Presentation

3.4.2 算术运算指令 ( Arithmetic)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

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) Src:立即数,寄存器,存储器。 dst:寄存器,存储器。 例: 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, 300 ;寄存器+立即数+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开始的单元。 流程图 多字节数内存存放

  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)解答: 溢出------通常是指带符号数的补码溢出。 补码运算能表示范围为:-2 n-1 ~+2 n+1 –1,如果运算结果超出该范围,叫补码溢出,此时OF=1,故用OF标志判断带符号数运算是否超范围(结果溢出)。 进位------是指运算结果的最高位向更高位的进位。 有进位,CF=1;无进位, CF=0,用CF标志判断无符号数运算是否超范围(结果溢出) 。

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

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

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

  14. (3) 带符号数溢出

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

  16. 结论: (1)带符号数相加是否溢出根据OF= 1 ?判断。 OF=1,同符号数相加,结果符号与其相反,产生溢出; OF=0,同符号数相加,结果符号与其相同,不产生溢出; 异号数相加,不可能溢出。 (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) 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 0 正数 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 0 正数 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的值 0 0 0 1 + 1 0 0 0 1 0 0 1 1+8=9正确 例:计算5+7的值 0 1 0 1 + 0 1 1 1 1 1 0 0 + 0 1 1 0 1 0 0 1 0 结果大于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 大写英文字母ASCII为: ‘A’~’Z’ 41H~5AH 程序: MOV AL, ’z’ AND AL, 0DFH ; (AL)=5AH 0110 0001 61H 0100 0001 41H 1101 1111 DFH

  44. 2、 TEST(Test or non_dstructive logical and )测试指令 格式: TEST dst , src; B/W ,(dst)∧(src) src: 立即数、寄存器、存储器。 dst: 寄存器、存储器。 执行操作: 二个操作数相与的结果不保存,置标志位。 操作类型举例: TEST BH, 7 ; 寄存器 ∧ 立即数 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 例: 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. 影响标志位: 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)异或指令常用于判断两个操作数是否相等。(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”指令在多字节累加程序中十分有用。

More Related