《算术逻辑运算类.ppt》由会员分享,可在线阅读,更多相关《算术逻辑运算类.ppt(49页珍藏版)》请在三一办公上搜索。
1、第4章,算术和逻辑运算指令,算术运算类指令用来执行二进制的算术运算:加减乘除。这类指令会根据运算结果影响状态标志,有时要利用某些标志才能得到正确的结果;使用他们时请留心有关状态标志重点掌握加法指令:ADD、ADC、INC 减法指令:SUB、SBB、DEC、CMP、NEG,4.3.2 算术运算类指令,算术运算类指令,可处理:不带符号/带符号的8/16位二进制数 不带符号的压缩型(2位BCD码)/非压缩型(一位BCD码,高4位补0)十进制数,对于加法和减法指令,带符号和不带符号的加减运算的操作过程无区别,可用同一条加法/减法指令完成,对于乘法除法运算,运算过程完全不同,分别设有不带符号和带符号的乘
2、法除法的指令,对于十进制运算,先采用二进制运算指令,后进行十进制调整的方式来实现,加法指令:ADD,ADC和INC减法指令:SUB,SBB,DEC,NEG和CMP他们分别执行字或字节的加法和减法运算,除INC和DEC不影响CF标志外,其他按定义影响全部状态标志位操作数组合:运算指令助记符 reg,imm/reg/mem运算指令助记符 mem,imm/reg,4.3.2.1 加法和减法指令,ADD dest,src;加法:destdestsrc;ADD指令使目的操作数加上源操作数,和的结果送到目的操作数SUB dest,src;减法:destdestsrc;SUB指令使目的操作数减去源操作数,差
3、的结果送到目的操作数,1.加和减指令,MOV AX,7348H;AX7348HADD AL,27H;AL48H27H6FH,AX736FH;OF0,SF0,ZF0,PF1,CF0ADD AX,3fffH;AX736FH3FFFHB36EH;OF1,SF1,ZF0,PF0,CF0,例4 加法,SUB AH,0F0H;AHB3HF0HC3H,AXC36EH;OF0,SF1,ZF0,PF1,CF1MOV word ptr200H,0EF00H;200HEF00H,标志不变SUB 200H,AX;200HEF00HC36EH2B92H;OF0,SF0,ZF0,PF0,CF0SUB SI,SI;SI0;
4、OF0,SF0,ZF1,PF1,CF0,例5 减法,ADC dest,src;加法:destdestsrcCF;ADC指令除完成ADD加法运算外,还要加上进位CF,结果送到目的操作数SBB dest,src;减法:destdestsrcCF;SBB指令除完成SUB减法运算外,还要减去借位CF,结果送到目的操作数,2.带进位加和减指令,MOV AX,7856H;AX7856HMOV DX,8234H;DX8234HADD AX,8998H;AX01EEH,CF1ADC DX,1234H;DX9469H,CF0SUB AX,4491H;AXBD5DH,CF1SBB DX,8000H;DX1468H
5、,CF0,例6 无符号双字加法和减法,CMP dest,src;做减法运算:destsrc;CMP指令将目的操作数减去源操作数,但差值不回送目的操作数比较指令通过减法运算影响状态标志,用于比较两个操作数的大小关系,后面跟转移指令判断两个无符号数大小用JC/JNC或JA/JNBE或JB/JNAE指令判断两个带符号数大小用JG/JNLE或JL/JNGE,3.比较指令CMP(compare),INC reg/mem;增量(加1):reg/memreg/mem1DEC reg/mem;减量(减1):reg/memreg/mem1INC指令和DEC指令是单操作数指令与加法和减法指令实现的加1和减1不同的
6、是:INC和DEC不影响CF标志,INC SI;SISI1DEC byte ptr SI;SISI1,4.增量和减量指令,例7 比较指令CMP(compare),若自BLOCK开始的内存缓冲区中,有100个带符号字数据,要找出其中的最大数,把它存到MAX单元中,MOV BX,OFFSET BLOCKMOV AX,BXINC BXINC BXMOV CX,99AGAIN:CMP AX,BX JG NEXT MOV AX,BX,NEXT:INC BX,INC BXDEC CXJNZ AGAINMOV MAX,AXHLT,NEG reg/mem;reg/mem0reg/memNEG指令对操作数执行求
7、补运算,即用零减去操作数,然后结果返回操作数求补运算可表达成:将操作数按位取反后加1NEG指令对标志的影响与用零作减法的SUB指令一样NEG指令也是一个单操作数指令NEG指令执行的结果一般总是使CF1除非操作数为0时CF0,5.求补指令NEG(negtive),MOV AX,0FF64HNEG AL;AL064H9CH,AXFF9CH;OF0SF1,ZF0,PF1,CF1SUB AL,9DH;ALFFH,AXFFFFH;OF0,SF1,ZF0,PF1,CF1NEG AX;AX0FFFFH0001H;OF0,SF0,ZF0,PF0,CF1DEC AL;AL01H10,AX0000H;OF0,SF
8、0,ZF1,PF1,CF1NEG AX;AX000;OF0,SF0,ZF1,PF1,CF0,例8 求补运算,十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果,以此实现十进制BCD码运算8086指令系统支持两种BCD码调整运算压缩BCD码就是通常的8421码;它用4个二进制位表示一个十进制位,一个字节可以表示两个十进制位,即0099非压缩BCD码用8个二进制位表示一个十进制位,只用低4个二进制位表示一个十进制位09,高4位为0,4.3.2.2 十进制调整指令,十进制调整指令,DAA/DAS指令:十进制调整指令它跟在ADD/ADC或SUB/SBB之后,功能是将AL中十进制数
9、相加/减后的结果进行校正,产生一个组合的十进制和/差,仍保留在AL中,AAA/AAS指令:十进制调整指令它跟在ADD/ADC或SUB/SBB之后,对AL中两个未组合的十进制数相加/减后的结果进行校正,产生一个未组合的十进制和/差,仍保留在AL中,乘法指令分无符号和有符号乘法指令 MUL reg/mem;无符号乘法 IMUL reg/mem;有符号乘法AL或AX与另一个操作数相乘,结果送到AL和AH(两个字节相乘),或送到AX和它的扩展部分DX(两个字相乘)除法指令分无符号和有符号除法指令 DIV reg/mem;无符号除法 IDIV reg/mem;有符号除法字节除法:AX源操作数(8位),商
10、在AL中,余数在AH中字除法:DX,AX 源操作数(16位),商在AX中,余数DX中,4.3.2.3 乘法和除法指令,真值(十进制)864二进制编码08H40H压缩BCD码08H64H非压缩BCD码08H0604HASCII码38H3634H,压缩BCD码加减法调整指令DAA DAS非压缩BCD码加减法调整指令AAA AAS AAM AAD,编码的比较,位操作类指令以二进制位为基本单位进行数据的操作当需要对字节或字数据中的各个二进制位操作时,可以考虑采用位操作类指令注意这些指令对标志位的影响1.逻辑运算指令AND OR XOR NOT TEST2.移位指令SHL SHR SAR SAL3.循环
11、移位指令ROL ROR RCL RCR,4.3.3 逻辑运算指令,双操作数逻辑指令AND、OR、XOR和TEST,根据结果设置SF、ZF和PF状态,而对AF未定义;指令的执行使CFOF0:运算指令助记符 reg,imm/reg/mem运算指令助记符 mem,imm/reg 单操作数逻辑指令NOT不影响标志位:NOT reg/mem,4.3.3.1 逻辑运算指令,对两个操作数执行逻辑与运算,结果送目的操作数,AND dest,src;destdestsrc,只有相“与”的两位都是1,结果才是1;否则,“与”的结果为0,1.逻辑与指令AND,对两个操作数执行逻辑或运算,结果送目的操作数,OR de
12、st,src;destdestsrc,只要相“或”的两位有一位是1,结果就是1;否则,结果为0,2.逻辑或指令OR,对两个操作数执行逻辑异或运算,结果送目的操作数,XOR dest,src;destdestsrc,只有相“异或”的两位不相同,结果才是1;否则,结果为0,3.逻辑异或指令XOR,对两个操作数执行逻辑与运算,结果并不送目的操作数,仅按AND指令影响标志,TEST dest,src;destsrc,AND与TEST指令的关系,同SUB与CMP指令的关系一样,4.测试指令TEST,对一个操作数执行逻辑非运算,NOT reg/mem;reg/memreg/mem,按位取反,原来是“0”的
13、位变为“1”;原来是“1”的位变为“0”,5.逻辑非指令NOT,MOV AL,75H;AL75HAND AL,32H;AL30H;CFOF0,SF0,ZF0,PF1OR AL,71H;AL71H;CFOF0,SF0,ZF0,PF1XOR AL,0F1H;AL80H;CFOF0,SF1,ZF0,PF0NOT AL;AL7FH,标志不变,例9 逻辑运算,AND BL,11110110B;BL中D0和D3清0,其余位不变OR BL,00001001B;BL中D0和D3置1,其余位不变XOR BL,00001001B;BL中D0和D3求反,其余位不变,AND指令可用于复位某些位(同0相与),不影响其他
14、位,OR指令可用于置位某些位(同1相或),不影响其他位,XOR指令可用于求反某些位(同1相异或),不影响其他位,例10 逻辑运算指令的应用,将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作移位指令的第一个操作数是指定的被移位的操作数,可以是寄存器或存储单元;后一个操作数表示移位位数:该操作数为1,表示移动一位该操作数为CL,CL寄存器值表示移位位数(移位位数大于1只能用CL表示)按照移入的位设置进位标志CF,根据移位后的结果影响SF、ZF、PF,4.3.3.2 移位指令,SHL reg/mem,1/CL;reg/mem左移1或CL位;最低位补0,最高位进入CF,演示,1.
15、逻辑左移指令SHL,SHR reg/mem,1/CL;reg/mem右移1/CL位;最高位补0,最低位进入CF,演示,2.逻辑右移指令SHR,SAL reg/mem,1/CL;与SHL是同一条指令,演示,3.算术左移指令SAL,SAR reg/mem,1/CL;reg/mem右移1/CL位;最高位不变,最低位进入CF,演示,4.算术右移指令SAR,MOV DX,6075H;DX01100000 01110101BSHL DX,1;DX11000000 11101010B;CF0,SF1、ZF0、PF0SAR DX,1;DX11100000 01110101B;CF0,SF1、ZF0、PF0SH
16、R DX,1;DX01110000 00111010B;CF1,SF0、ZF0、PF1MOV CL,4;CL4,标志不变SAR DX,CL;DX00000111 00000011B;CF1,SF0、ZF0、PF1,例11 数据移位,XOR AH,AH;实现AH0,同时使CF0SHL AX,1;AX2ALMOV BX,AX;BXAX2ALSHL AX,1;AX4ALSHL AX,1;AX8ALADD AX,BX;AX8AL2AL10AL,逻辑左移一位相当于无符号数乘以2 逻辑右移一位相当于无符号数除以2,例13 将AL寄存器中的无符号数乘以10,循环移位指令类似移位指令,但要将从一端移出的位返回
17、到另一端形成循环。分为:ROL reg/mem,1/CL;不带进位循环左移ROR reg/mem,1/CL;不带进位循环右移RCL reg/mem,1/CL;带进位循环左移RCR reg/mem,1/CL;带进位循环右移循环移位指令的操作数形式与移位指令相同,按指令功能设置进位标志CF,但不影响SF、ZF、PF、AF标志,演示,演示,演示,演示,4.3.3.3 循环移位指令,;将DX.AX中32位数值左移一位SHL AX,1RCL DX,1,32位数据移位,32位无符号数(DX.AX)右移一位32位无符号数(DX.AX)循环右移一位32位无符号数(DX.AX)左移一位,例12 把数字ASCII
18、码转换为BCD码,若是奇数个ASCII码,则把地址最低位的一个转换为BCD码(高4位为0),然后把剩下的偶数个数按统一的方法处理(每两个ASCII码转换成一个压缩的BCD码,且地址高的放在高四位),流程图,MOV SI,OFFSET ASCBUFMOV DI,OFFSET BCDBUFMOV CX,COUNT;个数CXROR CX,1 JNC NEXT;为偶数(C=0即最低位为0),转NEXTROL CX,1;为奇数,则恢复原值MOV AL,SI;取第一个数ALINC SIAND AL,0FH;屏蔽高4位MOV DI,AL;送存储器,由ASCII码转换为BCD码,INC DI DEC CX R
19、OR CX,1;CX/2NEXT:MOV AL,SI;取数AL INC SI AND AL,0FH MOV BL,AL MOV AL,SI INC SI PUSH CX MOV CL,4,由ASCII码转换为BCD码,SAL AL,CLPOP CXADD AL,BLMOV DI,ALINC DILOOP NEXT;(DEC CX JNZ NEXT)HLT,由ASCII码转换为BCD码,练习,将AL的D3和D4位清零,其余位不变将AL的D3和D4位置1,其余位不变内存单元MEN存放着一个8位的数据,将它的高4位与低4位互换将BCD码转换成ASCII码,SHL和SAL指令的功能,SHR指令的功能,SAR指令的功能,ROL指令的功能,ROR指令的功能,RCL指令的功能,RCR指令的功能,