2022年X汇编语言程序设计⑦.指令系统逻辑运算和移位指令[归 .pdf
80X86 汇编语言程序设计第二章 8086/8088 寻址方式和指令系统(四)逻辑运算和移位指令1.逻辑运算指令(1)否操作指令NOT格式 :NOT OPRD这条指令把操作数OPRD 取反,然后送回OPRD 。操作数 OPRD 可以是通用寄存器,也可以是存储器操作数,不能是立即数。此指令对标志位没有影响。例如 :MOV AL,03HNOT AL指令执行后: (AL )=0FCH(2)与操作指令AND格式 :AND OPRD1,OPRD2这条指令对两个操作数进行按位的逻辑“ 与” 运算,结果送到目的操作数OPRD1 。该指令执行以后,标志CF=0 ,标志 OF=0 ,标志 PF、ZF、SF 反映运算结果,标志AF 未定义。某个操作数自己与自己相“ 与” ,则值不变,但可使进位标志CF 清0。与操作指令主要用在使一个操作数中的若干位维持不变,而另外若干位清为0的场合。把要维持不变的这些位于“ 1” 相“ 与” ,而把要清为0的这些位于 “ 0” 相 “ 与” 就能达到这样的目的相“ 与” :两个操作数都是1的,结果为 1,其他情况全是0。例如 :MOV AL,23HMOV BL,02HAND AL,BL指令执行后: (AL )=02H(AL)=23H ,将 AL 寄存器的第一位和第三位清零,其余位不变,则BL 是什么时,与AL执行 AND 指令可完成?(BL)=F5HMOV AL,23HMOV BL,F5HAND AL,BL(3)或操作指令OR格式 :OR OPRD1,OPRD2这条指令执行以后,标志CF=0 ,标志 OF=0. ,标志 PF 、ZF 、SF 反映运算结果,标志AF 未定义。某个操作数自己与自己相“ 或” ,则值不变,但可使进位标志CF 清0。相“ 或” :两个操作数中有一个是1的,结果为 1,其他情况全是0。或操作指令主要用于在使一个操作数中的若干位维持不变,而另外若干位置为1的场合。把要维持不变的这些位于“ 0” 相“ 或” ,而把要置为 1的这些位与 “ 1” 相“ 或” 就能达到这样的目的。例如 :MOV BL,12HOR BL,BL名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - - (BL)=12H CF=0(4)异或操作指令XOR格式 :XOR OPRD1,OPRD2相“ 异或 ” :两个操作数,一个是0,一个是 1,则为 1;两个都为 1,则为 0;两个都为 0,则为 0。这条指令对两个操作数进行按位的逻辑“异或”运算,结果送到目的操作数OPRD1 。该指令执行以后,标志CF=0,标志 OF=0 ,标志 PF、ZF、SF反映运算结果,标志AF 未定义。 某个操作数自己与自己相 “ 异或 ” ,则结果为 0,并可使进位标志CF 清0。异或操作指令主要用于在使一个操作数中的若干位维持不变,而另外若干位置取反的场合。把要维持不变的这些位于“ 0” 相“ 异或 ” ,而把要取反的这些位与“ 1” 相“ 异或 ” 就能达到目的。例如 :MOV BL,56HXOR BL,BL指令执行后: (BL )=0 CF=0(5)测试指令TEST格式 :TEST OPRD1,OPRD2这条指令和指令AND 类似,也把两个操作数进行按位“ 与” ,但结果不送到操作数OPRD1 。该指令执行以后,标志ZF 、 PF 和 SF 反映运算结果,标志CF 和 OF 被清 0。该指令通常用于检测某些位是否为1,但又不希望改变原操作数值的场合。例如 : 要检查 AL中的位 6或位 2是否有一位为 1,可使用下面的指令:TEST AL,01000100B ;符号B 表示二进制(44H )如果位 6和位 2全为 0,那么在执行上面的指令后,ZF 被置 1,否则 ZF 被清 0。例如:要求屏蔽0、1两位,可用AND 指令并设置常数0FCH 。MOV AL,0BFHAND AL,0FCH这两条指令执行的结果使(AL )0BCH 所以 AND 指令可以使操作数的某些位被屏蔽。例如:要求第5位置 1,可用 OR 指令MOV AL,43HOR AL,20H这两条指令执行后, (AL )=63H ,所以用OR 指令可以使操作数的某些位置1,其它位则保持不变。例如 :要测试操作数的某位是否为1,则可先把该操作数求反然后用TEST指令测试。如要测试AL 寄存器中第二位是否为1,如为 1则转移到EXIT 去执行,可用下列指令序列:MOV DL,ALNOT DLTEST DL,00000100BJE EXIT2.一般移位指令(1)算术左移或逻辑左移指令SAL/SHL (Shift Aritlunetic Left 或 Shift Logic Left)算术左移和逻辑左移进行相同的动作,尽管为了方便提供有两个助记符,但只有一条机器指令。格式 :SAL OPRD,m名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - - - - - - SHL OPRD,m算术左移SAL (有符号数)/逻辑左移SHL (无符号数)指令把操作数OPRD左移 m,每移动一位,右边用0补足一位,移出的最高位进入标志位CF 。例如 :MOV AL,12H ;0001 0010BSHL AL,1 ;0010 0100B指令执行后(AL)=24H (相当于乘以2)MOV AL,8CH ;1000 1100BSHL AL,1 ;0001 1000B 指令执行后(AL)=18H , CF=1, PF=1, ZF=0 ,SF=0, OF=1溢出标志OF 是在移一位的时候有效,如果移动6位, 8位,多位就无效。MOV AL,8CH MOV CL,6SHL AL,CL指令执行后(AL)=0 ,CF=0 ,PF=1, ZF=1 ,SF=0, OF=0移位次数超过1的,一定要把移位次数放到CL 里面去。 只要左移以后的结果未超出一个字节或一个字的表达范围,那么每左移一次,原操作数每一位的权增加了一倍,也即相当于原数乘2。例如:实现把寄存器AL 中的内容(设为无符号数)乘10,结果存放在AX 中。XOR AH,AH ;(AH)=0 将 AH 清零SHL AL,1 ;2X ,设( AL)=X,并且左移一次MOV BX,AX ;送入 BX 暂存 2XSHL AX,1 ;4X 将 AX 左移一次SHL AX,1 ;8X 将 AX 再左移一次ADD AX,BX ;8X+2X(2)算术右移指令SAR ( Shift Arithmetic Right)格式 :SAR OPRD,m该指令使操作数右移m 位,同时每移一位,左边的符号位保持不变,移出的最低位进入标志位CF 。例如 :MOV CL,5SAR DI,CL如指令执行前: (DS )=0F800H, (DI)=180AH, ( 0F980A )=0064H0000 0000 0110 0100B0000 0000 0000 0011B如指令执行后: (0F980A ) =0003H ,CF=0对于有符号数和无符号数而言,算术右移一位相当于除以2。如果最高有效位是0,那么右移之后,在左边添加的就是0;如果最高有效位是1,那么右移之后,在左边添加的就是1。(3)逻辑右移指令SHR (Shift logic Right)格式 :SHR OPRD,m该指令使操作数右移m 位,同时每移一位,左边用0补足,移出的最低位进入标志位CF 。对于无符号数而言,逻辑右移一位相当于除以2。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 5 页 - - - - - - - - - 在汇编语言程序设计中,经常需要对以位为单位的数据进行合并和分解处理。一般通过移位指令和逻辑运算指令进行这种数据的合并和分解处理。例如:假设DATA1 和 DATA2 各长 4位,分别存放在AL 寄存器的低 4位和高 4位中,现要把它们分别存放到BL 寄存器和BH 寄存器的低 4位中。MOV BL,AL ;使( BL ) =ALAND BL,0FH ;将 BL 与0F 相与MOV BH,AL ;使( BH)=ALMOV CL,4 ;规定移位次数(CL)=4SHR BH,CL ;将 BH 逻辑右移 4位3.循环移位指令8086/8088 有 4条循环移位指令,这些指令可以一次只移一位,也可以一次移多位。如移多位,那么移位次数存放在CL 寄存器中 。这些指令的格式如下:ROL OPRD,m 循环左移ROR OPRD,m 循环右移RCL OPRD,m 带进位的循环左移RCR OPRD,m 带进位的循环右移其中, m 是移位次数,或为1或为 CL 。操作数 OPRD 可以是通用寄存器,可以是存储器操作数。前两条循环指令没有把进位标志CF 包含在循环的环中;后两条循环指令把进位标志CF 包含在循环的环中,即作为整个循环的一部分。这些指令只影响标志CF 和 OF。对于不带进位的循环移位指令而言,如果操作数是8位后,操作数就能复原;如果操作是 16位后,操作数就能复原。对于带进位的循环移位指令而言,如果操作数是8位,那么在移位9次后,操作数就能复原;如果操作是16位,那么在移位17次后,操作数就能复原。例如 :MOV CL,9RCR AL,CL指令执行前(AL)=23H0010 00110010 0011指令执行后(AL)=23H通过带进位循环移位指令和其他移位指令的结合,可以实现两个或多个操作数的重新结合。例如:实现把AL 的高 4位与低 4位交换。ROL AL,4ROR AL,4RCL AL,5RCR AL,5例如:把AL 的最低位送入BL 的最低位,保持AL 不变:例如:(AX )=0012H , (BX )=0034H ,要求把它们装配在一起形成(AX)=1234HMOV CL,8ROL AX,CLXOR AX,BX (OR AX,BX )名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 5 页 - - - - - - - - - 例如:试分析下面的程序段完成什么功能:MOV CL,4SHL DX,CLMOV BL,AHSHL AX,CLSHR BL,CLOR DL,BL名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -