《80X86汇编语言程序设计第二章⑦.80868088指令系统(四)逻辑运算和移位指令.pdf》由会员分享,可在线阅读,更多相关《80X86汇编语言程序设计第二章⑦.80868088指令系统(四)逻辑运算和移位指令.pdf(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、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
2、未定义。某个操作数自己与自己相“与”,则值不变,但可使进位标志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)或操作指令
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(BL)=12H CF=0(4)异或操作指令XOR格式:XOR OPRD1,OPRD2相“异或”:两个操作数,
4、一个是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
5、格式: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
6、,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 Aritlu
7、netic Left 或 Shift Logic Left)算术左移和逻辑左移进行相同的动作,尽管为了方便提供有两个助记符,但只有一条机器指令。格式:SAL OPRD,mSHL 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,
8、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 暂存 2
9、XSHL 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对于有符号数和无符号数而言,算术右
10、移一位相当于除以2。如果最高有效位是0,那么右移之后,在左边添加的就是0;如果最高有效位是1,那么右移之后,在左边添加的就是1。(3)逻辑右移指令SHR(Shift logic Right)格式:SHR OPRD,m该指令使操作数右移m 位,同时每移一位,左边用0补足,移出的最低位进入标志位CF。对于无符号数而言,逻辑右移一位相当于除以2。在汇编语言程序设计中,经常需要对以位为单位的数据进行合并和分解处理。一般通过移位指令和逻辑运算指令进行这种数据的合并和分解处理。例如:假设DATA1 和 DATA2 各长 4位,分别存放在AL 寄存器的低 4位和高 4位中,现要把它们分别存放到BL 寄存器和
11、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 可以是通用寄
12、存器,可以是存储器操作数。前两条循环指令没有把进位标志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)例如:试分析下面的程序段完成什么功能:MOV CL,4SHL DX,CLMOV BL,AHSHL AX,CLSHR BL,CLOR DL,BL