您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 微机原理与接口第4章4-逻辑运算及串操作指令解读
第4章80x86指令系统1三、逻辑类指令(位操作指令)这一类指令包括逻辑运算指令、移位指令和循环移位指令等三组。位操作类指令以二进制位为基本单位进行数据的操作当需要对字节或字数据中的各个二进制位操作时,可以考虑采用位操作类指令注意这些指令对标志位的影响–逻辑运算指令–ANDORXORNOTTEST–移位指令–SHLSHRSAR–循环移位指令–ROLRORRCLRCR第4章80x86指令系统21.逻辑运算指令逻辑运算类指令与算术运算指令不同算术指令是按字节或字进行算术运算,而逻辑运算指令是把操作数按位来进行逻辑运算。“与”运算指令格式:ANDdst,src“或”运算指令格式:ORdst,src“非”运算指令格式:NOTopr“异或”运算指令格式:XORdst,src测试指令格式:TESTdst,src说明:TEST相当于AND运算,但是不保存结果,仅影响标志。第4章80x86指令系统31逻辑运算指令逻辑运算指令•NOT目的;取反指令•AND目的,源;按位与指令•OR目的,源;按位或指令•XOR目的,源;按位异或指令•TEST目的,源;测试指令,与AND指令操作相同,只是不改变目的操作数的内容•单操作数逻辑指令NOT不影响标志位,操作数与INC、DEC和NEG一样:第4章80x86指令系统4逻辑与指令AND对两个操作数执行逻辑与运算,结果送目的操作数ANDdest,src;dest←dest∧src只有相“与”的两位都是1,结果才是1;否则,“与”的结果为0第4章80x86指令系统5逻辑或指令OR对两个操作数执行逻辑或运算,结果送目的操作数ORdest,src;dest←dest∨src只要相“或”的两位有一位是1,结果就是1;否则,结果为0第4章80x86指令系统6逻辑异或指令XOR对两个操作数执行逻辑异或运算,结果送目的操作数XORdest,src;dest←dest⊕src只有相“异或”的两位不相同,结果才是1;否则,结果为0第4章80x86指令系统7测试指令TEST•对两个操作数执行逻辑与运算,结果并不送目的操作数,仅按AND指令影响标志TESTdest,src;dest∧srcAND与TEST指令的关系,同SUB与CMP指令的关系一样第4章80x86指令系统8逻辑非指令NOT对一个操作数执行逻辑非运算NOTreg/mem;reg/mem←~reg/mem按位取反,原来是“0”的位变为“1”;原来是“1”的位变为“0”第4章80x86指令系统9例逻辑运算moval,75h;AL=75Handal,32h;AL=30H;CF=OF=0,SF=0,ZF=0,PF=1oral,71h;AL=71H;CF=OF=0,SF=0,ZF=0,PF=1xoral,0f1h;AL=80H;CF=OF=0,SF=1,ZF=0,PF=0notal;AL=7FH标志不变第4章80x86指令系统10逻辑运算指令的应用andbl,11110110b;BL中D0和D3清0,其余位不变orbl,00001001b;BL中D0和D3置1,其余位不变xorbl,00001001b;BL中D0和D3求反,其余位不变AND指令可用于复位某些位(同0相与),不影响其他位OR指令可用于置位某些位(同1相或),不影响其他位XOR指令可用于求反某些位(同1相异或),不影响其他位第4章80x86指令系统11例4.7从偏移地址TABLE开始的内存区中,存放着100个字节型数据,要求将这些数进行累加,并将累加和的低位存SUM单元,高位存SUM+1单元。程序如下:LEABX,TABLE;(BX)←数据表地址指针MOVCL,100;(CL)←数据块长度XORAX,AX;清AL、AH,并清进位CFLOOPER:ADDAL,[BX];加一个数到ALJNCGOON;如(CF)=0,转移到GOONINCAH;否则,AH加1GOON:INCBX;地址指针加1DECCL;计数值减1JNZLOOPER;如(CL)≠0,转移到LOOPERMOVSUM,AX;否则,(SUM)←(AL),(SUM+1)←(AH)HLT;停止第4章80x86指令系统12常见的用法⑴清进位标志位:ANDAX,AX或ORAL,AL等⑵清零操作数:XORAX,AX不仅把AX清零,而且也影响了状态标志⑶把某几位取反:用XOR指令,把要取反的位和1异或,不变的位和0异或⑷清零或置位某几位:用AND指令清零,用OR指令置位第4章80x86指令系统132移位指令•将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作•移位指令的第一个操作数是指定的被移位的操作数,可以是寄存器或存储单元;后一个操作数表示移位位数:–该操作数为1,表示移动一位–该操作数为CL,CL寄存器值表示移位位数(移位位数大于1只能CL表示)•按照移入的位设置进位标志CF,根据移位后的结果影响SF、ZF、PF第4章80x86指令系统14逻辑左移指令SHL(shiftlogicalleft)SHLreg/mem,1/CL;reg/mem左移1或CL位;最低位补0,最高位进入CFSHL和SAL指令的功能演示第4章80x86指令系统16例4.8将一个16位无符号数乘以10。该数原来存放在以FACTOR为首地址的两个连续的存储单元中(低位在前,高位在后)。因为FACTOR10=(FACTOR8)+(FACTOR2),故可用左移指令实现以上乘法运算。编程如下:MOVAX,FACTOR;(AX)←被乘数SHLAX,1;(AX)=FACTOR2MOVBX,AX;暂存BXSHLAX,1;(AX)=FACTOR4SHLAX,1;(AX)=FACTOR8ADDAX,BX;(AX)=FACTOR10HLT以上程序的执行时间大约需26个时钟。如用乘法指令编程,执行时间将超过130个时钟。第4章80x86指令系统17逻辑右移指令SHR(shiftlogicalright)SHRreg/mem,1/CL;reg/mem右移1/CL位;最高位补0,最低位进入CF第4章80x86指令系统18例4.9将一个16位无符号数除以512。该数原来存放在以DIVIDAND为首地址的两个连续的存储单元中。因为DIVIDAND÷512=(DIVIDAND÷2)÷256,故可用逻辑右移指令完成上述除法运算。编程如下:MOVAX,DIVIDAND;(AX)←被除数SHRAX,1;(AX)=DIVIDAND÷2XCHGAL,AH;(AL)←→(AH),相当于循环右移8位CBW;清AX的高8位,(AX)=DIVIDAND÷512HLT当然,也可以将立即数9传送到CL寄存器,然后用指令SHRAX,CL完成除以512的运算。但是相比之下,上面的程序执行速度更快。第4章80x86指令系统19算术左移指令SAL(shiftarithmeticleft)SALreg/mem,1/CL;与SHL是同一条指令SHL和SAL指令的功能第4章80x86指令系统21算术右移指令SAR(shiftarithmeticright)SARreg/mem,1/CL;reg/mem右移1/CL位;最高位不变,最低位进入CF第4章80x86指令系统233)循环移位指令8086/8088指令系统有四条循环移位指令,不带进位标志CF的左循环移位指令ROL和右循环移位指令ROR(也称小循环),以及带进位标志CF的左循环移位指令RCL和右循环移位指令RCR(也称大循环)。循环移位指令的操作数类型与移位指令相同,可以是8位或16位的寄存器或存储器。指令中指定的左移或右移的位数也可以是1或由CL寄存器指定,但不能是1以外的常数或CL以外的其他寄存器。所有循环移位指令都只影响进位标志CF和溢出标志OF,但OF标志的含义对于左循环移位指令和右循环移位指令有所不同。第4章80x86指令系统24循环移位指令(rotate)•循环移位指令类似移位指令,但要将从一端移出的位返回到另一端形成循环。分为:ROLreg/mem,1/CL;不带进位循环左移RORreg/mem,1/CL;不带进位循环右移RCLreg/mem,1/CL;带进位循环左移RCRreg/mem,1/CL;带进位循环右移•循环移位指令的操作数形式与移位指令相同,按指令功能设置进位标志CF,但不影响SF、ZF、PF、AF标志演示演示演示演示第4章80x86指令系统29(1)循环左移指令ROL(ROtateLeft)。指令格式:ROLdst,1/CLROL指令将目的操作数向左循环移动1位或移CL寄存器指定的位数。最高位移到进位标志CF,同时最高位移到最低位形成循环,进位标志CF不在循环回路之内。ROL指令的操作如图4.24所示。CFdst图4.24ROL指令操作示意图第4章80x86指令系统30ROL指令将影响CF和OF两个状态标志位。如果循环移位次数等于1,且移位以后目的操作数新的最高位与CF不相等,则(OF)=1,否则(OF)=0。因此,OF的值表示循环移位前后符号位是否有所变化。如果移位次数不等于1,则OF的值不确定。ROL指令的例子如下:ROLBH,1;寄存器循环左移1位ROLDX,CL;寄存器循环左移(CL)位ROLWORDPTR[DI],1;存储器循环左移1位ROLBYTEPTRALPHA,CL;存储器循环左移(CL)位第4章80x86指令系统31(2)循环右移指令ROR(ROtateRight)。指令格式:RORdst,1/CLROR指令将目的操作数向右循环移动1位或移CL寄存器指定的位数。最低位移到进位标志CF,同时最低位移到最高位。该指令的操作如图4.25表示。ROR指令也将影响状态标志位CF和OF。若循环移位次数等于1且移位后新的最高位和次高位不等,则(OF)=1,否则(OF)=0。若循环移位次数不等于1,则OF的值不确定。图4.25ROR指令操作示意图CFdst第4章80x86指令系统32下面是ROR指令的几个例子:RORCX,1;寄存器循环右移1位RORBH,CL;寄存器循环右移(CL)位RORBYTEPTRBETA,1;存储器循环右移1位RORWORDPTRALPHA,CL;存储器循环右移(CL)位第4章80x86指令系统33(3)带进位循环左移指令RCL(RotateLeftthroughCarry)。指令格式:RCLdst,1/CLRCL指令将目的操作数连同进位标志CF一起向左循环移动1位或移CL寄存器指定的位数。最高位移入CF,而CF移入最低位。该指令的操作如图4.26所示。RCL指令对状态标志位的影响与ROL指令相同。图4.26RCL指令操作示意图CFdst第4章80x86指令系统34(4)带进位循环右移指令RCR(RotateRightthroughCarry)。指令格式:RCRdst,1/CLRCR指令将目的操作数与进位标志CF一起向右循环移动1位或移CL寄存器指定的位数。最低位移入进位标志CF,CF则移入最高位。该指令的操作如图4.27所示。RCR指令对状态标志位的影响与ROR指令相同。图4.27RCR指令操作示意图CFdst第4章80x86指令系统35这里介绍的四条循环移位指令与前面讨论过的移位指令有所不同,循环移位之后,操作数中原来各位的信息不会丢失,而只是移到了操作数中的其他位或进位标志上,必要时还可以恢复。利用循环移位指令可以对寄存器或存储器中的任一位进行位测试。例如,要求测试AL寄存器中第5位的状态是“0”还是“1”,可利用以下指令实现:MOVCL,5;(CL)←移位次数ROLAL,CL;(CF)←AL的第5位JNCZERO;若(CF)=0,转ZERO…;否则…ZERO:…第4章80x86指令系统36说明⑴逻辑移位适用于无符号数,算术移位适用于有符号数。⑵逻辑左移和算术左移的机器码完全相同,是助记符的两种写法。ROL循环左移:操作数整体左移,最高位移到CF,最低位补原最高位ROR循环右移:操作数整体右移,最低位移到CF,最高位补原最低位RCL带进位的循环左移:类似于ROL循环移位,CF加入到循环圈中。RCR带进位
本文标题:微机原理与接口第4章4-逻辑运算及串操作指令解读
链接地址:https://www.777doc.com/doc-4316151 .html