前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >逻辑运算指令和移位指令

逻辑运算指令和移位指令

作者头像
全栈程序员站长
发布2022-08-31 17:56:36
1.1K0
发布2022-08-31 17:56:36
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

AND

XOR

TEST

SHL

SAL

ROL

RCL

OR

NOT

SHR

SAR

ROR

RCR

AND, OR , XOR 和 TEST都是双字节操作指令,操作数的寻址方式的规定与算术运算指令相同.

NOT是单字节操作指令,不允许使用立即数.

逻辑运算均是按位进行操作,真值表如下:

AND (位与&)

OR ( 位或| )

XOR ( 位异或^ )

1 & 1 = 1 1 & 0 = 0 0 & 1 = 0 0 & 0 = 0

1 | 1 = 1 1 | 0 = 1 0 | 1 = 1 0 | 0 = 0

1 ^ 1 = 0 1 ^ 0 = 1 0 ^ 1 = 1 0 ^ 0 = 0

A:逻辑运算指令

AND (and) 逻辑与指令

AND DST , SRC //Byte/Word

执行操作:dst = dst & src

1.AND指令执行后,将使CF=0,OF=0,AF位无定义,指令执行结果影响SF,ZF和PF标志位.

2.AND指令典型用法A:用于屏蔽某些位,即使某些位为0.

屏蔽AL的高4位:即将高4位和0000B相与,低4位和1111B相与

MOV AL , 39H //AL= 0011 1001B[39H]

ADD AL , 0FH // AL= 0000 1001B[09H] 即0011 1001B[39H] & 0000 1111B[0FH] = 0000 1001B[09H]

3.AND指令典型用法B:取出某一位的值(见TEST)

OR (or) 逻辑或指令

OR DST , SRC //Byte/Word

执行操作:dst = dst | src

1.OR指令执行后,将使CF=0, OF=0, AF位无定义,指令执行结果影响SF, ZF和PF标志位.

2.常用于将某些位置1.

将AL的第5位置1:

MOV AL , 4AH // AL=0100 1010B[4AH]

OR AL , 10H // AL=0101 1010B[5AH] 即0100 1010B[4AH] | 0001 0000B[10H] =0101 1010B [5AH]

XOR (eXclusive OR) 逻辑异或指令

XOR DST , SRC //Byte/Word

执行操作:dst = dst ^ src

1.XOR指令常用于使某个操作数清零,同时使CF=0,清除进位标志.

2.XOR指令使某些位维持不变则与 ‘0’ 相异或,若要使某些位取反则与 ‘1’相异或.

将AL的高4位维持不变,低4位取反:

MOV AL, B8H //AL=1011 1000B[B8H]

XOR AL, 0FH //AL=1011 0111B[B7H] 即1011 1000B[B8H] ^ 0000 1111[0FH]=1011 0111B[B7H]

测试某一个操作数是否与另一确定操作数相等:

XOR AX , 042EH

JZ …. //如果AX==042EH, 则ZF=TRUE(1), 执行JZ…

NOT (not) 逻辑非指令

NOT OPR //Byte/Word

执行操作:opr = ~opr // ~ 01100101 [65H] =10011010 [9AH]

1.操作数不能使用立即数或段寄存器操作数,可使用通用寄存器和各种方式寻址的存储器操作数.

2.NOT指令不影响任何标志位。

将AL各位取反:

MOV AL,65H //AL=0110 0101B[65H]

NOT AL //AL=1001 1010B[9AH] 即 ~ 0110 0101B[65H]=1001 1010B[9AH]

TEST (test) 指令

TEST OPR1 , OPR2 //Byte/Word

执行操作:opr1 & opr2

1.两个操作数相与的结果不保存,结果影响标志位PF,SF和ZF,使CF=0, OF=0,而AF位无定义.

2.TEST指令常用于在不改变原有的操作数的情况下,检测某一位或某几位的条件是否满足.只要令用来测试的操作数对应检测位为1,其余位为0,相与后判断零标志ZF值的真假.

检测某位是否为1:

令用来测试的操作数对应检测位为1,其余位为0,TEST指令后,若该位为1则 JNZ…

TEST AL , 0000 00001B //测试AL最低位是否为1:: 令用来测试的操作数对应检测位为1,其余位为0,执行TEST指令

JNZ THER //最低位若为1, 则ZF=FALSE(0), 执行JNZ THER, 否则执行下一条指令.

或者:先对操作数求反,令用来测试的操作数对应检测位为1,其余位为0,TEST指令后,若该位为1则JZ…

MOV DL , AL //将AL 传送到DL,主要是不要影响AL的值. 以下测试AL的b2位是否为1

NOT DL //先对操作数求反

TEST 0000 0100B //令用来测试的操作数对应检测位为1,其余位为0,执行TEST指令

JZ THER //若AL的b2位为1,则ZF=TRUE(1), 执行JZ THER

B:移位指令[所有的移位指令都影响标志位CF、OF、PF、SF和ZF.AF无定义.]

非循环逻辑移位:把操作数看成无符数来进行移位.

SHL ( SHift logical Left )逻辑左移指令

SHL OPR , CNT //Byte/Word

执行操作:使OPR左移CNT位,并使最低CNT位为全0.

1.OPR操作数不能使用立即数或段寄存器操作数,可使用通用寄存器和各种方式寻址的存储器操作数.

2.移位次数由CNT决定.每次将OPR的最高位移出并移到CF,最低位补0.

MOV CL , 7 //若移位多次, 先预置移位次数CL

SHL DX , CL //CNT可取1或CL寄存器操作数

SHR (SHift logical Right) 逻辑右移指令

SHR OPR , CNT //Byte/Word

同SHL,每次将OPR的最低位D0移出并移到CF.最高位补0.

非循环算术移位:将操作数看成有符号数来进行移位.

SAL (Shift Arithmetic Left) 算术左移指令

SAL OPR , CNT //Byte/Word

SAL指令与SHL指令完全相同

SAR(Shift Arithmetic Right) 算术右移指令

SAR OPR , CNT //Byte/Word

SAR指令每次移位时,将最高位移入次高位的同时最高位值不变,最低位D0移出并移到CF.

循环移位指令

ROL ( ROtate Left) 循环左移指令

ROL OPR , CNT //Byte/Word

每次移位时,最高位移出并同时移到CF和最低位D0.

ROR (ROtate Right)循环右移指令

ROR OPR,CNT //Byte/Word

每次移位时,最低位D0移出并同时移到CF和最高位.

带进位循环移位指令

RCL (Rotate Left through Carry)带进位循环左移指令

RCL OPR,CNT //Byte/Word

RCR (Rotate Right through Carry)带进位循环左移指令

RCR OPR ,CNT //Byte/Word

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/142796.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年5月2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档