1k likes | 1.2k Vues
3.4.2 算术运算指令 ( Arithmetic). 算术运算指令 内容: 8086/8088提供加、减、乘、除等六种基本算术操作 (一)加法指令( Addition) ( 二)减法指令( Subtraction) ( 三)乘法指令( Multiplication) ( 四)除法指令( Division) ( 五)符号扩展指令 (六)十进制调整指令. 特点: 大部分都影响标志位 ,不同指令影响不同: (1) 加、减法指令影响 SF,ZF,AF,PF,CF,OF; (2) 加1和减1指令不影响 CF;
E N D
3.4.2 算术运算指令(Arithmetic) • 算术运算指令内容: • 8086/8088提供加、减、乘、除等六种基本算术操作 • (一)加法指令( Addition) • (二)减法指令(Subtraction) • (三)乘法指令(Multiplication) • (四)除法指令(Division) • (五)符号扩展指令 • (六)十进制调整指令
特点: • 大部分都影响标志位,不同指令影响不同: • (1) 加、减法指令影响 SF,ZF,AF,PF,CF,OF; • (2) 加1和减1指令不影响CF; • (3) 乘法指令影响CF,OF; • (4) 除法指令使大部分标志位的状态不确定; • (5) 对BCD码调整指令对标志位的影响不同; • (6) 转换指令对标志位无影响 • 都可以用于字节、字的运算; • 双操作数指令除源为立即数外,其余必须有一个操作数 为寄存器;单操作数指令不能为立即数。
(一)加法指令(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)加法十进制调整指令
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;存储器+立即数
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
应用举例: 计算两个多字节数相加 3B74AC60F8H+20D59E36C1H=? 两个多字节数存放在: DATA1,DATA2开始的单元。 流程图 多字节数内存存放
程序: 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位、16位的无符号数和带符号数的加法运算; • 源操作数和目标操作数不能同时为存储器, 不能为段寄存器; • 指令影响标志位的情况: • OF=1, 8位带符号数相加,和超出范围(-128~+127), • 16位带符号数相加,和超出范围(-32768~+32767); • CF=1, 8位无符号数相加,和超过255, • 16位无符号数相加,和超过65535。 • 其他条件标志(SF,AF,PF,ZF)根据定义设定。
例: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 (两个正数相加,结果为负;反之亦是)
问题思考: 分析两标志位(1) 什么叫溢出?什么叫进位? (2) 有进位就有溢出,没有进位就没有溢出? (1)解答: 溢出------通常是指带符号数的补码溢出。 补码运算能表示范围为:-2 n-1 ~+2 n+1 –1,如果运算结果超出该范围,叫补码溢出,此时OF=1,故用OF标志判断带符号数运算是否超范围(结果溢出)。 进位------是指运算结果的最高位向更高位的进位。 有进位,CF=1;无进位, CF=0,用CF标志判断无符号数运算是否超范围(结果溢出) 。
(2)有进位就有溢出,没有进位就没有溢出?(2)有进位就有溢出,没有进位就没有溢出? 结论: 有进位不一定有溢出,没有进位不一定没有溢出。 以8位二进制数为例分析一下数的溢出与进位情况: 下面分4种情况加以讨论: (1) 带符号数和无符号数都不溢出 (2) 无符号数溢出 (3) 带符号数溢出 (4) 带符号数和无符号数都溢出
二进制数 看作无符号数 看作带符号数 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) 无符号数溢出
结论: (1)带符号数相加是否溢出根据OF= 1 ?判断。 OF=1,同符号数相加,结果符号与其相反,产生溢出; OF=0,同符号数相加,结果符号与其相同,不产生溢出; 异号数相加,不可能溢出。 (2)无符号数相加是否溢出根据CF= 1 ?判断。 CF=1,无符号数相加产生溢出。 (3)对标志的解释,取决于程序员。如带符号数只关心OF、SF;无符号数只关心CF,而OF、SF无意义 。
3、INC (Increment by 1 )加 1 指令 格式: INC dst ;(B/W), (dst)←(dst)+1 dst : 寄存器、存储器。不能是段寄存器。 功能:对指定的目标操作数+1 操作数单元。 用途:用于在循环程序中修改地址指针和循环次数。 标志位影响情况:影响SF,ZF,AF,PF,OF。 不影响CF。
操作数类型:可以是寄存器,存储器,不能是段寄存器。操作数类型:可以是寄存器,存储器,不能是段寄存器。 例: INC DL ; 8位寄存器+1 INC SI ;16位寄存器+1 INC BYTE PTR [BX][SI] ;存储器+1(字节操作) INC WORD PTR [DI] ;存储器+1(字操作) INC DS ; 错
(二)减法指令(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)减法十进制调整指令
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,带符号数运算溢出。
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
3、DEC (Decrement by 1 ) 减 1 指令 格式: DEC dst ;(B/W) (dst)←(dst)-1 dst : 寄存器 、存储器。不能是段寄存器。 功能:对指定的目标操作数-1 操作数单元。 用途:用于在循环程序中修改地址指针和循环次数。 标志位影响情况:影响SF,ZF,AF,PF,OF。 不影响CF。
DEC 用途举例: … MOV AX , 0FFFFH CYC: DEC AX JNZ CYC HLT … 用于延时时间。
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.
应用举例:求绝对值 在内存中, 从AREA1开始存放100个带符号数。 求各数的绝对值存于AREA2的开始单元。 流程图
程序: 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
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;存储器与立即数比较
用途: 用比较指令来比较两个数之间的关系: 两者是否相等,两个数中哪个大。 (1) 根据ZF标志,判断两者是否相等; (2) 根据CF标志, 判断两个无符号数的大小; (3) 用SF、OF标志,判断二个带符号数的大小。
(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标志,判断二个带符号数的大小(分析略)
(三)乘法指令(Multiplication) • 可对字节、字进行操作;两个8位数相乘,结果为16位数,两个16位数相乘,结果为32位数; • 可对无符号整数或有符号整数进行操作;对应有两条乘法指令。 1、MUL(Multiply) 无符号数乘法指令 格式:MUL src ; 字节操作 (AX)←(AL)×(src) ;字操作 (DX), (AX)←(AX)×(src) 2、IMUL(Integer Multiply) 有符号数乘法指令 格式:IMUL src ; 执行的操作同MUL,只是处理的数据是带符号的。
说明: 1、被乘数(即dst)隐含在AL或AX中,乘数(即src)由指令寻址,其寻址方式可以是除立即寻址方式之外的任何数据寻址方式,同时,它也决定了乘法是字运算还是字节运算。 2、乘法指令对除CF和OF以外的标志位无定义(即状态不定),如果乘积的高一半为0(或为符号位),则CF和OF均为0,否则均为1。 例: MUL CL IMUL DL MUL BYTE PTR[BX] IMUL NUMR
(四)除法指令(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 ,只是处理的数据是带符号的,商和余数均为有符号数,余数符号同被除数符号。
说明: 1、被除数(即dst)隐含在AX 或(DX,AX)中,除数(即src)由指令寻址,其寻址方式可以是除立即寻址方式之外的任何数据寻址方式,同时,它也决定了除法是字运算还是字节运算。 2、除法指令对所有标志位无定义(即状态不定)。 3、执行除法指令时如果产生商溢出,微处理器就会产生除法错中断。 例: DIV CL IDIV DL DIV BYTE PTR[BP] IDIV WORD PTR[BX]
(五)符号扩展指令 功能: 将带符号的字节类型(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 *指令执行后不影响标志位
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 *指令执行后不影响标志位
例: 使NUMB2字节存储单元的内容除以NUMB1字节存储单元的内容,将商存于ANSQ字节单元中,余数存于ANSR字节单元中。 MOV AL,NUMB2 CBW IDIV NUMB1 MOV ANSQ,AL;商 MOV ANSR,AH;余数
(六)十进制调整指令 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)减法十进制调整指令
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中。
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正确
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 (根据运算结果设置) • ↕ ↕ ↕
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 ; 存储器 ∧ 立即数
“与”指令的用途: (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位。
“与”指令应用举例 例:将英文小写字母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
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 ;存储器 ∧ 立即数
用途:是条件转移指令的先行指令,常用于检测一些条件是否满足,但又不希望改变原有的操作数的情况,检测的位与“1”相与;不检测的位与“0” 相与。在此指令后边常加一条条件转移指令。 例:判断A单元中数据的奇偶性 设: (A L)= 0AEH 程序:MOV AL,A ;(AL)=0AEH TEST AL,01H JZ EVEN ; 结果=0为偶数转EVEN … 奇数处理 … EVEN:偶数处理 检测(AL)的最低位是否为0,若为0转EVEN
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 ;存储器 立即数 ∧ ∧ ∧ ∧ ∧
影响标志位: 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
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 ; 存储器 立即数
影响标志位: 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
(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”指令在多字节累加程序中十分有用。