《汇编语言程序设计》第8章:逻辑运算.ppt

上传人:sh****n 文档编号:12666471 上传时间:2020-05-13 格式:PPT 页数:43 大小:1.33MB
返回 下载 相关 举报
《汇编语言程序设计》第8章:逻辑运算.ppt_第1页
第1页 / 共43页
《汇编语言程序设计》第8章:逻辑运算.ppt_第2页
第2页 / 共43页
《汇编语言程序设计》第8章:逻辑运算.ppt_第3页
第3页 / 共43页
点击查看更多>>
资源描述
汇编语言程序设计-朱耀庭,南开大学朱耀庭,第8章逻辑运算,逻辑运算指令是对字节或字中的各位进行运算的指令,即它是位运算指令。在目前计算机广泛应用的情况下,计算机大量的工作不是进行算术运算,而是进行信息处理、信息传送,这些都需要做大量的位运算。在研制系统软件或进行软件开发中也需要大量的位运算。本章结合二进制数和BCD码的输入/输出问题来介绍逻辑运算指令的应用。与算术运算指令一样,逻辑运算的结果也对标志寄存器产生影响。希望同学们在掌握逻辑运算指令及其程序设计的同时,关注逻辑运算与条件转移指令的关系,为分支程序设计奠定基础,南开大学朱耀庭,第8章逻辑运算,8.4逻辑运算指令应用,8.3循环移位指令,8.2移位指令,8.1逻辑运算指令,南开大学朱耀庭,8.1逻辑运算指令,南开大学朱耀庭,1.AND指令,格式:AND目的操作数,源操作数功能:AND将两个操作数(字节或字)进行按位“逻辑与”运算,结果送回目的操作数。若原来的两个操作数中的对应位均为1,则结果中的该位置1;否则,该位置0。作用:用AND指令可以将一个字节或字中的某些特定位清零,或者说将某些特定位截取下来。AND指令执行后,标志CF=0,OF=0,PF,SF,ZF反映操作的结果;AF未定义。例如,设AL的每一位代表一个灯或开关状态,1表示灯亮或开关ON、0表示灯灭或开关OFF。则指令:ANDAL,10111111B的作用就是关掉第6位所在位置的灯或开关,其他位对应灯或开关状态不变。而:ANDAL,01000000B的作用是关掉除第6位以外的灯或开关,而第6位的灯或开关保留原状态。,南开大学朱耀庭,2.TEST指令,格式:TEST目的操作数,源操作数功能:TEST对两个操作数进行逻辑与运算,但结果并不送至目的操作数。只是影响状态标志。此指令执行后两个操作数都不变。作用:这条指令常用来检测一些条件是否满足,但又不希望改变原有的操作数的情况,即适用于检查一个字节或字中的某些特定位是否有一位为1。方法是:将要检查的字节或字作为本指令的一个操作数,另一个操作数为指令要检查的位的逻辑乘常数。如果测试结果(TEST指令执行结果)不为0(即ZF=0),则说明至少有一个特定位为1。因此,通常是在TEST指令后面跟上一条条件转移指令,以便根据ZF是否为0来进行转移,南开大学朱耀庭,2.TEST指令,例如:设AL的每一位代表一个灯或开关状态,1表示灯亮或开关ON、0表示灯灭或开关OFF。则程序段:TESTAL,01000000BJNZL;第6位对应灯亮或开关ON转标号L执行;第6位对应灯灭或开关OFF转标号L执行例如:检查BL的低4位是否至少有一位为1的程序段可以书写如下:TESTBL,0FHJEL;ZF=1时转L(即低4位全为0时转L处);低4位至少有一位为1时的处理L:;低4位全为0时的处理,南开大学朱耀庭,3.OR指令(逻辑或、逻辑加),格式:OR目的操作数,源操作数功能:OR指令将两个操作数(字节或字)进行按位逻辑加操作,并将结果送至目的操作数。如果两个操作数中对应位有一个为1或全为1,则结果的该位为1;否则,结果的该位为0。OR指令对状态标志的影响同AND指令。OR指令往往用于对字节或字的特定位置数(拼数)。例如:ORAL,30H;将AL高4位拼上3又如:设AL的每一位代表一个灯或开关状态,1表示灯亮或开关ON、0表示灯灭或开关OFF。则指令:ORAL,01000000B的作用就是打开第6位所在位置的灯或开关,其他位对应灯或开关状态不变,南开大学朱耀庭,4.XOR指令(逻辑异或、称按位加),格式:XOR目的操作数,源操作数功能:XOR指令将两个操作数(字节或字)进行按位逻辑异或操作,并将结果送至目的操作数。如果两个操作数中对应位相同(均为0或均为1),则结果该位为0;否则,结果该位为1。该指令对状态标志的影响和AND指令相同。XOR指令适用于对一个数(字节或字)或一个数的特定位求反例如:将AL寄存器中数01011100B求反,只要逻辑异或常数0FFH(即8位全1)即可。MOVAL,01011100BXORAL,0FFH;10100011B=AL,南开大学朱耀庭,4.XOR指令(逻辑异或、称按位加),再如:将AL寄存器的中间4位求反,只要逻辑异或立即数00111100B(即3CH)即可XORAL,3CH又如:XORAL,BLXORAL,BL结果AL不变。在图形显示时,这一特性往往用于动画制作。想想为什么?,南开大学朱耀庭,4.XOR指令(逻辑异或、称按位加),注意:以上4个逻辑指令的两个操作数均可以是同数据类型的寄存器操作数;或同数据类型的一个寄存器操作数和一个内存操作数;或目的操作数是寄存器或存储器,源操作数为立即数。例如:ANDALPHADI,0FHORGAMMABXSI,3030H;其中GAMA为字变量XORA,0FFH;其中A为字节变量TESTBYTEPTRDI,0F0H,南开大学朱耀庭,5.NOT指令(逻辑非、或叫求反码),格式:NOT目的操作数功能:NOT指令对目的操作数的每一位求反码,并将结果送回目的操作数此指令只有目的操作数,目的操作数可以是通用寄存器也可以是存储器。具体操作是从0FFH(对于字节来说)或从0FFFFH(对字来说)中减去指定的操作数,并将结果送回目的操作数。此指令不改变状态标志,南开大学朱耀庭,8.2移位指令,南开大学朱耀庭,1.SHL指令(逻辑左移),格式:SHL目的操作数,COUNT其中,目的操作数可以是通用寄存器,也可以是存储器。功能:SHL指令将目的操作数左移COUNT次(位)。最高位移入进位标志CF中去,而CF中原来的值被冲掉。移位后空出的最低位中填0,如图8-1所示。,图8-1SHL指令操作过程,动画演示,南开大学朱耀庭,1.SHL指令(逻辑左移),移位次数COUNT若为1,则:SHL目的操作数,。移位后目的操作数的最高位与CF不同,则将OF置1,否则OF=0。对于带符号数来说,这用来表示移位以后的符号位与移位前的符号位是否相同。若相同则OF=0,表示没有产生超位结果(因为每左移1位数值就扩大1倍)。移位次数COUNT不为1,则:MOVCL,COUNT且SHL目的操作数,CL。移位后OF的值不能确定。状态标志PF、SF、ZF表示移位后的结果;标志AF(辅助进位)总是不确定的;CF中总是包含从目的操作数中移出的最后一位的值。例如:SHLAL,1;将(AL)左移一位MOVCL,3SHL,AL,CL;将(AL)左移3位,南开大学朱耀庭,1.SHL指令(逻辑左移),用SHL指令将一个无符号数左移1位等于将数倍增(乘2),用SHL指令使数倍增比用乘法指令速度快得多。可以通过CF是否为0检查移位结果是否超位。比如,将8位数65(01000001B)左移1位得到130(10000010B)。这时CF=0指明没有超位。再将130左移1位得到4(00000100B)。这时CF=1表明已超位,此时将OF置位(置1)。因此通过检查OF也可以知道是否超位。检查超位的方法是在移位指令后面跟上一条测试CF(或OF)的条件转移指令。,例8-1读以下程序,并且说明输入一个字符后输出什么,南开大学朱耀庭,2.SHR指令(逻辑右移),格式:SHR指令格式和SHL相同。功能:将一个无符号数向右移位,左边(最高位)出现空位补0,右边(低位)移至CF,如图8-2所示。此指令影响状态标志:CF,OF,PF,SF,ZF,但AF不确定。,图8-2SHR指令操作过程,动画演示,南开大学朱耀庭,2.SHR指令(逻辑右移),SHR指令适用于将一个无符号数减半,右移1位等于将数除以2。用SHR指令使数减半比用除法指令速度要快得多。另外,可以通过右移1位后看CF是否为0,检查数是否为偶数。CF为1表明此数不是偶数。比如将8位数11(0000101B)右移1位得到5(00000101),这时CF=1,故数11不是偶数。检查的方法是在移位指令后跟上一条测试CF的条件转移指令。,南开大学朱耀庭,3.SAL指令(算术左移),SAL指令同SHL指令,实际上SHL和SAL是同一条指令的两种助记符,它们执行的操作完全一样它一般用于带符号位的数的倍增(乘2)对于带符号的数检查超位时只能测试OF,南开大学朱耀庭,4.SAR指令(算术右移),SAR指令类似于SHR指令,SAR同SHR的区别在于:SHR是连同符号位一起右移,左边(最高位)出现的空位补0;而SAR右移时符号位不动(保持不变),左边(数的最高位)出现的空位补上符号位的值。SAR指令的操作如图8-3所示。,图8-3SAR指令操作过程,动画演示,南开大学朱耀庭,4.SAR指令(算术右移),SAR指令适用于将带符号位的数减半(除以2)。例如,用SAR指令将8位数+8(00001000)右移1位得到+4(00000100);将8位数-120(10001000)右移1位得-60(110001000)。另外,用SAR指令将+5(00000101)右移1位(减半)得+2(00000010);用SAR指令将-5(11111011)右移1位(减半)得-3(11111101)。可见SAR将奇数右移1位时,总是得出比该数的一半还小的结果。值得注意的是:如果目的操作数为负的,且其中具有1的位数移出以后,则SAR指令产生的结果与用整数除IDIV指令产生的结果是不一样的。例如,-5经SAR在右移1位之后得-3,而用IDIV作整数-5被2除后得-2。这是因为IDIV指令将所有的数(包括正、负)向0进行舍入,而SAR指令将正数向0进行舍入,将负数向负无穷大进行舍入。,南开大学朱耀庭,4.SAR指令(算术右移),SAR影响状态标志有CF,OF,PF,SF,ZF综上所述,移位指令可以对字节(8位)或字(16位)中的位进行操作。指令的第一个操作数为目的操作数,目的操作数可以是通用寄存器,也可以是存储器(各种寻址方式)。指令的第二个操作数不是通常的源操作数,而是移位次数计数值操作数,一条指令可实现高达255次移位的操作。指令中的移位计数值可以指定为1,或指定为寄存器CL,CL中包含移位次数。因此,需要事先将移位次数送入CL寄存器。,南开大学朱耀庭,4.SAR指令(算术右移),移位指令对标志的影响如下所述:(1)在移位指令执行后,AF总是不确定的。(2)同逻辑指令、算术指令一样,通常移位指令的结果也要影响SF、ZF和PF。(3)CF中总是含有从目的操作数中移出的最后一位的值。(4)在执行多位移位后,OF的内容不确定。对于1位的移位操作,如果操作数的最高位(符号位)在指令执行后被改变,OF就被置位;反之,如果操作数的最高位在指令执行后仍保持原来的值,则OF被清零。,南开大学朱耀庭,4.SAR指令(算术右移),在数的输入输出过程中,乘10的操作是经常要进行的。80868088提供了乘法指令,乘10可以采用乘法指令来做,但是如果我们查阅一下80868088有关乘法指令的资料,可以知道,乘法指令执行时间最短的是在寄存器中的两个字节相乘,需要70个时钟。而X*10=X*2X*8,因此,将AL中的数乘10也可以采用移位和相加的办法来实现,故可用以下程序段实现之。指令注解时钟数SALAL,1;X*22MOVBL,AL;送至BL暂存2SALAL,1;X*42SALAL,1;X*82ADDAL,BL;X*103,南开大学朱耀庭,4.SAR指令(算术右移),这样,从指令的数量来说,虽多了些,但是执行时间却要短得多。总共需要执行时间为11个时钟。其中,X*2也可以用XX来实现,因此X*10也可以用以下程序段实现。指令注解时钟数ADDAL,AL;X*23MOVBL,AL;送至BL暂存2ADDAL,AL;X*43ADDAL,AL;X*83ADDAL,BT;X*103总执行时间为14个时钟,因此,采用移位的方法实现乘10是较合适的,例8-2读以下程序,并且说明输入一个字符后输出什么,南开大学朱耀庭,8.3循环移位指令,南开大学朱耀庭,1.ROL指令(循环左移),ROL指令,每执行一次(每移1位),把最高位移到最低位,同时还把最高位移到CF。其操作示意如图8-4所示:,图8-4ROL指令操作过程,动画演示,南开大学朱耀庭,1.ROL指令(循环左移),当循环移位次数为1时,若循环左移以后操作数的最高位不等于CF,则将溢出标志OF置1否则OF=0。这可以用来表示移位前后的符号是否改变(OF=0,表示符号未变)ROL指令只影响状态标志CF和OF,例8-3读以下程序,并且说明输入一个字符后输出什么,南开大学朱耀庭,2.ROR指令(循环右移),ROR指令与ROL指令类似,只是目的操作数(字节或字)中的各位循环右移,而不是循环左移。操作示意如图8-5所示:,图8-5ROR指令操作过程,动画演示,南开大学朱耀庭,3.RCL指令(通过进位循环左移),RCL指令对目的操作数字节或字中的各位循环左移,进位标志CF被看作目的操作数的“一部分”。每执行一次(移动1位),CF的值循环移入目的操作数的低位,而目的操作数的高位移入CF。操作示意如图8-6所示:,图8-6RCL指令操作过程,动画演示,南开大学朱耀庭,4.RCR指令(通过进位循环右移),RCR指令与RCL指令类似,只是各位循环右移,而不是循环左移。操作示意如图8-7所示:,图8-7RCR指令操作过程,动画演示,南开大学朱耀庭,4.RCR指令(通过进位循环右移),循环移位与算术或逻辑移位不同,循环移位时移出操作数的位并不丢失,而是循环送回操作数的另一端。移位的位数也由计数值操作数(即COUNT)规定,这一点和算术或逻辑移位指令一样。计数值可以指定为常数1,或指定为CL寄存器。循环移位指令可以对字节或字进行操作。因为它将移出的位移至CF,而且只要循环移位8位(对字节)或16位(对字),操作数就会恢复原状。因此,可以利用循环移位后测试CF的方法测试字节或字的某一位是0还是1。方法是利用循环移位指令将要测试的那一位移入CF,然后由测试CF的条件转移指令JC(CF为1时转移)或JNC(CF为0时转移)进行测试。如果再想恢复操作数原来的值,只要继续用同样的循环移位指令移完8位或16位即可。RCL和RCR这两条带进位标志的循环移位指令将进位标志看作是操作数的扩展部分,这就允许CF作为一位信息移入操作数,利用这一点可以实现多字节数的移位。,南开大学朱耀庭,4.RCR指令(通过进位循环右移),例如,若有一个双字数,它们或是放在两个通用寄存器中(例如DX和AX),或是存放在连续的内存字单元中,那么怎样实现这4个字节数整个左移1位或整个右移1位呢?拿左移1位来说,可以先使低16位左移1位;再把高16位左移1位,其中的困难在于如何将低16位中的最高位移至高16位的最低位。用逻辑左移指令可以把低16位中的最高位移至进位标志CF中,而要把高16位也左移一位,并且将CF的值移至它的低位,必须用带进位标志循环左移指令RCL来完成。即可以用以下指令实现之:SHLAX,1RCLDX,1或SHLFIRST_WORD,1RCLSECOND_WORD,1,南开大学朱耀庭,8.4逻辑运算指令应用,BCD码的输入输出,二进制数的输入输出,8.4.1,8.4.2,南开大学朱耀庭,8.4.1BCD码的输入输出,例8-4非压缩型BCD码的输入(ASCII码转换成非压缩BCD码)实例。题目:从键盘上输入一个8位十进制数,要求将它以真正的非压缩型BCD码的形式存放在内存输入缓冲区。设计思路:需要将输入的十进制数字(09)的ASCII码转换成对应的BCD码。09数字的ASCII码为30H,31H,39H。因此,只要用逻辑指令AND将其高4位清零,即为其对应的非压缩型BCD码。为此,需要在数据段分配一个具有8个字节的内存输入缓冲区。假设从十进制数的高位开始输入,将输入的数字转换成对应的BCD码后从低地址字节开始依次存放。其实现程序如下:,例8-4非压缩型BCD码的输入实例,南开大学朱耀庭,8.4.1BCD码的输入输出,例8-5非压缩型BCD码的输出(非压缩型BCD码转换成ASCII码)实例。题目:将内存缓冲区中的十进制数字(非压缩型BCD码)显示在屏幕上。设计思路:假设十进制数字低位存放在低地址字节,输出时应从高位开始依次显示出来。显示输出数字时,应将09数字转换成ASCII码,即用OR指令将其高4位拼上3,例8-5非压缩型BCD码的输出实例,南开大学朱耀庭,8.4.1BCD码的输入输出,例8-6压缩型BCD码的输入实例。题目:输入数字字符以ASCII码形式存到内存中,然后转换成压缩型BCD码重新存到内存中。设计思路:从高位开始输入十进制数字(例如:3,2,4,9,5),以ASCII码的形式从低地址字节开始依次存入ASC_BUF。数字以空格键为结束,并且在接受数字字符时在CX寄存器里记下个数。若个数为奇数则将数字字符往后移动一个字节,空出的第1个字节填入0,并将个数加1使之为偶数个。因此,个数减半为转换成压缩型BCD码后所占的字节数,将这个数字存入BCD_BUF缓冲区的第1个字节。然后,将ASC_BUF中的ASCII码的高4位清0,并用逻辑指令和移位指令将它们每两位拼在一起,成为压缩型BCD形式存入BCD_BUF(从低地址的第二个字节开始依次存放)。,例8-6压缩型BCD码的输入实例,南开大学朱耀庭,8.4.1BCD码的输入输出,例8-7压缩型BCD码的输出。题目:将内存缓冲区(BUF)中的压缩型BCD码在屏幕上显示输出。设计思路:假设十进制数字(压缩型BCD码)的低位放在低地址,因此输出时需要从高地址(高位)开始。因为压缩型BCD码是一个字节里存放两位十进制数字,所以将一个字节里的BCD码显示输出时需要将两位BCD码分离出来。方法是:用SHR指令将其右移4位,用OR指令拼上30H使之转换成ASCII码并显示出来;然后用AND指令将这个字节的低4位截取下来,拼上30H显示出来:,例8-7压缩型BCD码的输出,南开大学朱耀庭,8.4.1BCD码的输入输出,说明:若将一个8个字节长的十进制数字(16位)显示输出,用LOOP指令实现循环8次,则需用CX计循环次数。而用SHR指令右移4位时需要用CL计移位次数,这时就会将CX中循环的次数破坏掉。因此需要先将CX中的循环次数保存在一个存储器或寄存器字里(比如BX),然后再将移位次数4送至CL。在LOOP指令前再将BX的值送回CX,以恢复CX的内容。该程序执行后输出:9078008947500434,南开大学朱耀庭,8.4.2二进制数的输入输出,例8-8从键盘上输入十六进制数设计思路:从键盘上输入的都是字符,即ASCII码值,需要将其转换成十六进制的数,比如输入14A0,转换成十六进制数14A0H,存入一个字中。因此需要将09,AF的ASCII码转换成对应的十六进制数字。它们的对应关系如下:ASCII码:30H,31H,39H,41H,42H,46H十六进制数字:00H,01H,09H,0AH,0BH,0F由此可知:只要将0的ASCII码的高4位中的3去掉,就成为与其对应的十六进制数值了。而AF的ASCII码比与之对应的十六进制数值均大37H。因此从ASCII码中减去37H,剩下的就是相应的十六进制数值。,例8-8从键盘上输入十六进制数,南开大学朱耀庭,8.4.2二进制数的输入输出,例8-9从键盘上输入十进制数并将其化为二进制数(简称“十化二”输入)。设计思路:实现十化二输入的程序与十六进制数的输入程序极为相似,只需将输入的数字09的ASCII码转换成对应的数值送至AL。在把每一位十进制数拼在一起时,首先将字缓冲区的内容乘10,然后用算术加法指令ADD加上AX(AH=0)的内容。假设输入十进制数字以逗号,字符作为一个数的结果。例如,键入3456,或34,。,例8-9从键盘上输入十进制数并将其化为二进制数,南开大学朱耀庭,8.4.2二进制数的输入输出,例8-10二化十输出设计思路:假设把CX寄存器中的无符号整数进行二化十输出,则需要把CX中的数值转换成BCD码,也就是要检查CX中的二进制数包含有多少个10000(2710H),多少个1000(03E8H),多少个100(64H),多少个10(0AH),再把这些数以及剩下的个位数拼上30H,使之变成对应的ASCII码,一位一位地显示出来。,例8-10二化十输出,用这种方法进行二化十输出不一定是个好的程序设计方法,而将无符号二进制数用“除十取余”的方法化为十进制数可能更好些,南开大学朱耀庭,ThankYou!,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!