汇编语言程序设计—IBMPC机的指令系统§3逻辑运算程序介绍逻辑运算指令的格式、功能和用法学习结合用逻辑运算指令来实现二进制数和BCD码的输入/输出问题§3.1逻辑运算指令概述一、逻辑运算指令逻辑运算指令是对字节或字中各位进行处理的指令。逻辑指令:NOT字节或字求反AND字节或字逻辑与OR字节或字逻辑或XOR字节或字逻辑异或TEST字节或字的测试移位指令:SHL字节或字的逻辑左移SAL字节或字的算术左移SHR字节或字的逻辑右移SAR字节或字算术右移循环移位指令:ROL字节或字的循环左移ROR字节或字的循环右移RCL字节或字通过进位循环左移RCR字节或字通过进位循环右移§3.2逻辑运算指令一、逻辑指令1.AND指令(逻辑与或逻辑乘)格式:AND目的操作数,源操作数功能:AND将两个操作数(字节或字)进行按位“逻辑与”运算,结果送回目的操作数影响状态标志位:CF=0,OF=0,PF、SF、ZF反映操作的结果;AF状态不定。说明:用AND指令可以将一个字节或字中的某些特定位清零,或者说将某些特定位截取下来。例如:将ASCⅡ码的高4位清零,亦即截取低4位,假设这个ASCⅡ码已在AL中,那么就可用指令:ANDAL,00001111B来完成。2.TEST指令(测试)§3.2逻辑运算指令格式:TEST目的操作数,源操作数功能:该指令对两个操作数进行逻辑与运算,但结果并不送至目的操作数。只是影响状态标志。该指令执行后两个操作数都不变。影响状态标志位:与AND指令相同。说明:这条指令常用来检测一些条件是否满足,但又不希望改变原有的操作数情况,即适用于检查一个字节或字中的某些特定位是否有一位为1。另外,也可以用TEST指令将CF清零例如:检查BL的低4位是否至少有一位为1,可以这样:TESTBL,0FHJEL…L:…§3.2逻辑运算指令3.OR指令(逻辑或又称逻辑加)格式:OR目的操作数,源操作数功能:OR指令将两个操作数进行按位逻辑加操作,并将结果送至目的操作数。影响状态标志位:与AND指令相同。说明:OR指令适用于对字节或字的特定位置数(拼数)例如:将AL高4位拼上3,可这样做:ORAL,30H4.XOR指令(逻辑异或又称按位加)格式:XOR目的操作数,源操作数功能:XOR指令将两个操作数进行按位逻辑异或操作,并将结果送至目的操作数。如果两个操作数中对应位相同(均为§3.2逻辑运算指令0或均为1),则结果该位为0;否则,结果该位为1影响状态标志位:与AND指令相同。说明:该指令适用于对一个数或一个数的特定位求反。例如:将AL寄存器中数01011100B求反,只要逻辑异或常数0FF即可。MOVAL,01011100BXORAL,0FFH注意:以上四个逻辑指令的两个操作数均可以是寄存器或存储器到寄存器或存储器(至少有一个寄存器),也可以由立即数到寄存器或存储器。5.NOT指令(逻辑非或求反码)格式:NOT目的操作数功能:NOT指令对目的操作数的每一位求反码,并将结果§3.2逻辑运算指令送至目的操作数。影响状态标志位:不改变状态标志。说明:该操作是从0FFH(对字节)或从0FFFFH(对字)中减去指定的操作数,并将结果送回目的操作数。该指令中只有目的操作数,目的操作数可以是通用寄存器也可以是存储器。二、移位指令1.SHL指令(逻辑左移)格式:SHL目的操作数,COUNT功能:SHL指令将目的操作数左移COUNT次(位)。最高位移入进位标志CF中去,而CF中原来的值被冲掉。移位后空出的最低位中填0。说明:目的操作数可以是通用寄存器,也可以是存储器。移位次数COUNT若为1,则可将1直接写在指令的COUNT处;若不§3.2逻辑运算指令为1,那么COUNT为寄存器CL的值。即事先将移位次数送至CL寄存器,而在指令中的COUNT处写上CL。影响状态标志位:OF位:当移位次数COUNT为1时,若移位后目的操作数的最高位与CF不同,则将OF置1;否则OF置0。对于带符号数来说,这用来表示移位后的符号位与移位前的符号位是否相同。若相同则OF置0表示没有产生超位结果(因每左移一位数值就扩大一倍)当COUNT不为1时,OF为不确定的值。PF、SF、ZF反映移位后的结果;AF总是不确定;CF中总是包含从目的操作数中称出的最后一位的值。2.SHR(逻辑右移)格式:与SHL指令相同。功能:将一个无符号数向右移位,左边(最高位)出现空§3.2逻辑运算指令位补0,右边(最低位)移至CF。影响状态标志位:CF、OF、PF、SF、ZF;AF不确定。以上两指令说明:SHL指令用来将一个无符号数向左移一位等于将数乘2。用SHL指令使数倍增比用乘法指令速度快的多。可以通过CF是否为0或OF是否为1,检查移位结果是否超位。即在移位指令后面跟上一体测试CF(或OF)的条件转移指令。SHR指令适用于将一个无符号数减半。右移位一位等于除以2。用SHR指令使减半比用除法指令速度要快得多。可通过右移一位后检查CF是否为0来检查数是否为偶数。若CF=1表明此数不是偶数。3.SAL指令(算术左移)格式:同SHL§3.2逻辑运算指令功能:与SHL相同,实际上SHL和SAL是同一条指令的两种助记符,它们执行的操作完全一样,它一般用于带符号数的倍增(乘2),对于带符号的数检查超位时只能测试OF。4.SAR指令(算术右移)格式:同SHL指令。功能:类似于SHR,SAR与SHR的区别在于:SHR是连同符号位一起右移,左边(最高位)出现的空位补0;而SAR右移时符号位保持不变,左边(数的最高位)出现的空位补上符号位的值。说明:该指令适用于将带符号位的数减半(除以2)值和值得注意的是:如果目的操作数为负时,且其中具有1的位数移出后,SAR指令产生的结果与用整数除IDIV指令产生的结果不一样。如:-5经SAR后得-3,而用IDIV后得-2。§3.2逻辑运算指令影响状态标志位:CF、OF、PF、SF、ZF对于移位指令小结:1.指令的目的操作数可以是通用寄存器,也可以是存储器2.指令的源操作数,是移位次数计数值操作数,一体指令可实现高达255次移位的操作。指令中的移位值可以指定为1,或指定为寄存器CL,CL中包含移位次数。3.在移位指令执行后,AF总是不确定的。通常影响SF、ZF和PF。CF中总是含有从目的操作数中称出的最后一位的值。4.在执行多位移位后,OF的内容不确定。对于1位的移位操作,如果操作数的最高位在执行后被改变,OF就置位;反之OF被清零。§3.2逻辑运算指令CF最高位最低位0SHL指令操作CF最高位最低位0SHR指令操作CF最高位最低位SAR指令操作§3.2逻辑运算指令三、循环移位指令1.ROL指令(循环左移)格式:ROL目的操作数,COUNT功能:每执行一次(每移1位),把目的操作数的最高位移到最低位,同时还把最高位移到CF。影响状态标志位:CF和OF;其它标志位没有影响。说明:当循环移位次数为1时,若循环左移以后操作数的最高位不等于CF,则将溢出标志OF置1;否则OF=0。可用来表示移位前后的符号是否改变。2.ROR指令(循环右移)格式:同ROL指令。功能:与ROL指令类似,只是目的操作数中的各位循环右移,而不是循环左移。§3.2逻辑运算指令3.RCL指令(带进位循环左移)格式:同ROL指令。功能:该指令对目的操作数(字节或字)中的各位循环左移,进位标志CF被看作目的操作数的“一部分”。每执行一次(每移1位),CF的值循环移入目的操作数的低位,而目的操作数的高位移入CF。4.RCR指令(带进位循环右移)格式:同ROL指令。功能:该指令与RCL指令类似,只是循环往右移,而不是左移。以上指令说明:循环移位与算术或逻辑移位指令不同,循环移位时移出操作数的位并不丢失而是循环送回操作数的另一端,移位的位数§3.2逻辑运算指令由计数值COUNT规定。循环移位指令因将称出的位移至CF,而且只要循环8位(对字节)或16位(对字)操作数就会恢复原状。故利用循环移位后测试CF的方法测试字节或字的某一位是0还是1。方法是利用循环移位指令将要测试的位移入CF,然后由测试CF的条件转移指令JC(CF=1时转移)或JNC(CF=0时转移)进行测试。如果再想恢复操作数的原值,只要继续循环移位8位或16位即可。RCL和RCR这两条带进位标志的循环移位指令将进位标志看作是操作数的扩展部分,这就允许CF作为一位信息移入操作数。利用这一点可实现多字节的数的移位。例如若有一个双字数,它们或是放在两个通用寄存器中(如DX和AX),或是放在连续的内存单元中。可这样实现四个字节整个左移1位:§3.2逻辑运算指令SHLAX,1或SHLFIRST_WORD,1RCLDX,1RCLSECOND_WORD,1CF高位低位目的操作数ROL指令操作CF高位低位目的操作数ROR指令操作CF高位低位目的操作数RCL指令操作CF高位低位目的操作数RCR指令操作§3.2逻辑运算指令四、举例1.非压缩型BCD码的输入/输出例EX3.2.1ASCⅡ码转换成非压缩BCD码例EX3.2.2非压缩BCD码转换成ASCⅡ码假设十进制数字低位存放在低地址字节,输出时应从高位开始依次显示出来。源程序示例源程序示例§3.2逻辑运算指令四、举例2.压缩型BCD码的输入/输出例EX3.2.3压缩型BCD码的输入例EX3.2.4压缩型BCD码的输出假设十进制数字低位存放在低地址字节,输出时应从高位开始依次显示出来。源程序示例源程序示例§4分支程序介绍比较和转移指令的格式、功能和用法学习结合用比较和转移指令来实现分支程序和多分支程序的编写方法§4.1标号一、标号的定义标号(过程名亦视为标号)用来说明可执行指令在汇编语言程序中的位置。标号可作为转移指令的操作数,其有三种属性:段(SEGMENT)、位移量(OFFSET)和距离(DISTANCE)段和位移量属性就是在哪个段中、什么位置上定义的标号。标号只要定义,这两个属性就自然产生。而距离属性有两种取值分别为NEAR(段内)和FAR(段间),需要在定义标号时指出1.定义距离属性为NEAR的标号①距离属性为NEAR的标号可以用隐含的说明,即在标号后面加上冒号,放在指令前面。如:L1:MOVAX,BX②距离属性为NEAR的标号也可以显示说明,即用LABEL伪指令明显地说明或在EQU伪指令中用THIS操作符明显地指明。§4.1标号如:L2LABELNEARMOVCX,5L3EQUTHISNEARANDAX,OFFH2.定义距离属性为FAR的标号FAR属性的标号没有隐式说明,只能用显式说明,即使用LABEL伪指令明显地说明或在EQU伪指令中用THIS操作符明显地指明。如:L4LABELFARMOVAX,DXL5EQUTHISFARORAL,30H§4.1标号3.同一条指令处可以定义两个距离属性不同的标号,以提高访问标号的灵活性。如:L6LABELFARL7:XORAX,0F0FH二、允许对标号进行操作的操作符1.SEG操作符格式:SEG标号名功能:返回标号所在段的基址。例如:MOVAX,SEGL2;将标号L2所在段的基址送AX2.OFFSET操作符格式:OFFSET标号名功能:返回标号在它所在段的位移量。§4.1标号例如:MOVBX,OFFSETL2;将标号L2所在段的位移量送至BX3.TYPE操作符格式:TYPE标号名功能:返回标号的距离属性值NEAR或FAR。§4.2比较和转移指令一、比较指令1.CMP指令(比较指令)格式:CMP目的操作数,源操作数功能:该指令是目的操作数减去源操作数,但其结果并不送回目的操作数,只是影响状态标志位。执行CMP指令后,两个操作数保持原值不变。具体格式如下:①累加器与立即数、通用寄存器和存储器相比较。如:CMPAL,100CMPAL,BLCMP,BL;同上一条指令§4.2比较和转移指令②通用寄存器与立即数、通用寄存器和存储器相比较如:CMPBX,0F43HCMPBX,DXCMPCX,COUNT[SI]③存储器操作数与立即数、通用寄存器相比较如:CMPBETA[BX][SI],100HCMPAR